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
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?
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.
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:
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.
procedure TTagesreport.FormShow(Sender: TObject); begin if RNr =1then// 1 = Tagesreport begin // lade den Report TReport aus dem Applikationsverzeichnis und zeige ihn an
procedure TTagesreport.frReport1GetValue(const ParName:String; var ParValue: Variant); var x: integer; begin if RNr =1then begin x:=1; whilenot 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;
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.
procedure TMyFrame.BT_Print_DetailClick(Sender: TObject); var Stream: TResourceStream; ResType: TResourceType; ResName:String; begin ResType := RT_RCDATA; if ResType =nilthenExit; 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).