FastReport: Zähler-Variable zum Unterdrücken von wiederholten Werten

Aus GEVITAS
Wechseln zu: Navigation, Suche

1 Allgemeines

Manchmal möchte man wiederholte Werte, die untereinander stehen, nicht drucken. Beispiel einer Auftragsposition:

1.1 Artikel A

Alternativ:
1.2 Artikel B 

Alternativ:
1.3 Artikel C

Das Wort Alternativ: soll hier nur bei der ersten Alternative stehen, die direkt danach folgenden sollen unterdrückt werden.

Eigentlich gibt es dazu in FastReport eine Option "wiederholte Werte unterdrücken" auf der rechten Maustaste eines Objektes. In einfachen Listen funktioniert das auch, in komplexen Formularen mit wechselseitigem Ausblenden von Bändern aber nicht (immer)!

2 Anfangs-Zustand

In einem Angebots-/Auftrags-Formular sieht es so aus, wenn es mehrer Alternativ-Positionen hintereinander gibt:

FastReport Auftrag AlternPos 01.png


Es soll in diesem Fall aber nur einmal das Wort "Alternativ" gedruckt werden:

FastReport Auftrag AlternPos 02.png

Die Option "wiederholte Werte unterdrücken" auf der rechten Maustaste des Textfeldes funktioniert hier nicht. Warum auch immer, wird auch die erste Zeile nicht gedruckt. Es musste also eine andere Lösung her.


3 Lösung

Die Lösung geht so, dass man über eine Variable im Report zählt, das wievielte Mal das Textfeld gedruckt werden soll und ab dem 2. Druck das Feld unterdrückt.

Das Prinzip des Reports ist es, dass es im Detail-Bereich zwei Bänder (2) und (3) gibt, die - je nach Fall - jeweils ein- oder ausgeblendet werden:

FastReport Auftrag AlternPos 03.png


(1) Das ist die Kapitel-Überschrift im Header "GroupHeader1".

(2) Das ist das Band für eine "normale" Position mit Pos.Nr., Bezeichnung, Menge und Preis. Wenn es eine Alternativ-Position ist, wird das Band ausgeblendet.

(3) Das ist das Band für eine Alternativ-Position. Wenn es eine normale Position ist, wird das Band ausgeblendet.

(4) Das ist die Kapitel-Summe.


3.1 Variable anlegen

Zuerst muss man im Report unter Report ⇒ Variablen eine neue Variable anlegen.

Nennen wir sie "iAlternativeVorhanden".

  • Der Autor verwendet den erster Buchstaben als Kennzeichen für den Typ der Variable.
  • "i" steht dabei für "Integer", also eine Ganzzahl.
  • "d" wird für Datumswerte benutzt.
  • "f" wird für Fließkommazahlen benutzt usw.

3.2 Variable auf 0 stellen

Es ist gute Praxis, Variablen am Anfang immer auf einen definierten Grund-Wert zu bringen. Deshalb wird die Variable im Auftragskopf erst mal auf 0 gestellt:


procedure MasterAuftragsKopfOnBeforePrint(Sender: TfrxComponent);
begin
   // Initialisieren der Variablen, Bereiche, Seiten:
   Set( 'iAlternativeVorhanden', 0 );  // Unterdrückt mehrfach vorhandene "Alternative" 
   ...
end;


Man muss dazu die Funktion Set(...) verwenden. Leider gibt es in FastReport die "übliche" Form iAlternativeVorhanden := 0 nicht.

Jetzt kommt das Wichtige:

Die Variable muss auch auf 0 gestellt werden, wenn eine "normale" Position gedruckt wird, also keine Alternativ-Position. Sollte nun nämlich nach dieser Position eine Alternative kommen, muss das Wort "Alternative" ja (ein mal) gedruckt werden.


Dazu wird das Ereignis "OnBeforePrint" des Memo-Feldes der Bezeichnung benutzt:

 procedure memoPosBezeichnungOnBeforePrint(Sender: TfrxComponent);
 begin
   // Wenn die "normale" Bezeichnung (also nicht-alternativ) gedruckt wird,
   // muss der Zähler für die Mehrfach-drucken-nur-der-Erste zurückgestellt werden:
   Set( 'iAlternativeVorhanden', 0 );
 end; 


Wichtig
Man kann nicht das "OnBeforePrint" des Bands verwenden! Dieses wird nämlich immer aufgerufen, auch wenn das Band gar nicht gedruckt werden soll! Sonst könnte man im "OnBeforePrint" ja nicht entscheiden, ob das Band gedruckt werden soll oder nicht...

3.3 Zähler erhöhen

Bevor das Feld "memoAlternativeVorhanden" gedruckt wird, wird dieser Code ausgeführt:

 procedure memoAlternativeVorhandenOnBeforePrint(Sender: TfrxComponent);
 begin
  
   // Der Zähler für den Mehrfachdruck-Unterdrücker wird hochgesetzt:
   // (Der wird beim Drucken der "normalen" Bezeichnung auf 0 gestellt)
   Set( 'iAlternativeVorhanden', <iAlternativeVorhanden> + 1 );
 
   // Wenn schon einmal gedruckt, wird das Feld unterdrückt!
   if <iAlternativeVorhanden> > 1 then
     memoAlternativeVorhanden.Visible := False
   else
     memoAlternativeVorhanden.Visible := True;
 
 end;


Die Variable wird zuerst um 1 erhöht. Wenn zuvor eine "normale" Position gedruckt wurde, steht also nun eine 1 in der Variable.

Danach wird verglichen, welchen Wert die Variable hat. Wenn der Wert größer ist als 1, wird das Memo-Feld unterdrückt, bei einem Wert von 1 wird das Feld gedruckt.

3.4 Ergebnis

FastReport Auftrag AlternPos 02.png

4 Links