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" sthet: Ausblenden:                                                                                                                                                         
  if <Positionen."DruckKennzeichen_0Nicht_1Normal_2_MitBez_3NurKap_4OhneText"> = 0 then                                       
    DetailPositionen.Visible := False; 

  ...weiterer Code...
end;

Eigentlich war's das schon!

Aber wird 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 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 Links