Beispiele (Pascal-Script) #
Abschnitte bei Rechnungen ausblenden #
Angenommen, wir haben ein Rechnungs-Formular, in dem gewisse Dinge ein- oder ausgeblendet werden sollen, je nachdem ob die Rechnung netto oder brutto orientiert ist und je nachdem ob es wirklich eine Rechnung oder eine Gutschrift ist.
Die Bedingung für brutto orientiert ist „Rechnungskopf [ ‘BruttoFlg’ ] = 1“, und eine Gutschrift erkennt man daran, dass „Rechnungskopf [ ‘VkBrutto’ ] > 0“ ist. Also könnte man sich einige eigene Funktionen erstellen:
function istBrutto: Boolean;
begin
Result:= Rechnungskopf [ 'BruttoFlg' ] = 1;
end;
function istRechnung: Boolean;
begin
Result:= Rechnungskopf [ 'VkBrutto' ] > 0;
end;
Ausgehend von diesen beiden Funktionen könnte man sich weitere erstellen, die auf diesen aufbauen. Das ist allerdings nicht unbedingt nötig, vielleicht wird man gar nicht alle verwenden. Die ersten beiden hätten gereicht.
function istNetto: Boolean;
begin
Result:= not istBrutto;
end;
function istGutschrift: Boolean;
begin
Result:= not istRechnung;
end;
function istNettoRechnung: Boolean;
begin
Result:= istRechnung and istNetto;
end;
function istBruttoRechnung: Boolean;
begin
Result:= istRechnung and istBrutto;
end;
function istNettoGutschrift: Boolean;
begin
Result:= istGutschrift and istNetto;
end;
function istBruttoGutschrift: Boolean;
begin
Result:= istGutschrift and istBrutto;
end;
Nun zu unserem eigentlichen Formular. Angenommen wir haben in der Zusammenfassung der Rechnung 4 Unterberichte: Einen für netto orientierte Rechnung, einen für brutto orientierte Rechnung, einen für netto orientierte Gutschrift und einen für brutto orientierte Gutschrift. Je nachdem was vorliegt soll der entsprechende Bericht eingeblendet werden, und die anderen drei sollen ausgeblendet werden. Ohne die eigenen Funktionen würde der Code in SummaryBeforePrint dann etwa so aussehen:
procedure SummaryBeforePrint;
begin
if (Rechnungskopf [ 'BruttoFlg' ] = 1) then { brutto }
begin
if (Rechnungskopf [ 'VkBrutto' ] > 0) then { Rechnung }
begin
SubRechnungBrutto.visible:= true;
SubRechnungNetto.visible:= false;
SubGutschriftBrutto.visible:= false;
SubGutschriftNetto.visible:= false;
end;
else { Gutschrift }
begin
SubRechnungBrutto.visible:= false;
SubRechnungNetto.visible:= false;
SubGutschriftBrutto.visible:= true;
SubGutschriftNetto.visible:= false;
end;
end;
else { netto }
begin
if (Rechnungskopf [ 'VkBrutto' ] > 0) then { Rechnung }
begin
SubRechnungBrutto.visible:= false;
SubRechnungNetto.visible:= true;
SubGutschriftBrutto.visible:= false;
SubGutschriftNetto.visible:= false;
end;
else { Gutschrift }
begin
SubRechnungBrutto.visible:= false;
SubRechnungNetto.visible:= false;
SubGutschriftBrutto.visible:= false;
SubGutschriftNetto.visible:= true;
end;
end;
end;
Man kann sich leicht vorstellen, wie viele Tippfehler da hineingeraten und wie oft ein Semikolon vergessen wird. Zum Vergleich nun die Version mit Hilfe der eigenen Funktionen von ganz oben:
procedure SummaryBeforePrint;
begin
SubRechnungBrutto.visible:= istBruttoRechnung;
SubRechnungNetto.visible:= istNettoRechnung;
SubGutschriftBrutto.visible:= istBruttoGutschrift;
SubGutschriftNetto.visible:= istNettoGutschrift;
end;
Diese Version besticht durch Übersichtlichkeit und Kürze. Damit lässt sich einfach viel leichter Arbeiten.
Bedingte Texte einblenden #
Wir haben ein Formular mit Mahnstufen. Je nach Mahnstufe soll an einer bestimmten Stelle ein bestimmter Text ausgegeben werden, abhängig von Mahnstufe und Zinsen auf dieser Mahnstufe.
Dazu haben wir unter ‘constants’ die Zinsen und Texte für verschiedene Stufen festgelegt:
constants
Mahntext_1 = 'Die ist die 1. Mahnung!';
Mahntext_2 = 'Dies ist bereits Ihre 2. Mahnung!';
Mahntext_3 = 'Dies ist die 3. Mahnung, wir werden rechtliche
Schritte einleiten.';
Zinsen_1 = 0.0;
Zinsen_1 = 8.42;
Zinsen_1 = 16.84;
Nun haben wir ein einfaches Textfeld in der Mahnung, und dieses soll ja nach Stufe und festgelegten Zinsen einen anderen Text tragen. Der herkömmlich Code dazu könnte so aussehen:
procedure DetailBeforePrint;
begin
if (Rechnung[ 'Mahnstufe' ] = 0) then { hatte noch keine Mahnung }
Mahntext.Caption:= Mahntext_1 + ' Es werden ' +
FloatToStr( Zinsen_1 ) + ' % Zinsen fällig.';
if (Rechnung[ 'Mahnstufe' ] = 1) then { hatte eine Mahnung }
Mahntext.Caption:= Mahntext_2 + ' Es werden ' +
FloatToStr( Zinsen_2 ) + ' % Zinsen fällig.';
if (Rechnung[ 'Mahnstufe' ] = 2) then { hatte 2 Mahnungen }
Mahntext.Caption:= Mahntext_3 + ' Es werden ' +
FloatToStr( Zinsen_3 ) + ' % Zinsen fällig.';
else
Mahntext.Caption:='Sie sind bereits außerhalb aller Mahnstufen...';
end;
Wenn man nun hier text ändern will, muss man das gleich mehrfach tun, die Fehleranfälligkeit ist hoch. Auch hier sollte man sich wieder eigene Funktionen erstellen.
function Text (I: Integer): String;
begin
case I of
0: Result:= Mahntext_1;
1: Result:= Mahntext_2;
2: Result:= Mahntext_3;
else Result:='Sie sind bereits außerhalb aller Mahnstufen...';
Result:= Result + ZinsText(I);
end;
function ZinsText (I: Integer): String;
var
S: String;
begin
S:= ' % Zinsen fällig.';
Result:= 'Es werden ';
case I of
0: Result:= Result + FloatToStr(Zinsen_1) + S;
1: Result:= Result + FloatToStr(Zinsen_2) + S;
2: Result:= Result + FloatToStr(Zinsen_3) + S;
else Result:= '';
end;
Die Funktion Text bekommt die Mahnstufe übergeben, entscheidet anhand dieser, welcher text ausgegeben werden soll und hängt anschließend noch mit Hilfe der Funktion ZinsText an, welche Zinsen fällig werden (außer die Mahnstufe ist zu hoch). Die Funktion ZinsText erzeugt ebenfalls anhand der Mahnstufe den Text, der noch angehängt werden soll. Mit diesen eigenen Funktionen würde nun DetailBeforePrint etwa so aussehen:
procedure DetailBeforePrint;
begin
Mahntext.Caption:= Text( Rechnung[ 'Mahnstufe' ] );
end;
Wie sieht man, hat sich der Aufwand, eigene Funktionen zu erstellen, gelohnt. DetailBeforePrint ist sehr kurz und übersichtlich. Änderungen werden nur in den eigenen Funktionen gemacht oder sogar nur unter ‘constants’.
An dieser Stelle bleibt mir nur noch, auf den Download-Bereich im Anwender-Forum (Passwort geschützt) zu verweisen. Dort gibt es einige Formulare die selbst gemachte Funktionen enthalten und benutzen. Selbst wenn man die Formulare nicht benötigt, so kann man sich die Technik und Logik trotzdem mal ankucken, um eigene Vorstellungen von Formularen besser umsetzen zu können.