FastReport Band unterdrücken mit mehreren Bedingungen

Aus GEVITAS
Wechseln zu: Navigation, Suche

1 Allgemeines

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 passieren solle, 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, der das Visible für das Band ein- oder ausschalten. Hier wird beschrieben, wie man da am Besten vorgeht.


2 Die Aufgabe

In einem Auftragsformular sollen Positionen (im Detail-Band) unter mehreren Bedingungen unterdrückt werden:

  • Wenn es eine Kapitel-Überschrift ist (weil die weiter oben im Gruppenkopf gedruckt wird).
  • Wenn das Druck-Kennzeichen der Position auf "Nicht drucken" steht.

3 Das Problem

Mit der

if...then...else

Lösung von oben kommt man nicht weiter, weil jedes if oder else vom nächsten if oder else ja wieder aufgehoben werden würde.

Ein bessere Methode ist es, im Code zuerst einen Grundzustand herzustellen, in dem das Band erst mal sichtbar (Visible := True) gemacht wird. In den folgenden Zeilen wird nun - je nach Bedingung - das Band ausgeschaltet. Das sieht dann z.B. so aus:

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
    DetailPositionen.Visible := False;

  // Wenn das Druck-Kennzeichen auf "nicht drucken" steht: Ausblenden:                                                                                                                                                         
  if <Positionen."DruckKennzeichen_0Nicht_1Normal_2_MitBez_3NurKap_4OhneText"> = 0 then                                       
    DetailPositionen.Visible := False; 

  ...weiterer Code...
end;

Eigentlich war's das schon!

Aber wir können den Code noch etwas optimieren. Unter

  ...weiterer Code...

stehen ja Befehle, die Objekte des Bands beeinflussen, z.B. den Rabatt ausschalten, Alternativ-Positionen kursiv darstellt usw.

Im Grunde genommen muss dieser Code aber gar nicht ausgeführt werden, wenn das Band sowieso unsichtbar ist! Deshalb kann man die weitere Abfolge der Befehle mit exit abbrechen, wenn das Band auf unsichtbar geschaltet ist. Der Code von oben sieht dann so aus:

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;  // Raus!
  end;
 
  // Wenn das Druck-Kennzeichen auf "nicht drucken" sthet: Ausblenden:                                                                                                                                                         
  if <Positionen."DruckKennzeichen_0Nicht_1Normal_2_MitBez_3NurKap_4OhneText"> = 0 then                                       
  begin
    DetailPositionen.Visible := False; 
    exit;  // Raus!
  end;

  ...weiterer Code...
end;

Der weitere Code wird nun also nicht mehr ausgeführt!

4 Hinweise

4.1 Begin/End

Bitte beachten Sie:

  • Wenn nach einem if nur eine Code-Zeile kommt, kann man die direkt darunter schreiben.
  • Wenn nach einem if mehrere Code-Zeilen kommen, muss man diese mit begin und end einschließen!


4.2 Der Feldname des Druck-Kennzeichens

Der Name des Felds "Druck-Kennzeichens" lautet wirklich:

<Positionen."DruckKennzeichen_0Nicht_1Normal_2_MitBez_3NurKap_4OhneText">

Das sieht ungewöhnlich aus, hat aber den entscheidenden Vorteil, dass man auf den ersten Blick sieht, welche Werte des Feldes verwendet werden:

Wert Bedeutung
0 Position nicht drucken.
1 Position drucken.
2* Position mit Bezeichnung drucken.
3* Nur Kapitel drucken.
4* Ohne Text drucken.

Die Druck-Kennzeichen mit * werden in der Praxis (und in den Standard-Formularen) nicht unterstützt!

5 Links