===== Hilfsprogramm p2fCalc =====
==== Anforderung ====
Hin und wieder kommt es vor, dass für die korrekte Erstellung eines Dokument eine Berechnung durchgeführt werden muss, weil die notwendigen Daten nicht in der gewünschten Form im Druckdatenstrom enthalten sind. Das kann zum einen die Berechnung von Zwischensummen sein, oder ein Zähler, der zum Erzeugen der Markierungen zur Steuerung der Kuvertiermaschine benötigt wird. Desweiteren ist es manchmal auch notwendig, Daten aus dem einen Dokument in das Folgedokument 'hinüberzuretten'. Ein lokaler Speicher zum Ablegen und späteren Auslesen von numerischen Werten oder Zeichenketten wäre hier hilfreich.
\\
\\
==== Realisierung ====
Für Fälle, in denen das normale Leistungsspektrum von (p2f) nicht ausreicht, gibt es bei der Definition von Formularen ein **System-Anfragefeld**. Mit Hilfe diese Feldes kann während der Erzeugung eines Formulars ein beliebiges externes Programm aufgerufen werden, das dann die verlangte Aufgabe übernimmt. Dabei können auch Parameter an das Programm übergeben werden, die die zu lösende Anforderung definieren.
Für die Durchführung von ganz allgemeinen Berechnungen würde man als Mensch einen Taschenrechner benutzen - und genau so eine Art Taschenrechner stellt das Programm **p2fCalc** für (p2f) zur Verfügung. Das Programm wurde als sogenannte Systemfeldapplikation geschrieben, die nur innerhalb eines (p2f)-Formulars in einen System-Anfragefeld verwendet werden kann.
Die Leistungsmerkmale dieses Taschenrechners sind:
* Die vier Grundrechenarten sowie eine Modulo-Operation
* Umfangreiche kaufmännische und technische Funktionen
* Währungsumrechnungen
* Mit Namen ansprechbare Speicher für bis zu 20 numerische Werte oder Zeichenketten
Ein Aufruf der Systemfeldapplikation ohne Parameter über die Kommandozeile (DOS-Box, Eingabeaufforderung, Konsole) zeigt eine kurze Beschreibung, die möglichen Parameter und ein paar beispielhafte Aufrufe an. Auch die Rückkehrwerte des Programms sind aufgelistet:
\\
\\
p2fCalc V1.2 (c) 2015 by SPE Systemhaus GmbH
Description:
Evaluate arithmetic expressions.
Program parameters are:
Mandatory parameter:
Arithmetic expression
Optional parameters:
-c Clear internal variables.
General return codes:
0 - Success
-1 - Failed
-2 - Unknown option
Usage in system request field:
p2fCalc 17+4
p2fCalc -c A=17;B=4;A+B
p2fCalc Euros=20.00*DEM
print2forms (R) is a registered trademark
of SPE Systemhaus GmbH
\\
Als Dokumentation des gesamten Leistungsumfangs der Systemfeldapplikation **p2fCalc** wird im folgenden die zugrundeliegende Syntax für arithmetische Ausdrücke in Backus-Naur-Form angegeben:
\\
\\
::= | ';'
::= |
::= '=' |
'=' '’' * '’'
::= |
'+' |
'-'
::= |
'*' |
'/' |
'%'
::= |
'^'
::= |
'+' |
'-'
::= '(' ')' |
|
|
|
'(' ')'
::= 'pi' | 'e' | 'BEF' | 'DEM' | 'EEK' | 'FIM' | 'FRF' |
'GRD' | 'IEP' | 'ITL' | 'LUF' | 'MTL' | 'NLG' | 'ATS' |
'PTE' | 'SIT' | 'SKK' | 'ESP' | 'CYP'
::= 'abs' | 'acos' | 'asin' | 'atan' | 'ceil' | 'cos' |
'cosh' | 'exp' | 'floor' | 'log' | 'log10' | 'sin' |
'sinh' | 'sqrt' | 'tan' | 'tanh' | 'max' | 'min' |
'round'
::= ( 'A' .. 'Z', 'a' .. 'z' ) +
::= ( '0' .. '9' ) + |
( '0' .. '9' ) + '.' ( '0' .. '9' ) +
::= 'A' .. 'Z', 'a' .. 'z', '0' .. '9', ..
\\
Die arithmetischen Funktionen sind die aus der Mathematik bekannten. Die Funktion //round// rundet den an sie übergebenen Parameterwert kaufmännisch auf zwei Nachkommastellen. Die Funktionen //min// und //max// akzeptieren jeweils zwei Parameter und liefern erwartungsgemäß das Minimum oder das Maximum der beiden Parameter. Die Konstanten //pi// und //e// haben die bekannten Werte, die anderen zur Währungsumrechnung notwendigen Konstanten haben die Werte aus der nachfolgenden Tabelle:
\\
\\
^ Konstante ^ Faktor ^ Währung ^
| BEF | 0.024789 | Belgische Franken |
| DEM | 0.511292 | Deutsche Mark |
| EEK | 0.063912 | Estnische Kronen |
| FIM | 0.168187 | Finnische Mark |
| FRF | 0.152449 | Französische Francs |
| GRD | 0.002935 | Griechische Drachmen |
| IEP | 1.26974 | Irische Pfund |
| ITL | 0.000516 | Italienische Lire |
| LUF | 0.024789 | Luxemburgische Francs |
^ Konstante ^ Faktor ^ Währung ^
| MTL | 2.32937 | Maltesische Lire |
| NLG | 0.453780 | Niederländische Gulden |
| ATS | 0.072673 | Österreichische Schilling |
| PTE | 0.004988 | Portugiesische Escudos |
| SIT | 0.004173 | Slowenische Tolar |
| SKK | 0.033194 | Slowakische Kronen |
| ESP | 0.006010 | Spanische Peseten |
| CYP | 1.70860 | Zypriotische Pfund |
\\
Wie aus der Syntaxbeschreibung zu erkennen, bietet die Systemfeldapplikation außer der Zuweisung an eine Variable keinerlei weitere Operationen mit Zeichenketten an. Somit können Zeichenketten lediglich in einem internen Speicher abgelegt und zu einem späteren Zeitpunkt wieder abgerufen werden.
Die Syntaxbeschreibung zeigt auch, daß mehrere arithmetische Ausdrücke durch Semikolon getrennt hintereinander weggeschrieben werden können. Auf die ersten zehn dieser Ausdrücke kann in Schablonen mittels des Namens des System-Anfragefeldes und einem mit einem Doppelpunkt angehängten Index zugegriffen werden. Somit lassen sich mit einem einzigen Aufruf von **p2fCalc** mehrere Berechungen durchführen.
Die einzig mögliche Option beim Aufruf der Systemfeldapplikation dient dem Löschen des internen Speichers. Alle eventuell darin gespeicherten Werte und auch die Variablennamen selbst gehen damit verloren.
\\
\\
==== Aufruf im System-Anfragefeld ====
Als Beispiel für den Einsatz von **p2fCalc** soll die Beispielapplikation für den Lieferscheindruck aus der Free-Edition von (p2f) erweitert werden. Es wird angenommen, daß für logistische Zwecke oben rechts auf dem Lieferschein ein Barcode vom Typ Code 39 aufgebracht werden soll, der zum einen die Anzahl der Artikel auf dem Lieferschein und zum anderen die Menge der insgesamt gelieferten Artikel enthalten soll. Der erwartete Ausdruck wäre etwa wie folgt:
\\
\\
{{print2forms:tips:0052-1.png}}
Um das Beispiel nicht unnötig kompliziert zu machen, beschränken sich die nachfolgenden Angaben auf den Sonderfall eines einseitigen Lieferscheins. Das Vorgehen ist für den Fall mehrseitiger Dokumente übertragbar. Lediglich die Initialisierung muss an ein Feld gebunden werden, welches nur auf der ersten Seite vorkommt.
\\
\\
\\
{{ print2forms:tips:0052-2.png}}Für die Realisation dieser Aufgabe werden drei System-Anfragefelder und ein Barcodefeld benötigt.
Das erste System-Anfragefeld (Name //Initialisierung//) ruft **p2fCalc** auf, um die Variable zum Zählen der Artikel //Artikel// und die Variable zum Ermitteln der Gesamtmenge //Gesamt// auf Null zu setzen. Nach der Ausführung sind die beiden Variablen bekannt und mit Null vorbesetzt. Da dieses Feld vom Feldindex her an die Position des ersten Artikels gebunden ist wird es nur einmal aufgerufen.
Es ist klar, dass immer darauf gewartet werden muß, daß die Systemfeldapplikation **p2fCalc** terminiert.
Das zweite System-Anfragefeld (Name //Artikel//) ruft **p2fCalc** auf, um die Variable //Artikel// zu inkrementieren, und die Gesamtmenge in der Variablen //Gesamt// aufzusummieren. Dazu wird das Feld an jede der möglichen Artikelpositionen im Druckdatenstrom gebunden und die Liefermenge wird mit dem regulären Ausdruck aufgenommen.
Wie zu erwarten, werden natürlich vor dem Aufruf von **p2fCalc** in der Kommandozeile alle Referenzen auf Inhalte anderer Felder durch deren aktuelle Werte ersetzt. Nur so können Daten aus dem Druckdatenstrom in die Berechnung mit einfliessen. Die Kommandozeile beim ersten Artikel ist demzufolge ''p2fCalc Gesamt=Gesamt+20;Anzahl=Anzahl+1'', beim zweiten Artikel ''p2fCalc Gesamt=Gesamt+200;Anzahl=Anzahl+1'', usw. (Siehe Ablaufverfolgung weiter unten)
Das dritte System-Anfragefeld (Name //Ergebnis//) ruft **p2fCalc** auf, um das Ergebnis der Summierung abzufragen. Da das Feld nach dem Feld //Artikel// notiert ist, wird es auch erst aufgerufen, wenn das Feld //Artikel// vollständig ausgewertet ist. Demzufolge liefert das Feld tatsächlich den Endstand der Summen.
Das Barcode-Feld (Name //Barcode//) schliesslich erzeugt den gewünschten Barcode und greift dazu in seiner Schablone auf das System-Anfragefelds //Ergebnis// zu. Die Referenzierung auf das System-Anfragefeld erfolgt hierbei immer mittels einer Tilde!
Zur Verdeutlichung des zeitlichen Ablaufs ist nachfolgend noch ein Auszug aus der Ablaufverfolgung abgebildet, in dem die Aufrufe der Systemfeldapplikation und deren jeweiliges Ergebnis gut zu erkennen sind.
Wie zu sehen ist, ist der Rückgabewert einer Zuweisung immer der zugewiesene Wert selbst. Wird nur ein arithmetischer Ausdruck berechnet, wird das Ergebnis der Berechnung als Wert zurückgeliefert.
\\
\\
…
6 2015…27 Page 1 State 1 'Einzige Seite'
6 2015…27 Pattern 3 'Initialisierung': '0006810000' '.*'
6 2015…27 Pattern 4 'Artikel': '0006810000' '.{67} +([0-9]+)'
6 2015…27 Match 3 'Initialisierung' 06810000:
6 2015…27 Match 4 'Artikel' 06810000: \1='20'
6 2015…27 Match 4 'Artikel' 06F90000: \1='200'
6 2015…27 Match 4 'Artikel' 07710000: \1='144'
6 2015…27 Form subform
6 2015…27 Load 'DAT/RES/KOPF.PCL' (14655)
0 2015…27 Macro 403 loaded with
6 2015…27 Form subform
6 2015…27 Load 'DAT/RES/FUSS.PCL' (5789)
0 2015…27 Macro 405 loaded with
6 2015…27 Load 'DAT/RES/LIEFER.PCL' (27218)
0 2015…27 Macro 409 loaded with
6 2015…27 System Request 'Initialisierung': 'p2fCalc Anzahl=0;Gesamt=0' (25)
6 2015…27 System Response 'Initialisierung': '0|0||||||||' (4)
6 2015…27 System Request 'Artikel': 'p2fCalc Gesamt=Gesamt+20;Anzahl=Anzahl+1' (40)
6 2015…27 System Response 'Artikel': '20|1||||||||' (5)
6 2015…27 System Request 'Artikel': 'p2fCalc Gesamt=Gesamt+200;Anzahl=Anzahl+1' (41)
6 2015…27 System Response 'Artikel': '220|2||||||||' (6)
6 2015…27 System Request 'Artikel': 'p2fCalc Gesamt=Gesamt+144;Anzahl=Anzahl+1' (41)
6 2015…27 System Response 'Artikel': '364|3||||||||' (6)
6 2015…27 System Request 'Ergebnis': 'p2fCalc Gesamt;Anzahl' (21)
6 2015…27 System Response 'Ergebnis': '364|3||||||||' (6)
6 2015…27 Access (1872)
6 2015…27 Access (1460)
…
\\
Die Namen für Variablen können maximal zehn Zeichen lang sein. Groß-/Kleinschreibung wird unterschieden. Schlägt eine Berechnung fehl, wird als Ergebnis der Berechnung eine Zeichenkette mit einer Fehlermeldung geliefert. Dies ist in der Ablaufverfolgung jederzeit überprüfbar.
Der interne Speicher von **p2fCalc** wird für jeden Client und jedes Gateway getrennt angelegt. Deshalb können die Systemfeldaufrufe in einem Formular von mehreren Clients und Gateways unabhängig voneinander ausgeführt werden. Folgerichtig wird nach Anforderung auch nur dieser Speicher gelöscht. Die Speicher anderer Clients oder Gateways bleiben unangetastet. Einen globalen Speicher für alle Clients und Gateways gibt es zur Zeit nicht.
Enthält eine der durchzuführenden Berechnungen Zeichenketten mit Leerstellen oder werden in den arithmetischen Ausdrücken zur Erhöhung der Lesbarkeit Leerstellen eingefügt, muß beim Aufruf von **p2fCalc** der Parameter (die Berechnungen) in doppelte Anführungszeichen gesetzt werden, weil Leerstellen innerhalb der Zeichenkette sonst zu einer fehlerhaften Parameterübergabe an die Systemfeldapplikation führen.
\\
\\
==== Beispiele ====
Hier einige weitere Berechnungsbeispiele:
| p2fCalc -c | Löscht alle Variablen und deren Inhalte. Danach ist keine Variable mehr definiert, auf die in einem Ausdruck Bezug genommen werden kann. ''Anzahl=Anzahl+1'' liefert eine Fehlermeldung. |
| p2fCalc(sp)-c(sp)Anzahl=0 | Löscht zuerst alle Variablen und deren Inhalte und definiert dann eine Variable mit dem Namen //Anzahl//. Diese Initialisierung ist notwendig, wenn später auf die Variable zugegriffen werden soll, etwa in ''Anzahl=Anzahl+1''. |
| p2fCalc(sp)"Artikel='PS/2(sp)USB(sp)Adapterkabel'" | Setzt den Wert einer Variablen //Artikel// auf die angegebene Zeichenkette. Die doppelten Anführungszeichen sind wegen der Leerstellen in der Zeichenkette unbedingt notwendig! |
| p2fCalc(sp)PreisDM=PreisEUR/DEM | Rechnet einen Preis in Euro (in der Variablen //PreisEUR//) in Deutsche Mark um, und speichert ihn in der Variablen //PreisDM//. |
| p2fCalc(sp)"PreisDM(sp)=(sp)PreisEUR(sp)/(sp)DEM" | Gleichbedeutend wie zuvor. Die doppelten Anführungszeichen sind wegen der Leerstellen im Ausdruck unbedingt notwendig! |
\\
==== Hinweise ====
* Vor seiner erstmaligen Benutzung muss das Programm **p2fCalc** in das Installationsverzeichnis von (p2f) kopiert worden sein. Der Aufruf im System-Anfragefeld kann dann, wie hier gezeigt, ohne Pfadangabe erfolgen.
* Das Programm **p2fCalc** kann nur über ein System-Anfragefeld mit Parametern aufgerufen werden. Der Grund dafür liegt darin, dass noch weitere Parameter benötigt werden, die vom Client oder Gateway vor dem eigentlichen Aufruf berechnet und in das sichtbare Aufrufkommando eingebaut werden müssen. In einer Konsole kann das Programm lediglich ohne Parameter aufgerufen werden, um die Hilfeinformation zu lesen.
* Alle numerischen Berechnungen erfolgen in Form von Gleitkommazahlen. Daher kann es in extremen Fällen, insbesondere bei Operationen mit dezimalen Brüchen und großen Zahlen (> 10E9), zu Ungenauigkeiten kommen, die im Zweifelsfall mit Rundungen aufgefangen werden müssen.
* Globaler Speicher für alle Clients und Gateways ist zur Zeit nur über den Umweg der Nutzung einer Datenbank mit Hilfe der ODBC-Felder unter Einsatz von SQL realisierbar.
* Ja, im obigen Beispiel könnte die Anzahl der Artikel auch einfach mit einem regulären Ausdruck ermittelt werden, der die höchste Lieferscheinposition findet. Hier sollte aber der gleichzeitige Einsatz mehrerer Berechnungen illustriert werden.