FastReport Band unterdrücken mit mehreren Bedingungen: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „== Allgemeines === Im Prinzip kann man ein Band ganz einfach im Code '''unterdrücken''', indem man eine Formel schreibt, die unter bestimmten Umständen die …“) |
K (→Der Feldname des Druck-Kennzeichens) |
||
(5 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
− | == Allgemeines | + | == 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: | 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: | ||
Zeile 33: | Zeile 33: | ||
* Wenn es eine '''Kapitel-Überschrift''' ist (weil die weiter oben im Gruppenkopf gedruckt wird). | * Wenn es eine '''Kapitel-Überschrift''' ist (weil die weiter oben im Gruppenkopf gedruckt wird). | ||
− | * 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 45: | Zeile 45: | ||
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: | 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! | ||
+ | |||
+ | == Hinweise == | ||
+ | |||
+ | === 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! | ||
+ | |||
+ | |||
+ | === 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
Inhaltsverzeichnis
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!