Anwendungsgebiet: PROCEDURE
Kommandobeschreibung
Mit DECLARE-VARIABLE werden die Attribute dieser Variablen und evtl. auch ein Anfangswert festgelegt.
Die Einbindung von Jobvariablen in SDF-P ist über den Operanden CONTAINER möglich.
Es ist möglich, in einer lokalen Prozedur eine sonst nur dort zugängliche S-Variable für eine durch CALL-PROCEDURE gerufene Prozedur zugreifbar zu machen. Dazu muss in der lokalen Prozedur /DECLARE-VARIABLE VARIABLE-NAME=...,SCOPE = *CURRENT oder SCOPE = PROCEDURE (IMPORT-ALLOWED=*YES) angegeben werden und in der gerufenen Prozedur /IMPORT-VARIABLE VARIABLE-NAME=...,FROM=*SCOPE(SCOPE=*CALLING-PROCEDURES).
Format
DECLARE-VARIABLE |
VARIABLE-NAME = list-poss(2000): <structured-name 1..20>(...) <structured-name 1..20>(...) INITIAL-VALUE = *NONE / <text 0..1800 with-low expr> ,TYPE = *ANY / *STRING / *INTEGER / *BOOLEAN / *STRUCTURE(...) *STRUCTURE(...) DEFINITION = *DYNAMIC / *BY-SYSCMD / <structured-name 1..20> ,MULTIPLE-ELEMENTS = *NO / *ARRAY(...) / *LIST(...) *ARRAY(...) LOWER-BOUND = 0 / *NONE / <integer -2147483648..2147483647> ,UPPER-BOUND = *NONE / <integer -2147483648..2147483647> *LIST(...) LIMIT = *NONE / <integer 1..2147483647> ,SCOPE= *CURRENT(...) / *PROCEDURE(...) / *TASK(...) *CURRENT(...) IMPORT-ALLOWED = *NO / *YES *PROCEDURE(...) IMPORT-ALLOWED = *NO / *YES *TASK(...) STATE = *ANY / *NEW / *OLD ,CONTAINER= *STD / <composed-name 1..64> / *VARIABLE(...) / *JV(...) *VARIABLE(...) VARIABLE-NAME = <structured-name 1..20> ,SCOPE= *VISIBLE / *TASK *JV(...) JV-NAME= <filename 1..54> ,STATE= *ANY / *NEW / *OLD |
Operandenbeschreibung
VARIABLE-NAME = list-poss (2000): <structured-name 1..20>(...)
Deklariert den Variablennamen, das heißt den Namen einer einfachen Variablen (die nicht Element einer zusammengesetzten Variablen ist) oder den Namen einer zusammengesetzten Variablen.
INITIAL-VALUE = *NONE
Die Variable wird nicht initialisiert.
Das bedeutet für eine neue Variable: sie erhält keinen Anfangswert; ein Lesezugriff würde einen Fehler verursachen.
Ist die Variable bereits vorhanden, bleibt ihr Inhalt unverändert, ihr wird kein neuer Anfangswert zugewiesen.
INITIAL-VALUE = <text 0..1800 with-low expr>
Weist einer neuen Variablen einen Anfangswert zu; der Wert muss zum Datentyp der Variablen passen, er kann auch als Ausdruck angegeben werden.
Bei bereits bestehenden Variablen wird die Angabe ignoriert; ihnen wird kein neuer Anfangswert zugewiesen.
Zusammengesetzte Variablen können nicht als Ganzes initialisiert werden, das heißt, es darf ihnen mit INITIAL-VALUE kein Anfangswert zugewiesen werden.
TYPE =
Weist der Variablen den Datentyp zu.
TYPE = *ANY
Der Variablen können beliebig wechselnde Werte der Datentypen STRING, INTEGER und BOOLEAN zugewiesen werden.
TYPE = *STRING
Weist der Variablen den Datentyp STRING zu.
Wertebereich: beliebige Zeichenkette
TYPE = *INTEGER
Weist der Variablen den Datentyp INTEGER zu.
Wertebereich: Ganzzahl zwischen -231 und 231-1
TYPE = *BOOLEAN
Weist der Variablen den Datentyp BOOLEAN zu.
Wertebereich: TRUE, FALSE, YES, NO, ON, OFF.
TYPE = *STRUCTURE(...)
Deklariert eine zusammengesetzte Variable vom Typ Struktur.
DEFINITION = *DYNAMIC
Dynamisch erweiterbare Struktur
DEFINITION = *BY-SYSCMD
Statische Struktur, deren Elemente anschließend durch ein Kommando im SYSCMD-Strom deklariert werden.
DEFINITION = <structured-name 1..20>
Name des Strukturlayouts.
MULTIPLE-ELEMENTS = *NO
Bestimmt, dass die Variable kein Array und keine Liste ist.
MULTIPLE-ELEMENTS = *ARRAY(...)
Deklariert eine zusammengesetzte Variable vom Typ Array.
LOWER-BOUND = 0 / <integer -2147483648..2147483647>
Untere Grenze für den Arrayindex
LOWER-BOUND = *NONE
Es wird keine untere Grenze für den Arrayindex festgelegt.
UPPER-BOUND = *NONE
Es wird keine obere Grenze für den Arrayindex festgelegt.
UPPER-BOUND = <integer -2147483648..2147483647>
Obere Grenze für den Arrayindex. Der angegebene Wert muss größer oder gleich dem Wert bei LOWER-BOUND sein.
MULTIPLE-ELEMENTS = *LIST(...)
Deklariert eine zusammengesetzte Variable vom Typ Liste.
LIMIT = *NONE
Die Anzahl der Listenelemente wird nicht begrenzt.
LIMIT = <integer 1..2147483647>
Maximale Anzahl der Listenelemente.
SCOPE =
Definiert den Geltungsbereich der Variablen.
SCOPE = *CURRENT(...)
Die Variable ist eine prozedurlokale Variable.
Entspricht in Call-Prozeduren der Angabe PROCEDURE.
In Include-Prozeduren bedeutet CURRENT, dass die Variable in der aktuellen Include-Prozedur angelegt wird. Sie ist dann in dieser Include-Prozedur und in allen tiefergeschachtelten Include-Prozeduren sichtbar (= Geltungsbereich Include).
IMPORT-ALLOWED =
Gibt an, ob die Variable mit IMPORT-VARIABLE in der gerufenen Prozedur importiert werden kann.
IMPORT-ALLOWED = *NO
Die Variable kann nicht mit IMPORT-VARIABLE in der gerufenen Prozedur importiert werden.
IMPORT-ALLOWED = *YES
Die Variable kann mit IMPORT-VARIABLE in der gerufenen Prozedur importiert werden.
SCOPE = *PROCEDURE(...)
Die Variable ist eine prozedurlokale Variable mit dem Geltungsbereich Prozedur.
Die Variable wird in der aktuellen Prozedur angelegt.
Bei Include-Prozeduren ist die aktuelle Prozedur jeweils die umgebende Call-Prozedur, von der aus die Include-Prozedur aufgerufen wurde.
Die Variable ist in dieser Prozedur sichtbar sowie in allen tiefergeschachtelten Include-Prozeduren.
IMPORT-ALLOWED =
Gibt an, ob die Variable mit IMPORT-VARIABLE in der gerufenen Prozedur importiert werden kann.
IMPORT-ALLOWED = *NO
Die Variable kann nicht mit IMPORT-VARIABLE in der gerufenen Prozedur importiert werden.
IMPORT-ALLOWED = *YES
Die Variable kann mit IMPORT-VARIABLE in der gerufenen Prozedur importiert werden.
SCOPE = *TASK(...)
Die Variable ist eine taskglobale Variable.
Wird sie in einer Include-Prozedur angelegt, so ist sie auch in der umgebenden Call-Prozedur, von der aus die Include-Prozedur aufgerufen wurde, und in allen tiefergeschachtelten Include-Prozeduren sichtbar.
STATE = *ANY
Existiert in der Task bereits eine Variable mit dem angegebenen Namen, so wird diese verwendet, andernfalls wird eine neue Variable deklariert.
STATE = *NEW
In der Task darf keine Variable mit dem angegebenen Namen existieren.
STATE = *OLD
In der Task muss eine Variable mit dem angegebenen Namen existieren. Die aktuelle Variablendeklaration muss dann mit der Deklaration der bereits vorhandenen Variablen übereinstimmen.
CONTAINER = *STD
Der Variablen wird kein Variablenbehälter zugeordnet. Der Wert der Variablen wird im Klasse-5-Speicher abgelegt.
CONTAINER = <composed-name 1..64>
Verbindet die aktuell deklarierte Variable mit dem hier angegebenen Variablenbehälter. Dieser Variablenbehälter muss geöffnet sein. Die Angabe von „STD“ ist hier nicht erlaubt, da „STD“ nicht als permanent-bestehender Variablenbehälter interpretiert wird.
CONTAINER = *VARIABLE(...)
Verbindet die aktuell deklarierte Variable über einen Link-Mechanismus mit einer anderen Variablen, die in dieser Prozedur bereits definiert ist. Diese Variable wird dann als Variablenbehälter bezeichnet.
Strukturelemente können nicht als Variablenbehälter angegeben werden.
VARIABLE-NAME = <structured-name 1..20>
Name einer Variablen, die in der Prozedur bereits definiert wurde. Die Attribute der Variablen, die als Variablenbehälter dient, und der aktuell deklarierten Variablen müssen miteinander verträglich sein.
SCOPE =
Geltungsbereich der Behälter-Variablen
SCOPE = *VISIBLE
Die Variable ist sichtbar.
SCOPE = *TASK
Task-Variable
CONTAINER = *JV(...)
Definiert eine Jobvariable als Variablenbehälter: Die aktuell deklarierte Variable wird mit einer Jobvariablen verbunden, d. h., der Wert der Variablen wird in der Jobvariablen abgelegt.
Variablenbehälter vom Typ JV können nur mit einfachen Variablen verbunden werden, die mit TYPE = *STRING deklariert wurden, wobei der String höchstens 256 Bytes lang sein darf.
Zusammengesetzte Variablen können nicht mit Variablenbehältern vom Typ JV verbunden werden.
Wird eine taskglobale Variable (SCOPE = *TASK) mit einer Jobvariablen verbunden, so müssen die STATE-Angaben in TASK- und JV-Operanden sinnvoll zusammenpassen. Dabei muss verhindert werden, dass die Neudeklaration einer bereits vorhandenen taskglobalen Variablen eine Jobvariable neu erzeugt.
Jobvariablen sind Bestandteil des kostenpflichtigen Softwareprodukts „Jobvariablen“. Sie sind nur dann verfügbar, wenn das Subsystem JV geladen ist. Nähere Informationen zu Jobvariablen enthält das Handbuch „Jobvariablen“ [5].
JV-NAME = <filename 1..54>
Name der Jobvariablen
STATE = *ANY
Existiert bereits eine Jobvariable dieses Namens, so wird diese Jobvariable verwendet, andernfalls wird eine neue Jobvariable angelegt.
STATE = *OLD
Die Jobvariable muss bereits existieren.
STATE = *NEW
Es wird eine neue Jobvariable angelegt, die Jobvariable darf noch nicht existieren.
Kommando-Returncode
(SC2) | SC1 | Maincode | Bedeutung / garantierte Meldungen |
0 | CMD0001 | Ohne Fehler | |
1 | 0 | CMD0001 | Warnung; Element schon deklariert |
1 | CMD0202 | Syntaxfehler | |
3 | CMD2203 | Falsche Syntaxdatei | |
32 | CMD0221 | Systemfehler (interner Fehler) | |
64 | CMD0216 | Erforderliches Privileg fehlt | |
64 | SDP0091 | Semantikfehler | |
130 | SDP0099 | Kein Adressraum mehr verfügbar |
Beispiel 1
/DECLARE-VARIABLE A, SCOPE = *TASK
Die Variable A wird als taskglobale Variable mit TYPE = *ANY deklariert.
Beispiel 2
/DECLARE-VARIABLE DATA(C'ANTON',*ANY)
Die prozedurlokale Variable DATA mit Typ *ANY wird mit dem String 'ANTON' initialisiert.
Beispiel 3
/DECLARE-VARIABLE LOGO(TRUE, *BOOLEAN)
Die lokale boolesche Variable LOGO wird mit dem booleschen Wert TRUE belegt.
Beispiel 4
/DECLARE-VARIABLE LEN, SCOPE = *TASK
Die Variable LEN wird deklariert.
Beispiel 5
/DECLARE-VARIABLE ANF, TYPE = *STRING, SCOPE = *TASK, CONTAINER = *JV- /(ANFANG.DAT)
Die Jobvariable ANFANG.DAT wird gesucht. Wird sie nicht gefunden, so wird eine Jobvariable dieses Namens katalogisiert. Der Wert von ANF wird immer in der Jobvariablen ANFANG.DAT abgelegt.
Beispiel 6
Auf der Kennung wird eine taskglobale Variable mit Namen A deklariert:
/DECLARE-VARIABLE A, SCOPE = *TASK
Es wird eine Prozedur erstellt, die eine Variable mit Namen A als SCOPE = *PROCEDURE deklariert:
/SET-PROCEDURE-OPTIONS /DECLARE-VARIABLE A, SCOPE = *PROCEDURE ... /A = FILE1 /DELETE-FILE &A ... .... /CREATE-FILE &A, ... /...
Bei jeder Verwendung von &A innerhalb der Prozedur wird auf den Inhalt der lokalen Variable zugegriffen.
Beispiel 7
Auf der Kennung existiert eine taskglobale Variable VAR-A:
/DECLARE-VARIABLE VAR-A, SCOPE = *TASK /VAR-A = 'TASK VARIABLE DER BENUTZERKENNUNG'
Die Prozedur PROZEDUR.1 wird aufgerufen:
PROZEDUR.1 /SET-PROCEDURE-OPTIONS /DECLARE-VARIABLE VAR-A, SCOPE = *PROCEDURE /VAR-A = 'LOKALE VARIABLE AUS PROZEDUR 1' /CALL-PROCEDURE PROZEDUR.2 /SHOW-VARIABLE VAR-A
Ausgegeben wird: 'LOKALE VARIABLE AUS PROZEDUR 1'; VAR-A ist in dieser Prozedur als lokale Variable deklariert worden.
PROZEDUR.2 /SET-PROCEDURE-OPTIONS /DECLARE-VARIABLE VAR-A, SCOPE = *TASK /SHOW-VARIABLE VAR-A
Ausgegeben wird: 'TASK VARIABLE DER BENUTZERKENNUNG', da auf die globale Variable zugegriffen wird.
Beispiel 8
Beispiel für eine erweiterbare Struktur, auch wenn implizite Deklarationen verboten sind:
/DECLARE-VARIABLE A(TYPE = *STRUCTURE(*DYNAMIC)) /SET-VARIABLE A.B = 7 /SET-VARIABLE A.X = TRUE /SET-VARIABLE A#1 = 0 "Fehler Array-Elementname"
Die Struktur enthält jetzt die Elemente A.B und A.X.
Beispiel 9
Elemente von dynamischen Strukturen können auch explizit deklariert werden:
/DECLARE-VARIABLE A(TYPE = *STRUCTURE(*DYNAMIC)) /DECLARE-ELEMENT A.B(7, *INTEGER) /DECLARE-ELEMENT A.X(TRUE, *BOOLEAN) /SET-VARIABLE A#1 = 0 "Fehler Array-Elementname"
Die Struktur enthält jetzt die Elemente A.B und A.X.
Beispiel 10
Bevor eine Variable bei der Deklaration mit einem Variablenbehälter verbunden wird, müssen die Strukturlayouts deklariert sein. Die Strukturlayouts müssen kompatibel sein (in Relation zum SET-VARIABLE-Kommando) mit der Struktur der Variablen, die in den Variablenbehälter gesichert wurde.
/BEGIN-STRUCTURE MYSTRUCT / DECLARE-ELEMENT ELEM1 / DECLARE-ELEMENT ELEM2 /END-STRUCTURE /OPEN-VARIABLE-CONTAINER MYCONT,FROM-FILE=*LIB-ELEM(MY-LIBRARY), - / AUTOMATIC-DECLARE=*NONE /DECLARE-VARIABLE MYVAR(TYPE=*STRUCTURE(MYSTRUCT)), CONTAINER=MYCONT / "MYVAR WIRD IM VARIABLENBEHAELTER ERZEUGT" /MYVAR.ELEM1 = 'FIRST VALUE' /MYVAR.ELEM2 = 'SECOND VALUE' /SAVE-VARIABLE-CONTAINER MYCONT / /"NUN WIRD DAS LAYOUT MYSTRUCT GEAENDERT(EIN ELEMENT WIRD UNTERDRUECKT," /"EIN ANDERES NEU ANGEFUEGT)" /BEGIN-STRUCTURE MYSTRUCT / DECLARE-ELEMENT ELEM2 / DECLARE-ELEMENT NEU-ELEM /END-STRUCTURE /OPEN-VARIABLE-CONTAINER MYCONT,FROM-FILE=*LIB-ELEM(MY-LIBRARY), - / AUTOMATIC-DECLARE=*NONE /DECLARE-VARIABLE MYVAR(TYPE=*STRUCTURE(MYSTRUCT)), CONTAINER=MYCONT / "MYVAR WIRD VOM VARIABLENBEHAELTER GEHOLT" /SHOW-VARIABLE MYVAR MYVAR.ELEM2 = SECOND VALUE
Weiteres Beispiel siehe IMPORT-VARIABLE.Es wird nur MYVAR.ELEM2 ausgegeben, da MYVAR.ELEM1 unterdrückt wurde und MYVAR.NEU-ELEM bis jetzt nicht initialisiert wurde.