Menü

Beispiele (Pascal-Script)

Zurück | Ebene zurück

1. 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.

2. 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.