Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

S-Variable als Behälter

&pagelevel(5)&pagelevel

Eine S-Variable kann Variablenbehälter für eine andere S-Variable sein. Allerdings müssen beide (Variablenbehälter und Variable) mit dem gleichen Variablen- und Datentyp deklariert werden und der Behälter muss die gleiche oder eine längere Lebensdauer als die Variable haben (die Lebensdauer ist durch den Geltungsbereich festgelegt).

Es gibt zwei verschiedene Möglichkeiten, S-Variablen als Variablenbehälter zu bestimmen, je nach dem wie dauerhaft die Variablen gespeichert werden sollen. So können Variablen nicht-permanent oder permanent durch Variablenbehälter gespeichert werden.

Hinweis

In Kommandobausteinen oder System-Ausgaberoutinen sind oft Variablennamen vorgegeben. Diese reservierten Variablennamen können im Operanden CONTAINER als Name der Behältervariablen eingesetzt werden. Der Benutzer erspart sich so das Umspeichern der vom System gelieferten Informationen in andere Variablen, die in der Prozedur gelten. Reservierte Wörter und Variablennamen sind im Abschnitt „Variablennamen“ (Variablennamen ), aufgelistet.

Variablenbehälter für nicht-permanente Variablen

Soll eine Variable in einem Variablenbehälter nicht permanent gespeichert werden (d.h. sie ist höchstens bis zum Taskende vorhanden), muss der Variablenbehälter nur eine standardmäßig deklarierte Variable sein. Der Inhalt der zu speichernden Variablen wird in diesem Fall mit dem Variablenbehälter im Klasse-5-Speicher abgelegt.

Über den Behälter-Mechanismus können so auch taskglobale Variablen unter einem anderen Namen zugreifbar gemacht werden, wodurch eventuelle Namenskonflikte leichter umgangen werden können.

Variablenbehälter für permanente Variablen

Permanente Variablenbehälter werden in PLAM-Bibliotheken abgespeichert.

Geöffnet (bzw. wenn noch nicht vorhanden, auch erzeugt) werden diese Behälter durch das Kommando OPEN-VARIABLE-CONTAINER. Geschlossen werden sie explizit durch das Kommando CLOSE-VARIABLE-CONTAINER oder implizit durch Prozedur- bzw. Taskende (EXIT-PROCEDURE bzw. EXIT-JOB). Gesichert werden diese Variablenbehälter in PLAM-Bibliothekselemente mit dem Kommando SAVE-VARIABLE-CONTAINER. Informationen über offene Variablenbehälter können zudem mit SHOW-VARIABLE-CONTAINER-ATTR in strukturierte Ausgaben umgelenkt werden.

Wenn der Variablenbehälter geöffnet ist, kann auf die darin enthaltenen S-Variablen zugegriffen werden.

Eine Anwendungsmöglichkeit von permanenten Variablen ist, dass damit Prozedurparameter initialisiert werden können. Denn OPEN-VARIABLE-CONTAINER kann im Prozedurkopf zwischen BEGIN-PARAMETER-DECLARATION und dem ersten DECLARE-PARAMETER angegeben werden; d.h. ein Variablenbehälter kann vor der ersten Deklaration eines Parameters geöffnet werden, und somit können die darin deklarierten Variablen den jeweiligen Parameter initialisieren. (Mit der Voreinstellung *ALL in OPEN-VARIABLE-CONTAINER beim Operanden AUTOMATIC-DECLARE ist auch sichergestellt, dass standardmäßig alle im Variablenbehälter enthaltenen Variablen schon (vor-)deklariert sind. Der Geltungsbereich der Variablen ist dann der des Variablenbehälters.)

Wenn ein Parameter denselben Namen hat wie eine durch das Öffnen des Variablenbehälters deklarierte Variable, wird er zurückgewiesen und der Prozeduraufruf abgebrochen.

