Mit einem bedingten Ausdruck kann die Verarbeitung der Kommandos ADD-CJC-ACTION, SKIP-COMMANDS oder WAIT-EVENT von Jobvariablenwerten abhängig gemacht werden. Ein bedingter Ausdruck kann „wahr“ oder „falsch” sein. Er besteht aus einem oder mehreren relationalen Ausdrücken <relation.ausdr>, die wie folgt aufgebaut werden können. Alternative Möglichkeiten sind durch „/” getrennt; wahlfreie Angaben sind in eckige Klammern eingeschlossen. Die Verwendung von Sonder-Jobvariablen in bedingten Ausdrücken ist nur beim Kommando SKIP-COMMANDS erlaubt.
<relation.ausdr> | ::= | (<term> <vergleichs-op> <term>) | |||||||||||
<term> | ::= | <jvid> / <jv-teilfolgen-def> / <konst> | |||||||||||
<vergleichs-op>
| ::= | < | / | > | / | = | / | <= | / | >= | / | <> | / |
| LT | / | GT | / | EQ | / | LE | / | GE | / | NE | ||
<jvid> | ::= | <jvname> / <*jvlink> / <#jvname> / <sonder-jvname> | |||||||||||
<jvname> | ::= | Name einer permanenten Benutzer-Jobvariablen | |||||||||||
<*jvlink> | ::= | Kettungsname einer Benutzer-Jobvariablen mit vorangestelltem Stern (*) | |||||||||||
<#jvname> | ::= | Name einer temporären Benutzer-Jobvariablen | |||||||||||
<sonder-jvname> | ::= | Name einer Sonder-Jobvariablen ohne Katalogkennung, aber mit Angabe der Benutzerkennung SYSJV | |||||||||||
<jv-teilfolgen-def> | ::= | (<jvid> [,[<start>][,<länge>]]) | |||||||||||
<start> | ::= | <integer 1..256> |
| Default-Wert = 1 | |||||||||
<länge> | ::= | <integer 1..64> | Default-Wert = 64 | ||||||||||
<konst> | ::= | <c-string 1..64> / <x-string 1..128> C'HALLO' bzw. 'HALLO' oder X'00FF' bzw. X'0FF' |
Hinweis
ACS ersetzt ggf. den bei <jv-name> angegebenen Aliasnamen einer JV durch ihren realen Pfadnamen (gemäß Aliaskatologeintrag).
Besonders zu beachten ist außerdem, dass Groß- und Kleinschreibung in bedingten Ausdrücken erhalten bleibt. Komplexe bedingte Ausdrücke ergeben sich durch Kombination von relationalen Ausdrücken mithilfe von logischen Operatoren:
<bed.ausdr> | ::= | (<relation.ausdr> <logisch.op> <relation.ausdr>) / | ||||
<logisch.op> | ::= | AND | / | OR | / | XOR |
| logisches UND | logisches ODER | exklusives ODER |
Beispiel
(JV1=C'START') ((JV2=C'O.K.') AND (*LINK<=C'12')) (((JV4,10,3)=C'NEU') OR (#TEMP.JV=C'Y') AND (*LINK2=X'00'))
Hinweis
Die Auswertung eines bedingten Ausdrucks erfolgt „von innen nach außen“ entsprechend der Klammerung. Auf der gleichen Klammerstufe werden die logischen Operationen in folgender Reihenfolge durchgeführt:
NOT
AND
OR
XOR
So wird z. B. der Ausdruck
(NOT (JV1=C'ABC') OR (JV2=C'Z') AND (JV3<>JV4))
ausgewertet wie
((NOT (JV1=C'ABC')) OR ((JV2=C'Z') AND (JV3<>JV4)))
Beim Vergleich von Jobvariablen-Werten sind einige Besonderheiten zu beachten:
die Auswertung relationaler Ausdrücke erfolgt byteweise von links nach rechts. Für das Vergleichsergebnis ist das jeweilige Bitmuster im EBCDI-Code maßgebend. So sind z.B. die abdruckbaren Ziffern 0 bis 9 (X'F0' bis X'F9') „größer” als Buchstaben A ... Z (X'C1' ... X'E9'), und Großbuchstaben größer als Kleinbuchstaben.
Liegt der Vergleichwert vollständig außerhalb des Defintionsbereichs einer Jobvariablen oder die Jobvariable ist leer (z.B. nach Deklaration), ist das Vergleichsergebnis in jedem Fall „falsch”, auch bei Abfrage auf „ungleich“ (<>). Dadurch geht z.B. das Kommando WAIT-EVENT in solchen Fällen stets in den Wartezustand und bemerkt es, wenn der gesuchte JV-Bereich später geschrieben wird und dann definiert ist.
Liegt der Vergleichswert nur teilweise im Definitionsbereich einer JV, wird seine Länge auf den aktuell definierten Teil der JV reduziert.
Beispiel: Wenn die Jobvariable X den Wert C'123456' enthält, wird die Teilfolge (X,3,8) ausgewertet wie (X,3,4). Dadurch liefert der Vergleich (X,3,8) = C'3456' das Ergebnis "gleich", obwohl der Vergleich einer 8-Byte-Folge mit einem 4-Byte-Wert syntaktisch unmöglich erscheint.
Beispiel
Die folgenden Ausdrücke sind „wahr”
C' ' < C'A' C'a' < C'A' X'81' < X'C1' C'A' < C'B' X'0123' < X'0124' C'B' < C'BB' X'C1' < X'C100' C'GUTEN ABEND' < C'GUTEN MORGEN' C'ZZZZZZZZZ' < C'0' (!) X'F0F0F0F0' < X'F1' C'8' < C'9' C'899999999' < C'9' (!) X'3FFF' < C' '
Die folgenden Abfragen werden mit „falsch” beantwortet.
(IN) CALL-PROC PROC.JV (IN) /BEG-PROC LOG=*ALL (IN) /CRE-JV JV=JV1 (IN) /SKIP-COMMAND TO-LABEL=END,IF=JV(COND=((JV1,11,1) NE '2') (OUT) % CJC0011 SKIP-COMMANDS: CONDITION = FALSE (IN) /MOD-JV JV=(JV-NAME=JV1,POS=1,LENGTH=5),SET-VALUE=C'12345' (IN) /SKIP-COMMAND TO-LABEL=END,IF=JV(COND=((JV1,6,2) EQ 'A1') (OUT) % CJC0011 SKIP-COMMANDS: CONDITION = FALSE (IN) /SKIP-COMMAND TO-LABEL=END,IF=JV(COND=((JV1,6,2) NE 'A1') (OUT) % CJC0011 SKIP-COMMANDS: CONDITION = FALSE (IN) /.END END-PROC
Ein bedingter Ausdruck wird in folgenden Fällen zurückgewiesen:
Eine JV, auf die Bezug genommen wird, ist nicht zugreifbar (zerstörter Katalog).
Eine JV, auf die Bezug genommen wird, ist im angegebenen Katalog nicht vorhanden.
Der Benutzer ist zum Lesezugriff nicht berechtigt bzw. das für den Lesezugriff erforderliche Kennwort ist nicht in der Kennwort-Tabelle des Auftrags eingetragen.