FastReport Tipps und Tricks: Unterschied zwischen den Versionen
(→Gruppenkopf auf jeder Seite unterdrücken, wenn keine Daten mehr kommen) |
(→Gruppenkopf auf jeder Seite unterdrücken, wenn keine Daten mehr kommen) |
||
Zeile 73: | Zeile 73: | ||
end; | end; | ||
− | Dieses Code wird ausgeführt, '''nachdem''' die Detail-Positionen gedruckt wurden. | + | Dieses Code wird ausgeführt, '''nachdem''' die Detail-Positionen gedruckt wurden. |
− | Im Code wird das DataSet der DetailPositionen abgefragt. Das DataSet wurde beim Anlegen des Bandes festgelegt und hier angezeigt: | + | Im Code wird das '''DataSet der DetailPositionen''' abgefragt. Das DataSet wurde beim Anlegen des Bandes festgelegt und hier angezeigt: |
[[Datei:FastReport_Auftragssformular_Struktur_Positionen_DataSet.png]] | [[Datei:FastReport_Auftragssformular_Struktur_Positionen_DataSet.png]] |
Version vom 21. Dezember 2015, 23:39 Uhr
Inhaltsverzeichnis
- 1 Allgemeines
- 1.1 Anzahl der Datensätze
- 1.2 Farbe eines Bandes abwechselnd grau/weiß
- 1.3 Gruppenkopf auf jeder Seite unterdrücken, wenn keine Daten mehr kommen
- 1.4 Datumsfeld unterdrücken, wenn kein Datum drin steht
- 1.5 Berechnungen in einem Feld
- 1.6 Report-Zusammenfassung am Ende der Seite
- 1.7 Manueller Seitenwechsel im Code
- 1.8 Fehlermeldung "Alternativ nicht gefunden" in Rechnung
- 2 Export PDF
- 3 Links
1 Allgemeines
Dieser Artikel beschreibt kleine Tipps und Tricks für das Erstellen von Reports mit FastReport, die im Alltag hilfreich sein können.
1.1 Anzahl der Datensätze
Manchmal hat man das Problem, dass bestimmte Bereiche unterdrückt werden sollen, wenn es nur einen einzigen Datensatz gibt. Beispielsweise hat man ein Mahnungsformular mit der Tabelle der fälligen Rechnungen und darunter die Gesamtsumme. Die Gesamtsumme soll aber unterdrückt werden, wenn es nur eine angemahnte Rechnung in der Tabelle gibt. Dann kann im Objektinspektor des Bereich auf das Ereignis
OnBeforePrint
doppelklicken und diesen Code schreiben:
procedure Child2OnBeforePrint(Sender: TfrxComponent); begin // Band mit der Gesamtsumme unterdrücken, wenn es nur EINE Rechnung gibt: if <Line#> = 1 then Child2.Visible := False else Child2.Visible := True; end;
Die System-Variable <Line#> beihaltet die Anzahl der Zeilen (Datensätze) des Detail-Bandes.
1.2 Farbe eines Bandes abwechselnd grau/weiß
Wenn man die Farbe eines Bandes (z.B. den Detail-Bereich, also die Positionen eines Auftrags) abwechselnd grau/weiß hinterlegen will, muss man ein bisschen in die Trickkiste greifen. Im OnBeforePrint-Ereignis des Bandes schreibt man diesen Code:
procedure DetailPositionenOnBeforePrint(Sender: TfrxComponent); begin // Dieser Code wird ausgeführt, BEVOR das Positionen-Detail-Band ausgegeben wird. // Farbe abwechselnd weiß/grau: if <Line> mod 2 = 1 then // Bei jeder GERAD-STELLIGEN Zeile! begin TfrxBrushFill(DetailPositionen.Fill).BackColor := cl3dLight; TfrxBrushFill(ChildDetailPositionen.Fill).BackColor := cl3dLight; end else begin TfrxBrushFill(DetailPositionen.Fill).BackColor := clNone; TfrxBrushFill(ChildDetailPositionen.Fill).BackColor := clNone; end; end;
Der erste Trick ist die Zeile
if <Line> mod 2 = 1 then // Bei jeder GERAD-STELLIGEN Zeile!
<Line> ist eine System-Variable, die eine fortlaufende Zeilennummer (Datensatz-Nummer) zurückgibt, die FastReport einfach hochzählt. Der erste Datensatz hat einfach die Zeilennummer 1, der nächste 2 usw.
mod 2 ist eine Division und bringt den Rest der Divison zurück.
1.3 Gruppenkopf auf jeder Seite unterdrücken, wenn keine Daten mehr kommen
Man kann den Gruppenkopf einer Gruppe ganz gut dazu benutzen, eine Überschrift über die Positionen zu drucken, die auch auf jeder Seite wiederholt wird.
- Siehe das Beispiel in FastReport Beispiel Auftragsformular Struktur der Positionen.
Es kann nun aber vorkommen, dass die Positionen gerade an Ende einer Seite aufhören und auf der nächsten Seite trotzdem noch die Überschrift dazu gedruckt wird. Das sieht unschön aus.
Um das zu verhindern, klickt man in das Ereignis OnAfterPrint vom Detail-Bereich und gibt folgenden Code ein:
procedure DetailPositionenOnAfterPrint(Sender: TfrxComponent); begin // Überschriftszeile unterdrücken, wenn keine Positionen mehr kommen: if DetailPositionen.DataSet.EOF then ChildHeaderPositionen.Visible := False else ChildHeaderPositionen.Visible := True; end;
Dieses Code wird ausgeführt, nachdem die Detail-Positionen gedruckt wurden.
Im Code wird das DataSet der DetailPositionen abgefragt. Das DataSet wurde beim Anlegen des Bandes festgelegt und hier angezeigt:
- Hinweis
- Als DataSet bezeichnet FastReport die Tabellen der Datenbank. Warum heißt es dann nicht Tabellen? Die Antwort ist einfach: Weil FastReport nicht weiß, ob die Daten direkt aus einer Datenbank-Tabelle kommen oder aus einer komplexen Abfrage, bei der Daten aus mehreren Tabellen in einer Abfrage zusammengenommen werden.
- Beispiel
- Das DataSet Positionen im Auftragsformular kommt aus einer Datenbank-Abfrage, in der die Auftragspositionen, Artikeldaten, berechnete Felder (wie z.B. Gewichte) zusammen "gemischt" wurden und als Positionen zur Verfügung gestellt werden.
Ganz einfach, wenn man weiß, wie's geht!
1.4 Datumsfeld unterdrücken, wenn kein Datum drin steht
Wenn man ein Datumsfeld im Report hat, steht dort je nach Formatierung "0" oder "30.12.1899" drin, wenn es gar kein Datum gibt. Behelfen könnte man sich, indem man das Feld im Code OnBeforePrint unterdrückt, wenn kein Datum drin steht. Einfacher ist es aber, auf dem Feld mit der rechten Maustaste zu klicken und die Option Nullen verbergen einzuschalten!
Wenn man einen Rahmen um das Feld angegeben hat, weil man die Daten tabellarisch anzeigen möchte, so fehlt in diesem Fall das Feld und auch der Rahmen. Um diese "Zahnlücke" zu füllen, kann man ein leeres Textfeld über oder unter das Datumsfeld setzen, das genauso groß ist und die Lücke füllt, falls das Datumsfeld ausgeblendet wird.
1.5 Berechnungen in einem Feld
Wenn man in einem Feld etwas berechnen möchte, muss man dazu keine Formel oder Variable verwenden wie in CrystalReports©! Man kann die Rechenformel einfach in das Feld schreiben.
Beispiel:
In einer Ladeliste möchte man eine Spalte haben mit der Auftragsmenge zzgl. der Reserve-Mengte, abzgl. der Fremdmenge, also die zu ladende eigene Menge. Dazu zieht man man einfach ein Textfeld in das entsprechende Detail-Band und stellt die Formel zusammen:
[<Positionen."Menge"> + <Positionen."MengeReserve"> - <Positionen."MengeFremd">]
Die Feldnamen kann man mit diesem Button holen:
Die eckigen Klammern
[ ... ]
legen den Anfang und das Ende der Formel fest.
1.6 Report-Zusammenfassung am Ende der Seite
Wenn man die Report-Zusammenfassung (Report Summary) am Ende der Seite drucken will, muss man im Ereignis ReportSummary1OnBeforePrint diesen Code einfügen:
procedure ReportSummary1OnBeforePrint(Sender: TfrxComponent); begin Engine.CurY := Engine.CurY + Engine.FreeSpace - ReportSummary1.Height - 1; end;
1.7 Manueller Seitenwechsel im Code
Wenn man im Report einen manuellen Seitenwechsel anhand eines Kennzeichens erzeugen will, muss man im Ereignis OnBeforePrint des gewünschten Bandes diesen Code einfügen:
procedure GroupHeader1OnBeforePrint(Sender: TfrxComponent); begin // Dieser Code wird ausgeführt, BEVOR das Positionen-Gruppenkopf-Band (die Kapitel-Überschrift) ausgegeben wird. // Wenn das Kennzeichen "Seitenwechsel Vorher" gesetzt ist: if <Positionen."Seitenwechsel_0Nein_1Vorher_2Nachher"> = 1 then Engine.NewPage; // Neue Seite, Seitenkopf usw. drucken end; procedure DetailPositionenOnBeforePrint(Sender: TfrxComponent); begin // Dieser Code wird ausgeführt, BEVOR das Positionen-Detail-Band ausgegeben wird. // Kapitel-Position ausblenden: if <Positionen."PosNr"> = 0 then begin DetailPositionen.Visible := False; end else DetailPositionen.Visible := True; // Wenn das Kennzeichen "Seitenwechsel Vorher" gesetzt ist: if <Positionen."PosNr"> > 0 then // NICHT bei Kapitel-Position, das wird da schon gemacht! if <Positionen."Seitenwechsel_0Nein_1Vorher_2Nachher"> = 1 then Engine.NewPage; // Neue Seite, Seitenkopf usw. drucken end;
Das Feld, mit dem die Seitenwechsel-Option gespeichert wird, heißt übrigens wirklich Seitenwechsel_0Nein_1Vorher_2Nachher. Das ist zwar ungewöhnlich, zeigt aber schon im Feldnamen, welche Optionen es gibt. Ungewöhnlich aber praktisch!
1.8 Fehlermeldung "Alternativ nicht gefunden" in Rechnung
Wenn Sie einen als Auftragsformular erstellten Report kopieren und als Rechungsformular (-Grundlage) verwenden wollen, erhalten Sie eine Fehlermeldung wie diese:
Grund:
In Rechnungen gibt es kein Alternativ.
Lösung:
Entfernen Sie mit dem Report-Designer alle Verweise auf das Alternativ-Feld!
2 Export PDF
Reports können auch im Format PDF/Aexportiert werden.