In einer Schleife kann eine Kommandofolge in Abhängigkeit einer Bedingung mehrmals durchlaufen werden. Schleifen werden über Kommandoblöcke gebildet. Dabei sind drei Schleifenblöcke zu unterscheiden, die nach dem einleitenden Kommando benannt werden: FOR-Block, WHILE-Block und REPEAT-Block.
FOR-Block
Im FOR-Block wird eine Kommandofolge so oft ausgeführt, wie einer Laufvariablen Werte zugewiesen werden. Der FOR-Block wird auch als FOR-Schleife bezeichnet werden.
Der FOR-Block beginnt mit dem Kommando FOR und endet mit dem Kommando END-FOR. Im FOR-Kommando wird einer Laufvariablen zugewiesen:
ein Zähler
der Wert einer Listenvariablen
ein Ausdruck
die Werte der Elemente einer Liste von Ausdrücken, Listenvariablen und Zähler
/FOR variable = counter / listenvariable / ausdruck [,CONDITION = bedingung] [kommandofolge] /END-FOR |
Der Benutzer definiert eine Laufvariable; die Anzahl der Schleifendurchläufe und der Wert der Laufvariablen ist abhängig von der Zuweisung rechts vom Gleichheitszeichen (ausdruck, listenvariable, counter):
counterDie Anzahl der Schleifendurchläufe wird durch den Anfangswert, den Endwert und die Schrittweite festgelegt. Die Laufvariable enthält jeweils den aktuellen Schleifenwert.
listenvariableDie Anzahl der Schleifendurchläufe ist gleich der Anzahl der Variablenelemente. Bei jedem Schleifendurchlauf wird in aufsteigender Reihenfolge der Elemente der Laufvariablen der Wert des Elementes zugewiesen.
ausdruckDie Anzahl der Schleifendurchläufe ist gleich der Anzahl der Elemente der Werteliste. Bei jedem Schleifendurchlauf wird der Laufvariablen - von links beginnend - der jeweilige Ausdruck (String-, arithmetischer -, boolscher Ausdruck, ...) zugewiesen.
bedingungWahlweise kann eine Bedingung in Form eines logischen Ausdrucks angegeben werden. Diese wird vor jedem Schleifendurchlauf überprüft; ist sie nicht mehr erfüllt, wird die Schleife beendet.
Werden counter, listenvariable und ausdruck in einer Werteliste gemischt, so wird diese Liste - von links beginnend - abgearbeitet, so wie angegeben.
Eine Ausdrucksersetzung (&....) in einem der FOR-Operanden erfolgt nur beim Eintritt in die FOR-Schleife, nicht bei jedem Schleifendurchlauf.
Mit der Laufvariablen können im FOR-Block Kommandos modifiziert oder ersetzt werden, zum Beispiel durch Variablenersetzung.
Der FOR-Block kann mit einer Marke versehen werden.
Beispiel 1
/DECLARE-VARIABLE A, MULTIPLE-ELEMENTS=*LIST ————————————————————————— (1) /DECLARE-VARIABLE L —————————————————————————————————————————————————— (2) /SET-VARIABLE A=1436,WRITE-MODE=*EXTEND —————————————————————————————— (3) /A=1455,WRITE-MODE=*EXTEND ——————————————————————————————————————————— (4) /A=1577,WRITE-MODE=*EXTEND ——————————————————————————————————————————— (5) /FOR L=*LIST(A) —————————————————————————————————————————————————————— (6) / CANCEL-JOB JOB-ID=TSN(&L) —————————————————————————————————————————— (7) /END-FOR
Erläuterungen:
(1) | Deklaration der Listenvariablen A (DECLARE-VARIABLE siehe "DECLARE-VARIABLE Variable deklarieren "). |
(2) | Deklaration der Laufvariablen L. |
(3) | Der Variablen A wird der Wert 1436 zugewiesen (SET-VARIABLE siehe "SET-VARIABLE Variablen einen Wert zuweisen "). WRITE-MODE= *EXTEND bewirkt, dass die Liste um ein Element verlängert wird. Diesem neuen letzten Element wird der Wert zugewiesen. Hier ist das letzte Element gleichzeitig das erste Element der Liste. |
(4) | Der Variablen A wird als zweiter Wert 1455 zugewiesen (der Kommandoname darf bei SET-VARIABLE entfallen). |
(5) | Der Variablen A wird als dritter Wert 1577 zugewiesen. |
(6) | Beginn der FOR-Schleife mit der Laufvariablen L und dem Inhalt der Variablen A als Werteliste. |
(7) | Für jeden Wert in Variable A wird ein CANCEL-JOB-Kommando auf die TSN abgesetzt, die in der Variablen L steht. |
Durch die FOR-Schleife werden folgende Kommandos abgesetzt:
/CANCEL-JOB JOB-ID=*TSN(1436 /CANCEL-JOB JOB-ID=*TSN(1455) /CANCEL-JOB JOB-ID=*TSN(1577)
Beispiel 2
/FOR I = *COUNTER(1,8) / ENTER-PROCEDURE ENTERDATEI.&I /END-FOR
Die FOR-Schleife erzeugt acht ENTER-PROCEDURE-Kommandos für die Dateien ENTERDATEI.1 bis ENTERDATEI.8.
WHILE-Block
Im WHILE-Block wird eine Kommandofolge so lange ausgeführt, wie eine vom Anwender definierte Bedingung erfüllt ist. Der WHILE-Block beginnt mit dem Kommando WHILE und endet mit dem Kommando END-WHILE. Der WHILE-Block kann auch als WHILE-Schleife bezeichnet werden.
Das WHILE-Kommando enthält die Bedingung zum Durchlaufen der Schleife; diese Bedingung wird vor jedem Schleifendurchlauf überprüft. Wenn die Bedingung erfüllt ist, wird die Kommandofolge innerhalb des Blocks durchlaufen; ist die Bedingung nicht erfüllt, wird die Schleife beendet und der Prozedurlauf mit dem auf END-WHILE folgenden Kommando fortgesetzt.
Die Bedingung im WHILE-Kommando wird als logischer Ausdruck angegeben (siehe AAbschnitt „Typen von Ausdrücken“).
/[marke:]WHILE bedingung [kommandofolge] /END-WHILE [marke] |
Beispiel
/ "Reduzieren der Listenvariablen LIST-A auf die letzten 250 Elemente" /WHILE (SIZE ('LIST-A') > 250) / FREE-VARIABLE LISTE-A# /END-WHILE
Die WHILE-Schleife reduziert die Listenvariable LIST-A auf die letzten 250 Elemente.
REPEAT-Block
Im REPEAT-Block wird eine Kommandofolge so lange ausgeführt, bis eine vom Anwender definierte Bedingung erfüllt ist. Der Block beginnt mit dem Kommando REPEAT und endet mit dem Kommando UNTIL. Der REPEAT-Block kann auch als REPEAT-Schleife bezeichnet werden.
Im Gegensatz zu FOR- und WHILE-Schleifen ist die Bedingung für den Schleifenabbruch nicht im einleitenden Kommando enthalten, sondern im Abschlusskommando des Blocks, dem Kommando UNTIL. Die Schleife wird daher mindestens einmal durchlaufen.
Am Ende eines jeden Schleifendurchlaufs wird die Bedingung im UNTIL-Kommando geprüft. Solange die Bedingung nicht erfüllt ist (Abbruchbedingung), wird die Kommandofolge innerhalb des Blocks erneut durchlaufen; sobald sie erfüllt ist, werden die Kommandos, die auf UNTIL folgen, abgearbeitet.
Die Bedingung im UNTIL-Kommando wird als logischer Ausdruck angegeben (siehe Kapitel „Ausdrücke“).
/REPEAT [kommandofolge] /UNTIL bedingung |
Beispiel
/DECLARE-VARIABLE A /DECLARE-VARIABLE SCHALTER-1(TYPE=*BOOLEAN) /SET-VARIABLE A = 5 /SET-VARIABLE SCHALTER-1 = ON /REPEAT / A = A + 10 / IF (A > 50) / SET-VARIABLE SCHALTER-1 = OFF / END-IF / UNTIL (SCHALTER-1 = OFF) /SHOW-VARIABLE A A = 55