Hinweise

  • Zur OPEN-VARIABLE-CONTAINER-Zeit ist das Bibliothekselement entweder nach dem Lesen geschlossen (LOCK-ELEMENT = *NO) oder nicht (LOCK-ELEMENT = *YES). D.h. Bibliothekselemente können daher entweder für mehrere Tasks oder nur für eine (exklusiver Zugriff) benützt werden.

  • Wenn ein Variablenbehälter mit LOCK-ELEMENT = *YES geöffnet ist, werden alle nachfolgenden Öffnungsversuche in derselben oder in anderen Tasks abgewiesen.

  • Alle Variablenattribute mit Ausnahme des Geltungsbereichs werden im Variablenbehälter gesichert. Das sind im einzelnen: Typ, Name der Struktur, Array- und Listen-Grenzen.

  • Der Variablenbehälter wird automatisch ohne Angabe von CLOSE-VARIABLE-CONTAINER beim Prozedurende geschlossen, wenn beim Öffnen SCOPE = *CURRENT eingestellt wurde oder bei einem untergeordneten Aufruf SCOPE = *PROCEDURE. Auch bei Taskende wird der Variablenbehälter automatisch geschlossen, wenn SCOPE = *TASK angegeben wurde.

  • Allerdings wird dabei mit Ausnahme des letzten Falls der Variablenbehälter nicht gesichert; und im letzten Fall erfolgt auch nur eine Sicherung, wenn SAVE-AT-TERMINATION = *YES eingestellt wurde.

PLAM-Bibliothekselemente als Ablage für Variablenbehälter werden folgendermaßen definiert (siehe auch Handbuch „LMS“ [11]):

  • Variablenbehälter werden als PLAM-Bibliothekselemente mit TYPE = SYSVCONT in LMS aufgenommen. Sie können so von SDF-P und FHS benützt werden.

  • Wenn das angegebene Bibliothekselement beim Öffnen noch nicht existiert, wird es bei der Einstellung LOCK-ELEMENT = *YES mit dem Öffnen erzeugt, bei der Einstellung LOCK-ELEMENT = *NO mit dem Sichern.

  • Wenn das Element beim Öffnen gesperrt ist, kann es nicht mit /SAVE-VARIABLE-CONTAINER CONTAINER-NAME = <composed-name 1..64>(ELEMENT-VERSION = *INCREMENT) gesichert werden.

  • Wenn die Element-Version beim Öffnen nicht angegeben wird und das Element noch nicht existiert, wird das Element mit der höchst möglichen Version X'FF' erzeugt.

  • Wenn die Element-Version beim Öffnen nicht angegeben wird, aber das Element schon existiert, wird es in der höchsten Version eröffnet.

  • Wenn eine Element-Version außer *UPPER-LIMIT (in LMS) beim Öffnen eingestellt ist und das Element nicht existiert, kann es nach dem Öffnen und Erzeugen mit /SAVE-VARIABLE-CONTAINER CONTAINER-NAME = <composed-name 1..64>(ELEMENT-VERSION = *INCREMENT) gesichert werden.

  • Wenn ein Element mit /SAVE-VARIABLE-CONTAINER CONTAINER-NAME = <composed-name 1..64>(ELEMENT-VERSION = *SAME) gesichert wird, wird es auf Grund der Öffnen-Einstellung LOCK-ELEMENT = *YES in derselben Version zurückgeschrieben, auf Grund der Öffnen-Einstellung LOCK-ELEMENT = *NO in der höchsten Version.

  • Wenn ein Element mit /SAVE-VARIABLE-CONTAINER CONTAINER-NAME = <composed-name 1..64>(ELEMENT-VERSION = *INCREMENT) gesichert wird, wird der Zuwachs beim Sichern und nicht beim nächsten Öffnen angehängt.

Beispiel

Eingabe

/OPEN-VARIABLE-CONTAINER CONT, *LIBRARY-ELEMENT(#MY-CONT-LIB)
/SHOW-VARIABLE-CONTAINER-ATTR CONT

Ausgabe

CONTAINER-NAME = CONT
   FROM-FILE = *LIBRARY-ELEMENT
      LIBRARY = :1OSC:$QM123.S.152.0CG6.MY-CONT-LIB
      ELEMENT = CONT
      VERSION = *HIGHEST-EXISTING
   LOCK      = *NO
   SCOPE     = *PROCEDURE

Eingabe

SAVE-VARIABLE-CONTAINER CONT
CLOSE-VARIABLE-CONTAINER CONT

Weitere Hinweise zu „permanenten Variablen“ siehe im Kapitel „SDF-P-Kommandos“ (OPEN-VARIABLE-CONTAINER Variablenbehälter öffnen ), vor allem in der Beschreibung zum Kommando OPEN-VARIABLE-CONTAINER, "OPEN-VARIABLE-CONTAINER Variablenbehälter öffnen ".