LazReport und IF?

Rund um die LCL und andere Komponenten

LazReport und IF?

Beitragvon TT73GP7 » 29. Apr 2017, 20:23 LazReport und IF?

Hallo zusammen,

ich fummle mich grade durch einen RechnungsReport (naja ich versuche es)

eigentlich sieht alles super aus nur ich bekomme es nicht das er entweder Strasse Hausnummer ausdruckt
oder wenn gefüllt halt das Postfach

Code: Alles auswählen
 
If [[ZRechnungKopf."Postfach"]<> '']  then Text := Postfach: [ZRechnungKopf."Postfach"];
else Text := [ZRechnungKopf."Strasse"]  [ZRechnungKopf."Hausnummer"];
 


laut Doku soll das so gehen
was mache ich da falsch

Viele Grüße
Igor
:)
TT73GP7
 
Beiträge: 226
Registriert: 29. Mär 2016, 19:45

Beitragvon wp_xyz » 30. Apr 2017, 11:41 Re: LazReport und IF?

Ich habe mit LazReport noch nichts gemacht und sollte daher eigentlich nicht antworten. Aber diese Anweisung sieht so seltsam aus, dass ich meine, da könnte etwas falsch sein. Pascal-Code ist das sicher nicht, denn da müssten die Strings mit Hochkommas umgeben sein, und die IF-Bedingung wäre mit runden Klammern zu versehen, nicht mit eckigen, und vor "else" dürfte kein Strichpunkt sehen. In welcher Dokumentation und wo genau steht denn, dass das so geht? Und wo/wie wird dieser Code aufgerufen?
wp_xyz
 
Beiträge: 2670
Registriert: 8. Apr 2011, 08:01

Beitragvon TT73GP7 » 30. Apr 2017, 20:27 Re: LazReport und IF?

na die Reporte werden in soeinen Generatur erstellt

ich glaube das hat auch nix mit Pascal in diesen Reporten zutun
aber das mit dem Eckigen klammern ist mir auch schon sehr negativ aufgestossen

aber das steht hier so
http://wiki.freepascal.org/LazReport_Do ... ion#Script

das ist zum Mäusemelken
TT73GP7
 
Beiträge: 226
Registriert: 29. Mär 2016, 19:45

Beitragvon Michl » 30. Apr 2017, 21:45 Re: LazReport und IF?

Eine Antwort habe ich jetzt auch nicht auf deine Frage, da ich mir keine Report entsprechend deiner Variablen nachbaue. Warum nutzt du aber nicht einfach Variablen, die du dem Report zufügst und per Pascal Code zuweist (im Event Report.OnGetValue)?

PS: Ich selber füttere mir eine eigens für den Report erstellte Query einer Datenbank mit allen Variablen und lese nur aus dieser die Daten für den Report aus. Das ist zwar mit etwas Aufwand verbunden, doch habe ich damit gleich ein relativ manipulationssicheres Backup.
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2260
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon TT73GP7 » 1. Mai 2017, 07:30 Re: LazReport und IF?

hmm

verstehe ich noch nicht ganz
also den Adresskopf in der Software zur laufzeit zusammen bauen und dann per Variable an den Report übergeben?

das müsste ich mal ausprobieren
TT73GP7
 
Beiträge: 226
Registriert: 29. Mär 2016, 19:45

Beitragvon gladio » 1. Mai 2017, 16:53 Re: LazReport und IF?

Du kannst dir eine globale Variable, z.B. in deinem Datenmodul anlegen.
Diese belegst du dann vor dem Aufruf des Reports entsprechend mit dem Postfach oder der Straße.
Im Report muß ebenfalls eine Variable angelegt werden. Die kann dann als Feld ins Formular wie ein Datenfeld eingfügt werden.
Lege in der Unit, aus der der Report aufgerufen wird eine Prozedur an, die den Inhalt der Variablen an den Report übergibt. Dazu frReport mit rechter Maustaste anklicken, im Objektinspektor den Reiter 'Ereignisse' auswählen und dort 'OnGetValue' doppelklicken. In der Procedure könnte dann folgender Konstrukt stehen:
Code: Alles auswählen
if ParName := 'VariablennameImReport' then ParValue := 'PostfachOderStrasse';
gladio
 
Beiträge: 95
Registriert: 21. Jun 2014, 05:15
Wohnort: Insel Rügen
OS, Lazarus, FPC: Win7/10-32/64 - Laz 1.8 Standard-Edition | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon TT73GP7 » 3. Mai 2017, 12:40 Re: LazReport und IF?

hmm kann ich die Variablen nur bei OnGetValue aufrufen?

ich würde die Variablen lieber befüllen wenn ich den Report mit "ShowReport" aufrufe
geht das?
TT73GP7
 
Beiträge: 226
Registriert: 29. Mär 2016, 19:45

Beitragvon TT73GP7 » 3. Mai 2017, 13:11 Re: LazReport und IF?

das Traurige ist

wenn ich es so aufrufe:
Code: Alles auswählen
 
 
procedure TfrmSQLPrint.LRRechnungGetValue(const ParName: String;
  var ParValue: Variant);
 
begin
  if ParName = 'Kopf' then
   ParValue:= 'Test1' ;
end
 
 


geht es

aber so nicht:

Code: Alles auswählen
 
  frmSQLPrint.LRRechnung.LoadFromFile('C:\Reporte\Rechnung.lrf');
  frmSQLPrint.LRRechnung.Values.FindVariable('Kopf').Field := 'test2';
  frmSQLPrint.LRRechnung.ShowReport
 


