FastReport: Zähler-Variable zum Unterdrücken von wiederholten Werten
Inhaltsverzeichnis
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:
Es soll in diesem Fall aber nur einmal das Wort "Alternativ" gedruckt werden:
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.
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 ab Kennzeichen für den Typ der Variable. "i" steht dabei für "Integer", also eine Ganzzahl.
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.
Nun muss die Variable auch auf 0 gestellt werden, wenn eine "normale" Position gedruckt wird:
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: //JC//170706// Set( 'iBestPriceAlternativeVorhanden', 0 ); end;