Elementen von zusammengesetzten Variablen aller Art können genauso wie einfachen Variablen einfache Werte zugewiesen werden.
In Zuweisungen können auch zusammengesetzte Variablen eingesetzt werden. Dann müssen die zusammengesetzten Variablen auf beiden Seiten der Zuweisung vom gleichen Typ sein.
Gilt die Zuweisung für zusammengesetzte Variablen, können außer dem Zuweisungsmodus überschreiben (= *REPLACE) auch andere Zuweisungsmodi verwendet werden: Mischen (= *MERGE) oder Erweitern (= *EXTEND oder *PREFIX). Dabei ist allerdings zu beachten, über welche Modi zusammengesetzte Variablen bei der Zuweisung verknüpft werden können und wie diese Modi sich auf den Inhalt der Variablenelemente und den Aufbau der zusammengesetzten Variablen auswirken.
Arrays
Wenn einem Array als Ganzem Werte zugewiesen werden, muss auch auf der rechten Seite der Zuweisung ein Array angegeben sein, der vom selben Typ ist:
/SET-VARIABLE array1 = array2
Für Arrays gelten die Modi Überschreiben (WRITE-MODE = *REPLACE) und Mischen (WRITE-MODE = *MERGE).
Überschreiben (WRITE-MODE = *REPLACE)
Zuerst werden alle Elemente von array1gelöscht. Dann werden die Elemente von array2 unter dem Namen array1 angelegt mit den Werten von array2.
Beispiel
/DECLARE-VARIABLE array1, MULTIPLE-ELEMENTS=*ARRAY /DECLARE-VARIABLE array2, MULTIPLE-ELEMENTS=*ARRAY /array1#1=1 /array2#2=2 /SET-VARIABLE array1 = array2, WRITE-MODE=*REPLACE /SHOW-VARIABLE array1 array1#2 = 2
Mischen (MODE = *MERGE)
Wenn die Arrays array1 und array2 in ihren Elementnamen identisch sind, sind auch Mischen und Überschreiben identisch, d.h. array1#indexi = array2#indexi (WRITE-MODE = *MERGE hat dieselbe Wirkung wie WRITE-MODE = *REPLACE).
Wenn array1 und array2 nicht identisch sind, ist Mischen nur sinnvoll, wenn die Elemente von array1 und array2 unterschiedlichen Arrayindex haben.
Elemente von array1, für die es im Array array2 kein Pendant mit gleichem Arrayindex gibt, bleiben unbeeinflusst. Sie werden nicht implizit gelöscht.
Enthält array2 Elemente, für die es kein Pendant in array1 gibt, wird array1 um diese Ele-mente erweitert, d.h. die Elemente werden entsprechend ihrem Index in array1 einsortiert.
Beispiel
/DECLARE-VARIABLE array1, MULTIPLE-ELEMENTS=*ARRAY /DECLARE-VARIABLE array2, MULTIPLE-ELEMENTS=*ARRAY /array1#1 = 1 /array1#3 = 4 /array2#2 = 2 /array2#4 = 8 /SET-VARIABLE array1 = array2, WRITE-MODE=*MERGE /SHOW-VARIABLE array1 array1#1 = 1 array1#2 = 2 array1#3 = 4 array1#4 = 8
Wenn einer Liste Werte zugewiesen werden, hängt es vom Zuweisungsmodus ab, was auf der rechten Seite der Zuweisung stehen darf.
Für Listen gelten die Modi „Überschreiben“ (WRITE-MODE = *REPLACE) und „Erweitern“ (WRITE-MODE = *EXTEND, WRITE-MODE = *PREFIX).
Überschreiben (WRITE-MODE = *REPLACE)
Auf der rechten Seite der Zuweisung muss eine Liste angegeben sein:
/SET-VARIABLE liste1 = liste2 , WRITE-MODE = *REPLACE
Zuerst werden alle Elemente von liste1gelöscht. Dann werden die Elemente von liste2 unter dem Namen liste1 angelegt mit den Werten von liste2.
Erweitern (WRITE-MODE = *EXTEND)
Wenn an eine Liste ein oder mehrere Elemente angehängt werden sollen, muss im SET-VARIABLE-Kommando der Operand WRITE-MODE = *EXTEND eingesetzt werden. In Zusammenhang mit WRITE-MODE = *EXTEND kann einer Liste ein Ausdruck oder eine andere Liste zugewiesen werden:
/SET-VARIABLE liste1 = ausdruck, WRITE-MODE = *EXTEND /SET-VARIABLE liste1 = liste2, WRITE-MODE = *EXTEND
Mit /SET-VARIABLE liste1 = ausdruck, WRITE-MODE = *EXTEND wird liste1 um ein Ele-ment erweitert, d.h., an liste1 wird ein Element angehängt. Diesem Element wird dann das Ergebnis von „ausdruck“ zugewiesen.
Gilt /SET-VARIABLE liste1 = liste2, WRITE-MODE = *EXTEND, wird liste2 an liste1 ange-hängt. Das heißt, an liste1 werden so viele Elemente angehängt, wie liste2 besitzt. Diesen neuen Elementen werden der Reihe nach die Inhalte der Elemente von liste2 zugewiesen.
Erweitern (WRITE-MODE = *PREFIX)
Wenn eine Liste nach vorn um ein oder mehrere Elemente erweitert werden soll, muss im SET-VARIABLE-Kommando der Operand WRITE-MODE = *PREFIX eingesetzt werden. In Zusammenhang mit WRITE-MODE = *PREFIX kann einer Liste ein Ausdruck oder eine andere Liste zugewiesen werden:
/SET-VARIABLE liste1 = ausdruck, WRITE-MODE = *PREFIX /SET-VARIABLE liste1 = liste2 , WRITE-MODE = *PREFIX
Mit /SET-VARIABLE liste1 = ausdruck, WRITE-MODE = *PREFIX wird liste1 um ein Ele-ment erweitert: vor das bisher erste Element von liste1 wird ein neues Element eingefügt (liste1 erhält einen neuen Listenkopf). Diesem Element wird dann das Ergebnis von „aus-druck“ zugewiesen.
Gilt /SET-VARIABLE liste1 = liste2, WRITE-MODE = *PREFIX, wird liste2 vor das bisher erste Element von liste1 (den Listenkopf) eingefügt: vor den Listenkopf von liste1 werden so viele Elemente eingefügt, wie liste2 besitzt. Diesen neuen Elementen werden der Reihe nach die Inhalte der Elemente von liste2 zugewiesen.
Strukturen
Wenn einer Struktur als Ganzes Werte zugewiesen werden, muss auch auf der rechten Seite der Zuweisung eine Struktur angegeben sein:
/SET-VARIABLE struktur1 = struktur2
Für Strukturen gelten die Modi Überschreiben (WRITE-MODE = *REPLACE) und Mischen (WRITE-MODE = *MERGE).
Überschreiben (WRITE-MODE = *REPLACE)
Zu unterscheiden ist, ob struktur1 eine statische oder dynamische Struktur ist:
Wenn struktur1 eine statische Struktur ist, gilt die Zuweisung nur für solche Elemente von struktur1, für die es in struktur2 Elemente mit gleichem Elementnamen gibt. Alle Inhalte der Elemente von struktur1 werden zunächst implizit gelöscht (implizites FREE-VARIABLE). Dann wird den Elementen von struktur1 jeweils der Inhalt des entsprechenden Elements von struktur2 zugewiesen. Elemente, die in der jeweils anderen Struktur kein Pendant ha-ben, bleiben unberücksichtigt.
Beispiel
/DECLARE-VARIABLE struktur1(TYPE=*STRUCTURE(*BY-SYSCMD)) /BEGIN-STRUCTURE / DECLARE-ELEMENT A(INITIAL-VALUE='A') / DECLARE-ELEMENT B(INITIAL-VALUE='B') /END-STRUCTURE /DECLARE-VARIABLE struktur2(TYPE=*STRUCTURE) /STRUKTUR2.A='C' /STRUKTUR2.B='D' /STRUKTUR2.C='E' /SET-VARIABLE struktur1=struktur2,WRITE-MODE=*REPLACE /SHOW-VARIABLE struktur1 STRUKTUR1.A = C STRUKTUR1.B = D
Wenn struktur1 eine dynamische Struktur ist, wird analog zu Arrays zunächst ein implizites FREE-VARIABLE auf struktur1 gemacht, dann wird implizit für jedes Element von struktur2 ein Element in struktur1 deklariert. Diesen neuen Elementen von struktur1 werden dann die Inhalte der Elemente von struktur2 zugewiesen.
Mischen (MODE = *MERGE)
Wenn die Strukturen struktur1 und struktur2 identisch sind, sind „Mischen“ und „Über-schreiben“ identisch (WRITE-MODE = *MERGE hat die gleiche Wirkung wie WRITE-MODE = *REPLACE).
Wenn struktur1 und struktur2 nicht identisch sind, muss wieder unterschieden werden, ob struktur1 eine statische oder eine dynamische Struktur ist.
Wenn struktur1 eine statische Struktur ist, wirkt sich die Zuweisung wie beim Überschrei-ben zunächst auf alle die Elemente von struktur1 aus, die den gleichen Elementnamen ha-ben wie Elemente von struktur2. Diesen Elementen von struktur1 wird der Inhalt des jewei-ligen Elements von struktur2 zugewiesen. Enthält struktur2 noch weitere Elemente, wird struktur1 dennoch nicht erweitert.
Wenn struktur1 eine dynamische Struktur ist, wird implizit für jedes Element von struktur2 ein Element in struktur1 deklariert. Diesen neuen Elementen von struktur1 werden dann die Inhalte der Elemente von struktur2 zugewiesen. (Die Wirkung von WRITE-MODE = *MERGE entspricht nicht der von WRITE-MODE = *REPLACE). Elemente von struktur1, die kein Pendant in struktur2 haben, bleiben unbeeinflusst. Den Elementen von struktur1, die ein Pendant in struktur2 haben, werden die Inhalte der Elemente von struktur2 zugewie-sen.
Beispiel
/DECLARE-VARIABLE STRUCTUR1(TYPE=*STRUCTURE(*DYNAMIC)) /STRUCTUR1.A='A' /STRUCTUR1.B='B' /STRUCTUR1.D='X' /DECLARE-VARIABLE STRUCTUR2(TYPE=*STRUCTURE) /STRUCTUR2.A='C' /STRUCTUR2.B='D' /STRUCTUR2.C='E' /SET-VARIABLE STRUCTUR1=STRUCTUR2,WRITE-MODE=*MERGE /SHOW-VARIABLE STRUCTUR1 STRUCTUR1.A = C STRUCTUR1.B = D STRUCTUR1.D = X STRUCTUR1.C = E /SHOW-VARIABLE STRUCTUR2 STRUCTUR2.A = C STRUCTUR2.B = D STRUCTUR2.C = E