LazReport und IF?

Rund um die LCL und andere Komponenten
Antworten
TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

LazReport und IF?

Beitrag von TT73GP7 »

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
:)

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: LazReport und IF?

Beitrag von wp_xyz »

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?

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: LazReport und IF?

Beitrag von TT73GP7 »

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

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: LazReport und IF?

Beitrag von Michl »

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; 

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: LazReport und IF?

Beitrag von TT73GP7 »

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

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: LazReport und IF?

Beitrag von gladio »

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';

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: LazReport und IF?

Beitrag von TT73GP7 »

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: 238
Registriert: Di 29. Mär 2016, 20:45

Re: LazReport und IF?

Beitrag von TT73GP7 »

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

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: LazReport und IF?

Beitrag von gladio »

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.

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: LazReport und IF?

Beitrag von gladio »

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;

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: LazReport und IF?

Beitrag von TT73GP7 »

hach schwere geburt

nun habe ich das prinzip verstanden :)

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: LazReport und IF?

Beitrag von af0815 »

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).

Antworten