ABAP Kopfgesteuerte Schleife: Die WHILE-Anweisung und ihre Anwendung

kategorie
ABAP-Statements
Veröffentlicht
autor
Johannes

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öglich
ENDWHILE.
  • WHILE: Das Schlüsselwort, das die Schleife einleitet.
  • <logischer_ausdruck>: Ein Ausdruck, der zu abap_true oder abap_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

  1. Bedingungsprüfung: Zuerst wird der <logischer_ausdruck> ausgewertet.
  2. Eintritt/Ausführung: Ist das Ergebnis abap_true, wird der Anweisungsblock zwischen WHILE und ENDWHILE ausgeführt.
  3. Wiederholung: Nach Erreichen von ENDWHILE (oder wenn im Block ein CONTINUE ausgeführt wird) springt die Kontrolle zurück zum WHILE-Statement, und der <logischer_ausdruck> wird erneut ausgewertet.
  4. Fortsetzung: Solange die Bedingung abap_true ergibt, werden Schritt 2 und 3 wiederholt.
  5. Abbruch: Sobald die Bedingung abap_false ergibt, wird die Schleife beendet, und die Programmausführung wird mit der ersten Anweisung nach ENDWHILE fortgesetzt.
  6. 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 gesamte WHILE-Schleife sofort und springt zur Anweisung nach ENDWHILE.
  • CONTINUE: Überspringt den Rest des aktuellen Schleifendurchlaufs und springt direkt zurück zur Prüfung der WHILE-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 wie CONTINUE).

Abgrenzung zu DO

  • DO N TIMES: Führt einen Block genau N-mal aus (Zählerschleife).
  • DO. (ohne TIMES): Kann eine Endlosschleife sein; die Abbruchbedingung muss explizit im Schleifenkörper mit EXIT 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: 1
Aktueller Zähler: 2
Aktueller Zähler: 3
Aktueller Zähler: 4
Aktueller Zähler: 5
Schleife beendet.

2. Warten auf einen Status

DATA status TYPE c LENGTH 1 VALUE 'N'. " N=Neu, P=In Bearb, F=Fertig
DATA 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 verdoppeln
ENDWHILE.
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 mit DO und LOOP AT, um die für den jeweiligen Anwendungsfall am besten geeignete und lesbarste Schleifenkonstruktion zu wählen.