FastReport Band unterdrücken mit mehreren Bedingungen: Unterschied zwischen den Versionen

Aus GEVITAS
Wechseln zu: Navigation, Suche
K (Der Feldname des Druck-Kennzeichens)
 
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 35: Zeile 35:
 
* Wenn das '''Druck-Kennzeichen''' der Position auf "Nicht drucken" steht.
 
* Wenn das '''Druck-Kennzeichen''' der Position auf "Nicht drucken" steht.
  
== Das Problem ===
+
== Das Problem ==
  
 
Mit der
 
Mit der
Zeile 56: Zeile 56:
 
     DetailPositionen.Visible := False;
 
     DetailPositionen.Visible := False;
 
   
 
   
   // Wenn das Druck-Kennzeichen auf "nicht drucken" sthet: Ausblenden:                                                                                                                                                         
+
   // Wenn das Druck-Kennzeichen auf "nicht drucken" steht: Ausblenden:                                                                                                                                                         
 
   if <Positionen."DruckKennzeichen_0Nicht_1Normal_2_MitBez_3NurKap_4OhneText"> = 0 then                                       
 
   if <Positionen."DruckKennzeichen_0Nicht_1Normal_2_MitBez_3NurKap_4OhneText"> = 0 then                                       
 
     DetailPositionen.Visible := False;  
 
     DetailPositionen.Visible := False;  
Zeile 66: Zeile 66:
 
'''Eigentlich war's das schon!'''
 
'''Eigentlich war's das schon!'''
  
Aber wird können den Code noch etwas optimieren. Unter
+
Aber wir können den Code noch etwas optimieren. Unter
  
 
   ...weiterer Code...
 
   ...weiterer Code...
Zeile 72: Zeile 72:
 
stehen ja Befehle, die Objekte des Bands beeinflussen, z.B. den Rabatt ausschalten, Alternativ-Positionen kursiv darstellt usw.
 
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:
+
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);
 
  procedure DetailPositionenOnBeforePrint(Sender: TfrxComponent);
Zeile 99: Zeile 99:
 
  end;
 
  end;
  
 +
Der weitere Code wird nun also nicht mehr ausgeführt!
 +
 +
== Hinweise ==
 +
 +
=== Begin/End ===
  
Der weitere Code wird nun also nicht mehr ausgeführt!
+
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!
 +
 
 +
 
 +
=== 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:
  
 +
{| class="wikitable" style="text-align: left;"
 +
!Wert
 +
!Bedeutung
 +
|- valign="top"
 +
|0
 +
|Position nicht drucken.
 +
|- valign="top"
 +
|1
 +
|Position drucken.
 +
|- valign="top"
 +
|2*
 +
|Position mit Bezeichnung drucken.
 +
|- valign="top"
 +
|3*
 +
|Nur Kapitel drucken.
 +
|- valign="top"
 +
|4*
 +
|Ohne Text drucken.
 +
|}
  
 +
Die Druck-Kennzeichen mit * werden in der Praxis (und in den Standard-Formularen) '''nicht''' unterstützt!
  
 
== Links ==
 
== Links ==

Aktuelle Version vom 15. Februar 2016, 00:56 Uhr

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