Ausdrucksersetzung spielt eine wichtige Rolle beim Aufruf von Kommandos. Sie ermöglicht es, Kommandos dynamisch zu erzeugen und den Inhalt von Prozedurzeilen zu ändern. (Nähere Informationen über Ausdrücke enthält das Kapitel „Ausdrücke“.)
Ausdrucksersetzung läuft so ab, dass nicht die endgültigen Eingaben bzw. Eingabeteile angegeben werden, sondern nur Platzhalter, die erst zum Ablaufzeitpunkt durch aktuelle Werte ersetzt werden.
Escape-Zeichen
Als Escape-Zeichen wird das Zeichen bezeichnet, das die Ausdrucksersetzung einleitet. Es wird dem zu ersetzenden Ausdruck direkt vorangestellt und deutet an, dass die folgenden Zeichen nicht den aktuellen Operandenwert sondern einen Platzhalter darstellen.
Für das Escape-Zeichen werden zwei Anwendungen unterschieden:
Kommandos und Anweisungen
Datenzeilen
Für Kommandos und Anweisungen gilt das Zeichen & als Escape-Zeichen.
Welches Zeichen in Datenzeilen als Escape-Zeichen verwendet werden soll, kann im Prozedurkopf mit dem Kommando SET-PROCEDURE-OPTIONS vereinbart werden (Operand DATA-ESCAPE-CHAR). Zur Wahl stehen die Zeichen &, #, *, @ und $.
Standardmäßig findet in Datenzeilen keine Ausdrucksersetzung statt; es gilt DATA-ESCAPE-CHAR = *NONE.
Da das Zeichen & das Standard-Escape-Zeichen ist, wird die Ausdrucksersetzung im folgenden auch als &-Ersetzung bezeichnet.
Wird einem Ausdruck bzw. einer Variablen ein Escape-Zeichen vorangestellt, wird der Wert dieses Ausdrucks bzw. dieser Variablen nicht direkt vom Kommando verarbeitet wird, sondern so als ob der Wert statt der Escape-Zeichenfolge im Eingabesatz geschrieben steht. (Direkte Ausdrucksersetzung, z.B. /SET-VARIABLE A=B, wird von einem Kommando nur dann ausgeführt, wenn das Kommando einen Ausdruck unterstützt, ansonsten müssen Escape-Zeichenfolgen verwendet werden.)
Die in den folgenden Abschnitten beschriebenen Regeln gelten sowohl für die Ausdrucksersetzung in Kommandos und Anweisungen als auch in Datenzeilen.
Beispiel
/SHOW-FILE-ATTRIBUTES &DATEI
Es werden die Dateiattribute einer Datei angezeigt, deren Name in der Variablen DATEI hinterlegt ist.
Syntax
In strukturierten Prozeduren kann das Escape-Zeichen nicht nur auf Variablen (einschließlich Prozedurparameter) angewendet werden, sondern auch auf Funktionen und Ausdrücke sowie auf Jobvariablen. Für die Ausdrucksersetzung gilt folgende Syntax:
&(ausdruck) |
oder:
&name |
Es bedeuten:
& | Escape-Zeichen |
ausdruck: | Ausdruck oder Name einer Jobvariablen |
name: | Name einer Variablen (wenn sie keinen Punkt enthält) oder Name einer vordefinierten Funktion ohne Parameter |
Regeln
„ausdruck“ wird ausgewertet, der Ergebniswert in den Datentyp STRING konvertiert und anschließend als aktueller Operandenwert eingesetzt.
Ist „ausdruck“ ein Funktionsaufruf in der Form &(funktion( )), wird diese Funktion ausgeführt und das Ergebnis der Funktion als aktueller Parameterwert eingesetzt. Der Funktionsaufruf kann Eingabeparameter enthalten.
Ist „ausdruck“ ein Name, wird zunächst eine Variable mit dem entsprechenden Variablennamen gesucht. Kompatibel zu Nicht-S-Prozeduren wird eine Angabe &(name) folgendermaßen ausgewertet:
Es wird eine Variable dieses Namens gesucht.
Wenn es keine solche Variable gibt, wird eine Funktion dieses Namens gesucht.
Wenn es weder eine Variable noch eine Funktion mit dem angegebenen Namen gibt, hängt es von der Einstellung des Operanden JV-REPLACEMENT im Kommando SET-PROCEDURE-OPTIONS bzw. MODIFY-PROCEDURE-OPTIONS ab, ob eine entsprechende Jobvariable gesucht wird. Wird hier der Wert *AFTER-BUILTIN-FUNCTION eingestellt, wird eine Jobvariable gesucht; wird der Wert *NONE eingestellt, wird keine Jobvariable gesucht.
Wenn der angegebene Name weder eine Variable noch eine Funktion oder Jobvariable bezeichnet, wird die Fehlerbehandlung angestoßen.
Auf das Escape-Zeichen darf als erstes Zeichen folgen:
eine offene Klammer (als Trennzeichen (Angabe: &(ausdruck))
das erste Zeichen des Namens einer Variablen oder einer Funktion (Angabe: &name)
Damit im Text &-Zeichen erhalten bleiben, die sonst als Escape-Zeichen wirken würden, sollen einfache durch doppelte Escape-Zeichen (&&) ersetzt werden.
Wenn auf „name“ ein Punkt „.“ folgt, geht dieser Punkt bei der Ausdrucksersetzung verloren (kompatibel mit Nicht-S-Prozeduren).
Wenn auf „name“ Sonderzeichen folgen, werden diese als Trennzeichen interpretiert. Bindestriche im Namen werden im Gegensatz zu Nicht-S-Prozeduren mitübersetzt und wirken nicht als Trennzeichen (Beispiel: &JOB-CLASS wird ersetzt durch die aktuelle Jobklasse, z. B. JCB00200).
Kommandos oder Datenzeilen können beliebig viele Ausdrucksersetzungen enthalten.
Ausdrucksersetzungen dürfen geschachtelt werden; rekursive Ausdrucksersetzung ist jedoch nicht möglich. Wird &(ausdruck) z.B. durch die Zeichen A + &B ersetzt, wird &B nicht weiter ausgewertet; das Zeichen & bei B bleibt erhalten.
Vor oder in einer Marke darf keine Ausdrucksersetzung durchgeführt werden.
Wenn bei der Ausdrucksersetzung ein Fehler auftritt, wird standardmäßig die Fehlerbehandlung ausgelöst. Die Fehlerbehandlung kann für Datensätze unterbunden werden, wenn der Operand DATA-ERROR-HANDLING = *NO im Kommando SET-PROCEDURE-OPTIONS angegeben wird.
Wenn eine Prozedurzeile ein einzeln stehendes &-Zeichen enthält, wird ebenfalls die Fehlerbehandlung ausgelöst.
Einschränkungen
Zeichen oder Namen, die nicht durch Ausdrucksersetzung erzeugt werden dürfen:
Fortsetzungszeichen am Ende einer Prozedurzeile
Escape-Zeichen, das dann rekursiv wirksam sein soll
das Trennzeichen für Kommandos oder Anweisungen (Semikolon „;“)
Sprungmarken oder Blocknamen
Kommandos, die nicht durch Ausdrucksersetzung erzeugt werden dürfen:
SDF-P-Kontrollflusskommandos:
BEGIN-BLOCK BEGIN-PARAMETER-DECLARATION CYCLE DECLARE-PARAMETER ELSE, ELSE-IF END-BLOCK, END-FOR, END-IF, END-WHILE END-PARAMETER-DECLARATION EXIT-BLOCK FOR GOTO IF, IF-BLOCK-ERROR, IF-CMD-ERROR INCLUDE-BLOCK REPEAT UNTIL WHILE
AID-Kommandos, denen eine Kommandoliste oder Subkommandoliste folgt (siehe Handbuch „AID (BS2000)“ [6])
das Kommando SET-JOB-STEP (siehe Handbuch „Kommandos“ [3])
OPEN-VARIABLE-CONTAINER im DECLARE-PARAMETER-Block vor dem ersten DECLARE-PARAMETER-Kommando.
In einigen Kommandos, die als Operanden eine Sprungmarke oder einen Blocknamen erwarten, findet aus Sicherheitsgründen keinerlei Ausdrucksersetzung statt - auch nicht in anderen Operanden. Dies betrifft die Kommandos:
GOTO,
INCLUDE-BLOCK,
EXIT-BLOCK,
CYCLE