FastReport Tipps und Tricks: Bänder
Inhaltsverzeichnis
- 1 Bänder
- 1.1 Kapitel-Positionen zusammenhalten
- 1.2 Band per Code unterdrücken
- 1.3 Kapitel unterdrücken wenn alle Positionen ausgegeben sind
- 1.4 Positionen unterdrücken wenn Kapitel auf "Nicht drucken" steht
- 1.5 Alle Positionen unterdrücken, wenn Kapitel nicht gedruckt werden soll
- 1.6 Band dehnen
- 1.7 Saubere Linien um Bänder, auch wenn Child-Band unterdrückt wird
- 1.8 Details-Band wird nicht gedruckt wenn SubdetailData leer
- 1.9 Warum die Sub-Details ganz unten stehen
- 1.10 Band unterdrücken wenn nicht Anfrage/Angebot
- 2 Links
1 Bänder
1.1 Kapitel-Positionen zusammenhalten
Es kann vorkommen, dass auf die Seite nur noch die Kapitel-Überschrift passt und keine Position mehr. Beispiel:
Um das zu verhinden, setzt man die Option:
Nachher:
1.2 Band per Code unterdrücken
Im Prinzip kann man ein Band ganz einfach im Code unterdrücken, indem man eine Formel schreibt, die unter bestimmten Umständen die Eigenschaft Visible (=sichtbar) auf False (falsch, nein) stellt. Beispiel:
// Kapitel-Position ausblenden: if <Positionen."PosNr"> = 0 then // Wenn es eine Kapitel-Position ist! begin DetailPositionen.Visible := False; end;
oder kürzer:
if <Positionen."PosNr"> = 0 then // Wenn es eine Kapitel-Position ist! DetailPositionen.Visible := False;
Im Detail-Bereich (z.B. bei Auftrags-Positionen), der ja mehrfach wiederholt wird, würde sich dieses Unsichtbar schalten aber auf alle folgenden Detail-Daten auswirken! Ab dem Moment würden die restlichen Position nicht mehr erscheinen! Also muss man im Code festlegen, was sonst ("else") passieren soll, wenn die Bedingung nicht erfüllt ist. Das könnte dann so aussehen:
// Kapitel-Position ausblenden: if <Positionen."PosNr"> = 0 then // Wenn es eine Kapitel-Position ist! begin DetailPositionen.Visible := False; end else // Wenn es KEINE Kapitel-Position ist! DetailPositionen.Visible := True;
Etwas schwieriger wird es, wenn es mehrere Abfragen im Code gibt, die das Visible für das Band ein- oder ausschalten. Dieser Artikel beschreibt, wie man da am Besten vorgeht.
- Postionen-Band unterdrücken, wenn Kapitel-Überschrift unterdrückt ist
Man kann Positionen auch unterdrücken, wenn die Kapitel-Überschrift das Kennzeichen "Nicht drucken" hat. Beispiele:
Überschriften-Band ("GroupHeader1"):
procedure GroupHeader1OnBeforePrint(Sender: TfrxComponent); begin // Dieser Code wird ausgeführt, BEVOR das Positionen-Gruppenkopf-Band (die Kapitel-Überschrift) ausgegeben wird. // Wenn das Druck-Kennzeichen auf "nicht drucken" steht: Ausblenden: //JC//160214// if <Positionen."DruckKennzeichen_0Nicht_1Normal_2_MitBez_3NurKap_4OhneText"> = 0 then begin GroupHeader1.Visible := False; exit; end else GroupHeader1.Visible := True; ...
Positionen-Band:
procedure DetailPositionenOnBeforePrint(Sender: TfrxComponent); begin // Dieser Code wird ausgeführt, BEVOR das Positionen-Detail-Band ausgegeben wird. // Grundstellung: Band ist sichtbar! Weiter unten wird es u.U. wieder ausgeschaltet! DetailPositionen.Visible := True; // Kapitel-Position ausblenden: if <Positionen."PosNr"> = 0 then begin DetailPositionen.Visible := False; exit; end; // Wenn das Druck-Kennzeichen auf "nicht drucken" steht: Ausblenden: //JC//160214// if <Positionen."DruckKennzeichen_0Nicht_1Normal_2_MitBez_3NurKap_4OhneText"> = 0 then begin DetailPositionen.Visible := False; exit; end; // Wenn das Druck-Kennzeichen des KAPITELS (X.0) auf "nicht drucken" steht: Ausblenden! if <Positionen."KapitelDruckKennz"> = 0 then begin DetailPositionen.Visible := False; exit; end;
- Hinweis: Diese Möglichkeit steht ab Release 171025 zur Verfügung!
1.3 Kapitel unterdrücken wenn alle Positionen ausgegeben sind
Manchmal gibt es in der Auftragsverwaltung Aufträge, die den verschiedenen Teilmengen entsprechen, die gefertigt und ausgeliefert werden. Die Positionen, die vollständig ausgeliefert wurden, werden unterdrückt. Allerdings kommen die Kapitel-Überschriften noch, obwohl alle folgenden Positionen des Kapitels vollständig ausgegeben sind. Mit Hilfe eine berechneten Feldes kann man die Kapitel-Überschrift in diesem Fall unterdrücken.
Einzelheiten werden in FastReport: Kapitel unterdrücken wenn alle Positionen ausgegeben sind beschrieben.
1.4 Positionen unterdrücken wenn Kapitel auf "Nicht drucken" steht
Manchmal will man ein ganzes Kapitel mit allen Positionen unterdrücken. Dazu kann man in der Auftragsverwaltung in den Positionen das Druckkennzeichen auf "Nicht drucken" setzen und im Report die folgenden Positionen des Kapitels unterdrücken:
Im Ereignis...
procedure DetailPositionenOnBeforePrint(Sender: TfrxComponent); begin // Dieser Code wird ausgeführt, BEVOR das Positionen-Detail-Band // ausgegeben wird.
...kann diesen Code einfügen:
// Wenn das ganze Kapitel nicht gedruckt werden soll: Ausblenden! if <Positionen."KapitelDruckKennz"> = 0 then DetailPositionen.Visible := False;
1.5 Alle Positionen unterdrücken, wenn Kapitel nicht gedruckt werden soll
In der Tabelle der Positionen gibt es ein Feld <Positionen."KapitelDruckKennz">
. Hier steht in jeder Position das Druck-Kennzeichen des zugehörigen Kapitel-Position. Mit diesem Feld kann man z.B. die Positionen unterdrücken, wenn das Kapitel nicht gedruckt werden soll.
Das Druckkennzeichen hat folgende Bedeutungen:
Wert | Beschreibung |
---|---|
0 | Nicht drucken |
1 | |
2 | Mit Bezeichnung |
3 | Nur Kapitel |
4 | Ohne Text |
Beispiel:
In REFLEX wählt man in der Kapitel-Position das Druck-Kennzeichen "Nicht drucken" an, z.B. in Kapitel 3.0. Somit sollen alle Positionen des Kapitels 3 nicht gedruckt werden.
Damit nun jede Position "weiß", dass das Kapitel nicht gedruckt werden soll, wird in jeder Position (3.1, 3.2, 3.3 usw.) das Feld <Positionen."KapitelDruckKennz">
aufgeführt, das das Kennzeichen aus dem Kapitel (3.0) enthält!
Im Report muss man nun an zwei Stellen dieses Kennzeichen abfragen.
- Detail-Positionen
- In den Standard-Reports gibt es das Band
DetailPositionen
, in dem die Positionen dargestellt werden. Diese Band soll unterdrückt werden, wenn das zugehörige Kapitel auf "Nicht drucken" steht. Dazu kann man diesen Code im Ereignis "DetailPositionenOnBeforePrint" verwenden:
procedure DetailPositionenOnBeforePrint(Sender: TfrxComponent); begin // Dieser Code wird ausgeführt, BEVOR das Positionen-Detail-Band // ausgegeben wird. // Standard: DetailPositionen drucken! DetailPositionen.Visible := True; // Wenn das ganze Kapitel nicht gedruckt werden soll: Ausblenden! if <Positionen."KapitelDruckKennz"> = 0 then DetailPositionen.Visible := False; // Kapitel-Position ausblenden: // Kennzeichen "Nur Kapitel" = 'Ja': Positionen unterdrücken: if ( <Positionen."PosNr"> = 0 ) or ( <AuftragsKopf."KENNZ6"> = 'Ja' ) then DetailPositionen.Visible := False;
- Dieser Code blendet das Band also aus, wenn das zugehörige Kapitel nicht gedruckt werden soll!
- Kopf (Header) zu den Detail-Positionen
- Für die Kapitel-Überschrift verwendet man meist ein Header-Band.
- Auch dieses muss dann ausgeblendet werden!
procedure GroupHeaderKapitelOnBeforePrint(Sender: TfrxComponent); begin // Dieser Code wird ausgeführt, BEVOR das Positionen-Gruppenkopf-Band (die Kapitel-Überschrift) ausgegeben wird. GroupHeaderKapitel.Visible := True; if <Positionen."KapitelDruckKennz"> = 0 then begin GroupHeaderKapitel.Visible := False; exit; end; ...
- Dieses Feld steht ab Version 3.0/18.112 zur Verfügung!
1.6 Band dehnen
Eine wichtige und tolle Eigenschaft eines Bands in FastReport ist es, dass es sich optional dehnen kann, also an die Größe (genauer gesagt Höhe) der auszugebenden Daten anpassen kann.
Dieser Artikel beschreibt das.
1.7 Saubere Linien um Bänder, auch wenn Child-Band unterdrückt wird
Manchmal hat man mehrere Child-Bänder, die unter Umständen unterdrückt werden. Wenn man Linien (Rahmen) verwendet, fehlt aber u.U. der untere Rahmen, weil der ja von dem Child-Band kommt, das aber unterdrückt wird.
Dieser Artikel beschreibt das.
1.8 Details-Band wird nicht gedruckt wenn SubdetailData leer
Wenn man in einem Report ein Detail-Band und ein Subdetail-Band hat...
...wird das Detail-Band standardmäßig nicht gedruckt, wenn das Subdetail-Band keine Daten hat! Um das zu verhindern, muss man mit der rechen Maustaste auf das Details-Band klicken und die Option
Drucken wenn Detail leer
einschalten (entspricht der Band-Eigenschaft "PrintIfDetailEmpty" im Objekt-Inspektor)!
Beispiel:
Ein Lieferschein-Report verwendet im Detail-Band die Tabelle "LieferscheinPosSummiert", die die aufsummierten Mengen der Lieferschein-Positionen (nach Artikeln zusammengefasst) auflisten.
Im Subdetail-Band werden die zugehörigen Inventar-/Seriennummern aufgeführt (Tabelle "EinzelartikelLieferscheinPosSummiert).
Da es bei Mengenartikeln keine Seriennummern gibt, werden die Positionen im Lieferschein nicht gedruckt, wenn die o.a. Option nicht eingeschaltet ist.
1.9 Warum die Sub-Details ganz unten stehen
Etwas Verständnisprobleme kann es geben, wenn man in einem Report Subdetail-Bänder verwendet und den Fuß nicht als Report-Fuss-Band verwendet sondern als Fuß des Detail-Bereiches:
Im Grunde genommen gehört alles von "DetailData" bis zu Child "Lieferschein_Fuß" zum Detail-Bereich.
Der Footer ist ein Fuß zum Detail-Bereich.
Die Subdetails stehen deshalb ganz unten.
1.10 Band unterdrücken wenn nicht Anfrage/Angebot
Wenn man ein Band unterdrücken will, wenn es kein Angebot oder keine Anfrage ist, gehen Sie wie folgt vor:
Öffnen Sie den Designer mit dem gewünschten Report.
Suchen Sie das Band, das unterdrückt werden soll und klicken es mit der linken Maustaste an. Achten Sie darauf, dass Sie wirklich auf das Band klicken und nicht auf ein Element, das auf dem Band liegt!
Links im Objektinspektor klicken Sie auf den Reiter Ereignisse. Beispiel:
Doppelklicken Sie auf die Zeile OnBeforePrint in der rechten Spalte. Wenn da schon was steht heisst das, es gibt schon einen Code für dieses Band. Wenn nicht, wird eine neue Prozedur für dieses Band angelegt.
In der Prozedur ("Procedure") zwischen begin und end kann ein Code eingegeben werden, der z.B. das Band unter bestimmten Umständen unterdrückt.
Geben Sie diesen fettgedruckten Code ein:
procedure mdAngGuetigOnBeforePrint(Sender: TfrxComponent); var s : String; begin // Band nur sichtbar wenn Anfrage oder Angebot/Offerte: mdAngGuetig.Visible := ( <AuftragsKopf."StatusNr"> = 3 ) or ( <AuftragsKopf."StatusNr"> = 7 ); // Angebot/Anfrage ...
Der Code setzt die Sichtbarkeit (Visible
) auf wahr (True
) oder falsch (False
), wenn der Ausdruck rechts hinter dem :=
) wahr oder falsch ergibt.
( <AuftragsKopf."StatusNr"> = 3 ) or ( <AuftragsKopf."StatusNr"> = 7 )
ergibt True, wenn die Status-Nummer des Auftrags 3 oder 7 ist.
- Alternativ
Dieser Code macht genau das gleiche. Er ist etwas grösser, aber vielleicht besser verständlich:
// Band nur sichtbar wenn Anfrage oder Angebot/Offerte: if ( <AuftragsKopf."StatusNr"> = 3 ) or ( <AuftragsKopf."StatusNr"> = 7 ) then // Angebot/Anfrage mdAngGuetig.Visible := True else mdAngGuetig.Visible := False;
Wie gesagt, der Weg ist etwas anders, das Ergebnis das gleiche!