Die WHILE
-Anweisung in ABAP implementiert eine kopfgesteuerte Schleife. Das bedeutet, ein Block von
ABAP-Anweisungen wird wiederholt ausgeführt, solange (englisch: while) eine am Anfang der Schleife stehende *
logische Bedingung wahr* (abap_true
) ist. Die Bedingung wird vor jedem potenziellen Durchlauf des
Schleifenkörpers überprüft.
Syntax
WHILE <logischer_ausdruck>. " Anweisungsblock, der wiederholt wird [Anweisung1]. [Anweisung2]. ... " Kontrollanweisungen wie CONTINUE, EXIT, CHECK sind hier möglichENDWHILE.
WHILE
: Das Schlüsselwort, das die Schleife einleitet.<logischer_ausdruck>
: Ein Ausdruck, der zuabap_true
oderabap_false
ausgewertet werden kann. Dieser Ausdruck steuert, ob die Schleife (weiter) ausgeführt wird. Beispiele:zaehler < 10
,status = 'A'
,sy-subrc = 0
,is_valid = abap_true
.Anweisungsblock
: Eine oder mehrere ABAP-Anweisungen, die wiederholt ausgeführt werden sollen.ENDWHILE
: Das Schlüsselwort, das das Ende des Schleifenblocks markiert.
Funktionsweise und Ablauf
- Bedingungsprüfung: Zuerst wird der
<logischer_ausdruck>
ausgewertet. - Eintritt/Ausführung: Ist das Ergebnis
abap_true
, wird der Anweisungsblock zwischenWHILE
undENDWHILE
ausgeführt. - Wiederholung: Nach Erreichen von
ENDWHILE
(oder wenn im Block einCONTINUE
ausgeführt wird) springt die Kontrolle zurück zumWHILE
-Statement, und der<logischer_ausdruck>
wird erneut ausgewertet. - Fortsetzung: Solange die Bedingung
abap_true
ergibt, werden Schritt 2 und 3 wiederholt. - Abbruch: Sobald die Bedingung
abap_false
ergibt, wird die Schleife beendet, und die Programmausführung wird mit der ersten Anweisung nachENDWHILE
fortgesetzt. - Keine Ausführung: Ist die Bedingung bereits bei der allerersten Prüfung
abap_false
, wird der Anweisungsblock der Schleife gar nicht ausgeführt.
Terminierungsbedingung
Es ist essenziell, dass die Anweisungen innerhalb des Schleifenblocks dafür sorgen, dass der <logischer_ausdruck>
irgendwann abap_false
wird. Geschieht dies nicht, entsteht eine Endlosschleife, die das Programm zum Stillstand
bringen kann. Typischerweise geschieht dies durch das Verändern einer Variablen, die Teil der Bedingung ist (z. B. das
Erhöhen eines Zählers, das Ändern eines Status).
Kontrollanweisungen innerhalb von WHILE
Man kann den Ablauf einer WHILE
-Schleife mit folgenden Anweisungen beeinflussen:
EXIT
: Beendet die gesamteWHILE
-Schleife sofort und springt zur Anweisung nachENDWHILE
.CONTINUE
: Überspringt den Rest des aktuellen Schleifendurchlaufs und springt direkt zurück zur Prüfung derWHILE
-Bedingung für den nächsten möglichen Durchlauf.CHECK <bedingung>
: Wenn<bedingung>
falsch ist, wird der Rest des aktuellen Durchlaufs übersprungen (verhält sich wieCONTINUE
).
Abgrenzung zu DO
DO N TIMES
: Führt einen Block genau N-mal aus (Zählerschleife).DO.
(ohneTIMES
): Kann eine Endlosschleife sein; die Abbruchbedingung muss explizit im Schleifenkörper mitEXIT
implementiert werden.WHILE
: Die Anzahl der Durchläufe ist nicht von vornherein festgelegt, sondern hängt direkt von der Bedingung ab. Ideal, wenn etwas wiederholt werden soll, bis ein bestimmter Zustand eintritt.
Beispiele
1. Einfacher Zähler
DATA count TYPE i VALUE 0.
WRITE: / 'Schleife startet...'.
WHILE count < 5. count = count + 1. " Wichtig: Zähler verändern! WRITE: / 'Aktueller Zähler:', count.ENDWHILE.
WRITE: / 'Schleife beendet.'.
Ausgabe:
Schleife startet...Aktueller Zähler: 1Aktueller Zähler: 2Aktueller Zähler: 3Aktueller Zähler: 4Aktueller Zähler: 5Schleife beendet.
2. Warten auf einen Status
DATA status TYPE c LENGTH 1 VALUE 'N'. " N=Neu, P=In Bearb, F=FertigDATA max_retries TYPE i VALUE 5.DATA current_retry TYPE i VALUE 0.
WHILE status <> 'F' AND current_retry < max_retries. current_retry = current_retry + 1. WRITE: / 'Prüfe Status, Versuch:', current_retry.
" Simulieren einer externen Prüfung oder Verarbeitung IF current_retry = 3. status = 'F'. " Status ändert sich im 3. Versuch WRITE: ' -> Status ist jetzt Fertig (F)'. ELSE. WRITE: ' -> Status ist noch nicht Fertig'. WAIT UP TO 1 SECONDS. " Nur zur Demonstration ENDIF.ENDWHILE.
IF status = 'F'. WRITE: / 'Verarbeitung erfolgreich abgeschlossen.'.ELSE. WRITE: / 'Verarbeitung nach', max_retries, 'Versuchen nicht abgeschlossen.'.ENDIF.
3. Schleife mit EXIT
verlassen
DATA summe TYPE i VALUE 0.DATA summand TYPE i VALUE 1.
WHILE summe < 50. summe = summe + summand. WRITE: / 'Addiere', summand, '-> Neue Summe:', summe.
IF summand > 10. WRITE: ' -> Summand > 10, Abbruch mit EXIT.'. EXIT. " Schleife sofort verlassen ENDIF.
summand = summand * 2. " Nächsten Summanden verdoppelnENDWHILE.
WRITE: / 'Schleife beendet, finale Summe:', summe.
4. Schleife mit CONTINUE
DATA nummer TYPE i VALUE 0.
WHILE nummer < 8. nummer = nummer + 1.
IF nummer = 3 OR nummer = 6. WRITE: / nummer, ': Wird übersprungen (CONTINUE).'. CONTINUE. " Springe zur nächsten Prüfung der WHILE-Bedingung ENDIF.
" Verarbeitung nur für die nicht übersprungenen Nummern WRITE: / nummer, ': Wird verarbeitet.'.ENDWHILE.
Ausgabe:
1 : Wird verarbeitet. 2 : Wird verarbeitet. 3 : Wird übersprungen (CONTINUE). 4 : Wird verarbeitet. 5 : Wird verarbeitet. 6 : Wird übersprungen (CONTINUE). 7 : Wird verarbeitet. 8 : Wird verarbeitet.
Wichtige Hinweise / Best Practice
- Das wichtigste bei
WHILE
-Schleifen ist die Sicherstellung einer gültigen Abbruchbedingung, um Endlosschleifen zu vermeiden. Die Bedingung muss durch Vorgänge innerhalb der Schleife beeinflussbar sein. WHILE
ist besonders nützlich, wenn die Anzahl der benötigten Wiederholungen nicht von vornherein bekannt ist, sondern vom Erreichen eines bestimmten Zustands oder Wertes abhängt.- Vergleichen Sie
WHILE
mitDO
undLOOP AT
, um die für den jeweiligen Anwendungsfall am besten geeignete und lesbarste Schleifenkonstruktion zu wählen.