aber laut der Doku (die mal etwas verständlicher sein könnte) sollte das aber so gehen :(
die Variable Kopf bleibt einfach leer

bin grade soein bissel am verzweifeln
TT73GP7
 
Beiträge: 226
Registriert: 29. Mär 2016, 19:45

Beitragvon gladio » 3. Mai 2017, 13:32 Re: LazReport und IF?

Ich habe das z.B. in einigen Projekten so:
Auf einem Formular liegt die Report-Komponente und die benötigten Querys und Datasets, nichts anderes. Dieses Formular wird aber für den Nutzer niemals sichtbar.
Die Procedure OnGetValue liegt in der Unit dieses Reportformulars. Da werden diverse Variablen mit Werten 'bestückt'.
ShowReport habe ich in die FormShow-Procedure (FormCreate sollte auch gehen) für das Formular geschrieben.
Aufgerufen wird der Report über einen Button aus der Anwednung oder aus dem Menü der Anwednung.
Anwender drückt den Button, Reportformular wird erzeugt, Querys und Variablen vorbereitet und Report angezeigt.
Sicher geht das auch ohne ein extra Report-Formular.
OnGetValue muß wohl auf jeden Fall in der Unit stehen, in deren Formular die Reportkomponente abgelegt ist.
gladio
 
Beiträge: 95
Registriert: 21. Jun 2014, 05:15
Wohnort: Insel Rügen
OS, Lazarus, FPC: Win7/10-32/64 - Laz 1.8 Standard-Edition | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon gladio » 3. Mai 2017, 13:47 Re: LazReport und IF?

Ich kopiere mal ein paar Quelltextfrakmente, eventuell besser zu verstehen:

Im Create bereite ich einige Querys vor:
Code: Alles auswählen
procedure TTagesreport.FormCreate(Sender: TObject);
begin
  if RNr = 1 then // Parameter für Tagesbericht übergeben
  begin
    ZEinnahmenQuery.Close;
    ZEinnahmenQuery.SQL.Text := 'select * from Kassenbuch '
                         +'where (Datum >= :VonDatum) '
                         +'and (Datum <= :BisDatum) '
                         +'and (Einnahme <> 0) '
                         +'order by ID' ;
    ZEinnahmenQuery.ParamByName('VonDatum').AsDate := VonDatum;
    ZEinnahmenQuery.ParamByName('BisDatum').AsDate := BisDatum;
    ZEinnahmenQuery.ExecSQL;
    ZEinnahmenQuery.Open;
.....
end


dann weiter
Code: Alles auswählen
procedure TTagesreport.FormShow(Sender: TObject);
begin
  if RNr = 1 then  // 1 = Tagesreport
  begin
    // lade den Report TReport aus dem Applikationsverzeichnis und zeige ihn an
 
    frReport1.LoadFromFile(ExtractFilePath(Application.ExeName)+'TReport.lrf');
    frReport1.ShowReport;
  end
....
end;


und in der gleichen Unit:
Code: Alles auswählen
procedure TTagesreport.frReport1GetValue(const ParName: String;
  var ParValue: Variant);
var x: integer;
begin
  if RNr = 1 then
  begin
    x:=1;
    while not DataModule2.ZQuery1460.Locate('Datum',Arbeitsdatum-x,[]) do
    inc(x);
    if ParName='Anfangssaldo' then
      ParValue:=FormatFloat('0.00',(DataModule2.ZQuery1460Saldo.Value));
    if ParName='AnzeigeDatum' then
      ParValue:=DateToStr(Arbeitsdatum);
    if ParName='Endsaldo' then
      ParValue:=FormatFloat('0.00',(Saldo));
  end; //RNr=1
...
end;
gladio
 
Beiträge: 95
Registriert: 21. Jun 2014, 05:15
Wohnort: Insel Rügen
OS, Lazarus, FPC: Win7/10-32/64 - Laz 1.8 Standard-Edition | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon TT73GP7 » 3. Mai 2017, 13:56 Re: LazReport und IF?

hach schwere geburt

nun habe ich das prinzip verstanden :)
TT73GP7
 
Beiträge: 226
Registriert: 29. Mär 2016, 19:45

Beitragvon af0815 » 3. Mai 2017, 15:18 Re: LazReport und IF?

BTW: So kann man den Report als Resource hinterlegen und wird für den Benutzer nicht sichtbar. Braucht auch somit nicht mit der App extra weitergegeben werden.

Code: Alles auswählen
procedure TMyFrame.BT_Print_DetailClick(Sender: TObject);
var
  Stream: TResourceStream;
  ResType: TResourceType;
  ResName: String;
begin
  ResType := RT_RCDATA;
  if ResType = nil then Exit;
  ResName := 'A_RESOURCENNAME';
  Stream := TResourceStream.Create(HINSTANCE, ResName, ResType);
  try
    Report_A.LoadFromXMLStream(Stream);
  finally
    Stream.Free;
  end;
  Report_AU493_Trace.PrepareReport;
  case FShowReportMode of
    1 : Report_A.ShowReport;
    2 : Report_A.DesignReport;
  else
    Report_A.PrintPreparedReport('',1)
  end;
end;
 


Man kann das natürlich auch mit Treiber-Dlls etc. machen. Die Anwendung wird zwar größer, das kümmert aber heutzutage keinen. Ausserdem gibts kein Probleme, wenn die App mal verschoben wird und auf die Berichte etc. vergessen wird.

In Lazarus einfach in den Einstellungen als Resource dazubinden.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
af0815
 
Beiträge: 3490
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

• Themenende •

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried