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 print2forms 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 print2forms zur Verfügung. Das Programm wurde als sogenannte Systemfeldapplikation geschrieben, die nur innerhalb eines print2forms-Formulars in einen System-Anfragefeld verwendet werden kann.

Die Leistungsmerkmale dieses Taschenrechners sind:

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:
  <expr>   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:

   <sequence>   ::= <compute> | <compute> ';' <sequence>
 
   <compute>    ::= <assignment> | <expression>
 
   <assignment> ::= <variable> '=' <expression> |
                    <variable> '=' '’' <char> * '’'
 
   <expression> ::= <term> |
                    <term> '+' <term> | 
                    <term> '-' <term>
 
   <term>       ::= <binary> |
                    <binary> '*' <binary> |
                    <binary> '/' <binary> |
                    <binary> '%' <binary>
 
   <binary>     ::= <unary> | 
                    <unary> '^' <unary>
 
   <unary>      ::= <factor> |
                    '+' <factor> |
                    '-' <factor> 
 
   <factor>     ::= '(' <expression> ')' |
                    <number> |
                    <constant> |
                    <variable> |
                    <function> '(' <expression> ')'
 
   <constant>   ::= 'pi'  | 'e'   | 'BEF' | 'DEM' | 'EEK' | 'FIM' | 'FRF' | 
                    'GRD' | 'IEP' | 'ITL' | 'LUF' | 'MTL' | 'NLG' | 'ATS' |
                    'PTE' | 'SIT' | 'SKK' | 'ESP' | 'CYP'
 
   <function>   ::= 'abs'  | 'acos' | 'asin'  | 'atan' | 'ceil'  | 'cos' |   
                    'cosh' | 'exp'  | 'floor' | 'log'  | 'log10' | 'sin' |   
                    'sinh' | 'sqrt' | 'tan'   | 'tanh' | 'max'   | 'min' |
                    'round'
 
   <variable>   ::= ( 'A' .. 'Z', 'a' .. 'z' ) +
 
   <number>     ::= ( '0' .. '9' ) + | 
                    ( '0' .. '9' ) + '.' ( '0' .. '9' ) +
 
   <char>       ::= '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 print2forms 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:

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.


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 <OVL/AYAZVEG/AYI3CPQ.XML> subform <OVL/KOPF.XML>
6 2015…27  Load 'DAT/RES/KOPF.PCL' (14655)
0 2015…27  Macro 403 loaded with <OVL/KOPF.XML>
6 2015…27  Form <OVL/AYAZVEG/AYI3CPQ.XML> subform <OVL/FUSS.XML>
6 2015…27  Load 'DAT/RES/FUSS.PCL' (5789)
0 2015…27  Macro 405 loaded with <OVL/FUSS.XML>
6 2015…27  Load 'DAT/RES/LIEFER.PCL' (27218)
0 2015…27  Macro 409 loaded with <OVL/AYAZVEG/AYI3CPQ.XML>
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 <OVL/AYAZVEG/AYAZ-XR.XML> (1872)
6 2015…27  Access <RES/LIEFERS.XML> (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 -c 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 „Artikel='PS/2 USB 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 PreisDM=PreisEUR/DEM Rechnet einen Preis in Euro (in der Variablen PreisEUR) in Deutsche Mark um, und speichert ihn in der Variablen PreisDM.
p2fCalc „PreisDM = PreisEUR / DEM“ Gleichbedeutend wie zuvor. Die doppelten Anführungszeichen sind wegen der Leerstellen im Ausdruck unbedingt notwendig!


Hinweise