Anwendungsgebiet: PROCEDURE
Kommandobeschreibung
Das Kommando FOR leitet einen FOR-Block ein; das Kommando /END-FOR beendet einen FOR-Block. Das Konstrukt ist eine FOR-Schleife. Der Benutzer definiert eine Laufvariable <composed-name 1..255>. Die Anzahl der Schleifendurchläufe und der Wert der Laufvariablen sind abhängig von der Zuweisung rechts vom Gleichheitszeichen (Ausdruck, Listenvariable (*LIST), „Counter“):
*LIST(...)
Die Anzahl der Schleifendurchläufe ist gleich der Anzahl der Variablenelemente. Bei jedem Schleifendurchlauf wird der Laufvariablen in aufsteigender Reihenfolge der Elemente der Wert des Elementes zugewiesen.*COUNTER(...)
Die Anzahl der Schleifendurchläufe wird durch den Anfangswert (FROM=), den Endwert (TO=) und die Schrittweite (INCREMENT=) festgelegt. Die Laufvariable enthält jeweils den aktuellen Schleifenwert.<text 0..1800 with-low>
Die 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.
Werden <text 0..1800 with-low>, *LIST(...) und *COUNTER(...) in einer Werteliste gemischt, so wird diese Liste - von links beginnend - abgearbeitet, so wie oben angegeben.
Eine Ausdrucksersetzung (&....) in einem der FOR-Operanden erfolgt nur beim Eintritt in die FOR-Schleife, nicht bei jedem Schleifendurchlauf.
Hinweis
Die Operanden des Kommandos FOR werden von SDF-P ausgewertet und sind, wie nachfolgend dargestellt, einzugeben. Für die Operanden gelten die SDF-Abkürzungsregeln. SDF-Funktionen, wie Auskunft über mögliche Operandenwerte oder Korrekturdialog, sind auf Operandenebene nicht verfügbar. Im geführten Dialog stellt SDF nur ein Eingabefeld mit „# =“ zur Verfügung.
Zu FOR-Blöcken siehe auch Abschnitt „Schleifen definieren“.
Format
FOR |
<composed-name 1..255> = list-poss(2000): *LIST(...) / *COUNTER (...) / <text 0..1800 with-low expr> *LIST(...) LIST-NAME = <composed-name 1..255> *COUNTER(...) FROM = <text 0..1800 arithm-expr> ,TO = *UNLIMITED / <text 0..1800 arithm-expr> ,INCREMENT = 1 / <text 0..1800 arithm-expr> ,CONDITION (DECLARE-ELEMENT Strukturelement deklarieren )= *NONE / <text 0..1800 with-low bool-expr> |
Operandenbeschreibung
<composed-name 1..255> =
Bezeichnet die Laufvariable. Die Laufvariable muss vom gleichen Typ sein wie die Elemente rechts vom Gleichheitszeichen oder sie muss konvertierbar sein.
<composed-name 1..255> = *LIST(LIST-NAME=<composed-name 1..255>)
Der Laufvariablen wird eine Listenvariable zugewiesen. Die Anzahl der Schleifendurchläufe ist gleich der Anzahl der Variablenelemente. Bei jedem Schleifendurchlauf wird der Laufvariablen in aufsteigender Reihenfolge der Elemente der Wert des Elementes zugewiesen.Wenn Laufvariable und Listenvariable vom Typ Struktur sind und gleichnamige Elemente haben, so werden die Elemente der Laufvariablen von den gleichnamigen Elementen der Listenvariable überschrieben (siehe Kommando SET-VARIABLE, Operand WRITE-MODE =*REPLACE, "SET-VARIABLE Variablen einen Wert zuweisen ", Abschnitt „Listen“ (Zusammengesetzte Variablen ), und Kapitel „Ausdrücke“).
LIST-NAME = <composed-name 1..255>
Name der Listenvariablen.
<composed-name 1..255> = *COUNTER (...)
Die Anzahl der Schleifendurchläufe wird durch den Anfangswert (FROM=), den Endwert (TO=) und die Schrittweite (INCREMENT=) festgelegt. Diese Werte können während des Laufs nicht mehr modifiziert werden. Die Laufvariable enthält jeweils den aktuellen Schleifenwert. Der Wert der Laufvariablen kann aber auch während des Schleifendurchlaufs durch direkte Zuweisung modifiziert werden. Die Laufvariable muss vom Typ INTEGER oder konvertierbar sein. Zu „arithmetischer Ausdruck“ siehe "Typen von Ausdrücken ".
FROM = <text 0..1800 arithm-expr>
Anfangswert für die Laufvariable (Zahl oder arithmetischer Ausdruck).
TO = *UNLIMITED / <text 0..1800 arithm-expr>
Endwert für die Laufvariable (Zahl oder arithmetischer Ausdruck).
*UNLIMITED bedeutet: Der Endwert ist 231-1, wenn für die Schrittweite ein Wert > 0 angegeben wurde bzw. -231 für einen Schrittweitenwert < 0. Das Überschreiten dieser Grenzwerte löst einen Fehler aus (Verzweigung zur Fehlerbehandlung).
INCREMENT = 1 / <text 0..1800 arithm-expr>
Schrittweite, um die der aktuelle Schleifenwert nach jedem Schleifendurchlauf erhöht wird (Zahl oder arithmetischer Ausdruck). Die Zählrichtung wird durch das Vorzeichen bestimmt. Sie muss in Richtung Endwert führen, sonst wird der Lauf nicht durchgeführt. Ändert das Increment während des Schleifenablaufes seine Zählrichtung (sein Vorzeichen), wird der Lauf abgebrochen.
Hinweis
Bei Schrittweite 0 wird die Schleife solange durchlaufen, bis die angegebene Bedingung (Operand CONDITION=...) nicht mehr erfüllt ist bzw. mit EXIT-BLOCK ein Aussprung aus der Schleife erfolgt.
<composed-name 1..255> = <text 0..1800 with-low expr>
Beliebiger Ausdruck (String-, arithmetischer -, boolscher Ausdruck, ...). Die Anzahl der Schleifendurchläufe ist gleich der Anzahl der Elemente der Werteliste. Bei jedem Schleifendurchlauf wird der Laufvariablen - in der Werteliste von links beginnend - der jeweilige Ausdruck (String, Zahl, ...) zugewiesen.
CONDITION = *NONE / <text 0..1800 bool-expr>
Bezeichnet eine Bedingung, die am Beginn jeden Schleifendurchlaufs geprüft wird. Die FOR-Schleife wird durchlaufen, wenn die angegebene Bedingung den Wert „TRUE“ besitzt. Der FOR-Lauf wird abgebrochen, wenn die Bedingung den Wert „FALSE“ ergibt. *NONE bedeutet: Eine Bedingung wird nicht ausgewertet, die Schleife wird immer durchlaufen. Zu „boolschen Ausdruck“ siehe Seite "Typen von Ausdrücken ".
Kommando-Returncode
(SC2) | SC1 | Maincode | Bedeutung |
0 | CMD0001 | Ohne Fehler | |
1 | CMD0202 | Syntaxfehler | |
1 | SDP0118 | Kommando im falschen Kontext | |
1 | SDP0223 | Falsche Umgebung | |
3 | CMD2203 | Falsche Syntaxdatei | |
32 | CMD0221 | Systemfehler (interner Fehler) | |
64 | SDP0091 | Semantikfehler | |
130 | SDP0099 | Kein Adressraum mehr verfügbar |
Beispiel 1
/DECLARE-VARIABLE A,MULTIPLE-ELEMENTS=*LIST /DECLARE-VARIABLE I /SET-VARIABLE A=1436,WRITE-MODE=*EXTEND /A=1455,WRITE-MODE=*EXTEND /A=1577,WRITE-MODE=*EXTEND /FOR I=*LIST(A) /CANCEL-JOB JOB-ID=*TSN(&I) /END-FOR
Die FOR-Schleife setzt folgende Kommandos ab:
/CANCEL-JOB JOB-ID=*TSN(1436) /CANCEL-JOB JOB-ID=*TSN(1455) /CANCEL-JOB JOB-ID=*TSN(1577)
Beispiel 2
/FOR I=(5,7,12,2,3),CONDITION=(I<10) /SHOW-VARIABLE I /END-FOR
Ausgabe
I = 5 I = 7
Die Elemente 12, 2, 3 der Liste werden nicht mehr ausgewertet.
Beispiel 3
Die Primzahlen im Bereich 2 bis zur eingegebenen Zahl werden berechnet und ausgegeben.
/ DECL-VAR N(TYPE=*INTEGER) / DECL-VAR PRIMARY-NUMBERS(TYPE=*INTEGER),MULT-ELEM=*LIST / WR-TEXT 'Bitte Ganzzahl >= 2 eingeben!' / READ-VAR N,INPUT=*TERMINAL / PRIMARY-NUMBERS# = 2 /LOOP1: FOR I = *COUNTER(FROM=3,TO=N,INCREMENT=2) /LOOP2: FOR J = *LIST(LIST-NAME=PRIMARY-NUMBERS) / CYCLE LOOP1,COND=(I MOD J == 0) / END-FOR LOOP2 / PRIMARY-NUMBERS = I ,MODE=*EXTEND / END-FOR LOOP1 / WR-TEXT 'Primzahlen im Bereich von 2 bis &(N):' / SHOW-VAR PRIMARY-NUMBERS,INF=*PAR(NAME=*NONE) / EXIT-PROC
Beispiel 4
Verarbeiten einer Listenvariablen unter Mitführung des Index.
/DECL-VAR SPRACHEN,MULT-ELEM=*LIST /SPRACHEN = 'Deutsch', WR-MODE=*EXTEND /SPRACHEN = 'Englisch', WR-MODE=*EXTEND /SPRACHEN = 'Franzoesisch', WR-MODE=*EXTEND /SPRACHEN = 'Spanisch', WR-MODE=*EXTEND / /FOR I = *COUNTER(FROM=1,TO=SIZE('SPRACHEN')) / WR-TEXT '&(SPRACHEN#I) ist &(I). Sprache' /END-FOR
Ausgabe
Deutsch ist 1. Sprache Englisch ist 2. Sprache Franzoesisch ist 3. Sprache Spanisch ist 4. Sprache