FastReport Tipps und Tricks: Bänder

Aus GEVITAS
Wechseln zu: Navigation, Suche

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:

FastReport TippsUndTrick KapitelPositionen Zusammenhalten Vorher.png

Um das zu verhinden, setzt man die Option:

FastReport TippsUndTrick KapitelPositionen Zusammenhalten Option.png

Nachher:


FastReport TippsUndTrick KapitelPositionen Zusammenhalten Nachher.png


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;

(weil nach dem then nur eine Zeile folgt, kann man das begin und end; weg lassen!


oder noch kürzer:

  DetailPositionen.Visible := <Positionen."PosNr"> = 0;    // Wenn es eine Kapitel-Position ist!


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 man diesen Code einfügen:


  // Wenn das ganze Kapitel nicht gedruckt werden soll: Ausblenden!
  if <Positionen."KapitelDruckKennz"> = 0 then
    DetailPositionen.Visible := False;


Das Feld <Positionen."KapitelDruckKennz"> beinhaltet also das Druckkennzeichen der zugehörigen Kapitel-Position. Damit kann man z.B. den Detail-Bereich unterdrücken, wenn das Kapitel auf "Nicht-Drucken" gesetzt wurde.

Beispiel:


if ( <Positionen."PosNr"> = 0  )
   or ( <Positionen."DruckKennzeichen_0Nicht_1Normal_2_MitBez_3NurKap_4OhneText">=0 ) // = Druckkennzeichen DIESER Position
   or ( <Positionen."KapitelDruckKennz"> = 0 )                                        // = Druckkennzeichen DER KAPITEL-Position
                                                then
  begin
    DetailPositionen.Visible := False;
  end
  else
    DetailPositionen.Visible := True;



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

FastReport Band SubDetail 01.png


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


Lieferschein PositionenSubdetails.png


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:

FastReport Band Ereignisse 01.png

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) des Bandes mdAngGuetig 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.

Die runden Klammern sind wichtig, sie schliessen den ersten bzw. zweiten Teil des Ausdrucks ein.

In spitzen Klammern werden in FastReport© Feldnamen angegeben.


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!


1.11 Kapitel-Zwischensumme nicht drucken, wenn es nur EIN Kapitel im Auftrag gibt

In der Tabelle RechStatistik stellt das Programm die maximale (höchste) Kapitel-Nummer in diesem Auftrag im Feld MaxKapitelNr zur Verfügung.

Ermöglicht z.B. dieses:

  // Kapitel-Zwischensumme nicht drucken, wenn es nur EIN Kapitel im Auftrag gibt:
  if <RechStatistik."MaxKapitelNr"> = 1 then
    GroupFooterZwischensumme.Visible := False;


1.12 Band-Höhe anpassen ohne Child-Band und Code

Wie in dieser Wiki mehrfach beschrieben, kann man einem Band ein Child-Band hinzufügen, um z.B. den Artikel-Langtext auszudrucken, wenn er vorhanden ist. Wenn es keinen Text gibt, kann man im Code das Child-Band unterdrücken, so dass keine Leerzeile entsteht.

Mit einem Trick kann man dieses Verhalten (also Leerzeile vermeiden) auch ganz ohne Code herstellen:

Das Textfeld (RTF-Feld im Beispiel "Rich1") unterhalb der Bezeichnung wird mit der Höhe 0,01 angelegt:

FastReport TippsUndTrick LiefScheinPos ArtikelText.png

Es ist als sehr niedrig, hat aber die Option "Dehnen"!

Dadurch wird das Feld nur Platz wegnehmen, wenn es einen Text beinhaltet. Ist es leer, nimmt es (fast) keinen Platz weg, die Leerzeile wird also vermieden!

2 Links