ABAP DO-Schleife: Syntax, Varianten und Verwendung von sy-index

kategorie
ABAP-Statements
Veröffentlicht
autor
Johannes

Die DO-Anweisung in ABAP ist eine Schleifenkonstruktion, die verwendet wird, um einen Block von Anweisungen wiederholt auszuführen. Sie kommt hauptsächlich in zwei Varianten vor:

  1. Feste Anzahl von Durchläufen: Führt den Schleifenblock genau <n> Mal aus.
  2. Bedingter Abbruch von innen: Führt den Schleifenblock potenziell unendlich oft aus, bis die Schleife explizit durch eine Anweisung wie EXIT verlassen wird.

Ein nützliches Systemfeld innerhalb von DO-Schleifen ist sy-index, das automatisch den aktuellen Schleifendurchlauf zählt (beginnend bei 1).

Syntax

1. Feste Anzahl von Durchläufen (DO n TIMES)

DO <n> TIMES.
" Anweisungsblock
[Anweisung1].
[Anweisung2].
...
" Kontrollanweisungen wie CONTINUE, EXIT, CHECK sind hier möglich
ENDDO.
  • <n>: Ein numerischer Ausdruck (Literal, Variable, Konstante - meist vom Typ I), der die Anzahl der gewünschten Durchläufe angibt. Wenn <n> kleiner oder gleich Null ist, wird der Anweisungsblock überhaupt nicht ausgeführt.
  • sy-index: Enthält in jedem Durchlauf die aktuelle Iterationsnummer (1, 2, 3, …, n).

2. Schleife mit Abbruch von innen (DO.)

DO.
" Anweisungsblock
[Anweisung1].
...
IF <abbruchbedingung>.
EXIT. " Unbedingt notwendig!
ENDIF.
...
ENDDO.
  • Diese Variante hat keine eingebaute Abbruchbedingung. Sie läuft theoretisch unendlich.
  • Es ist zwingend erforderlich, innerhalb des Anweisungsblocks eine Bedingung (IF) mit einer EXIT -Anweisung (oder RETURN in Prozeduren) einzubauen, um die Schleife zu verlassen und eine Endlosschleife zu verhindern.
  • sy-index: Zählt auch hier die Durchläufe (1, 2, 3, …).

Funktionsweise und Ablauf

DO <n> TIMES.

  1. Der Wert von <n> wird ermittelt.
  2. sy-index wird auf 1 gesetzt.
  3. Solange sy-index kleiner oder gleich <n> ist: a. Der Anweisungsblock wird ausgeführt. b. sy-index wird automatisch um 1 erhöht.
  4. Ist sy-index größer als <n>, wird die Schleife beendet, und die Ausführung geht nach ENDDO weiter.

DO.

  1. sy-index wird auf 1 gesetzt.
  2. Der Anweisungsblock wird ausgeführt.
  3. sy-index wird automatisch um 1 erhöht.
  4. Die Kontrolle springt immer zurück zum Anfang des Anweisungsblocks (nach DO.).
  5. Die Schleife wird nur durch eine explizite EXIT-Anweisung (oder RETURN etc.) verlassen.

Kontrollanweisungen innerhalb von DO

  • EXIT: Beendet die gesamte DO-Schleife (egal ob DO n TIMES oder DO.) sofort. Die Ausführung wird nach ENDDO fortgesetzt.
  • CONTINUE: Überspringt den Rest des aktuellen Durchlaufs und springt zum Beginn des nächsten Durchlaufs (erhöht sy-index, prüft ggf. die TIMES-Bedingung).
  • CHECK <bedingung>: Wenn <bedingung> falsch ist, wird der Rest des aktuellen Durchlaufs übersprungen (verhält sich wie CONTINUE).

Abgrenzung zu WHILE und LOOP AT

  • WHILE <bedingung>: Prüft die Bedingung vor jedem Durchlauf (kopfgesteuert). Geeignet, wenn die Anzahl der Durchläufe nicht feststeht, sondern von einer Bedingung abhängt.
  • LOOP AT <tabelle>: Speziell für die Iteration über die Zeilen einer internen Tabelle konzipiert.
  • DO <n> TIMES: Ideal, wenn die Anzahl der Wiederholungen im Voraus bekannt ist (Zählerschleife).
  • DO.: Eher selten; für Fälle, wo die Abbruchbedingung komplex ist und am besten innerhalb der Schleife geprüft wird oder mehrere Ausstiegspunkte existieren.

Beispiele

1. DO n TIMES - Einfache Wiederholung mit sy-index

DATA message TYPE string VALUE 'Hallo'.
DO 4 TIMES.
WRITE: / sy-index, '. Wiederholung:', message.
ENDDO.

Ausgabe:

1 . Wiederholung: Hallo
2 . Wiederholung: Hallo
3 . Wiederholung: Hallo
4 . Wiederholung: Hallo

2. DO. mit EXIT (Summierung bis zu einem Limit)

DATA summe TYPE i VALUE 0.
DATA summand TYPE i VALUE 0.
DATA maximum TYPE i VALUE 50.
DO.
summand = summand + 5.
summe = summe + summand.
WRITE: / 'Durchlauf:', sy-index, ' | Addiere:', summand, ' | Summe:', summe.
IF summe >= maximum.
WRITE: / '-> Maximum erreicht oder überschritten. EXIT.'.
EXIT. " Schleife verlassen
ENDIF.
IF sy-index > 10. " Sicherheitsausstieg
WRITE: / '-> Sicherheitslimit (10 Durchläufe) erreicht. EXIT.'.
EXIT.
ENDIF.
ENDDO.
WRITE: / 'Schleife beendet. Finale Summe:', summe.

Mögliche Ausgabe:

Durchlauf: 1 | Addiere: 5 | Summe: 5
Durchlauf: 2 | Addiere: 10 | Summe: 15
Durchlauf: 3 | Addiere: 15 | Summe: 30
Durchlauf: 4 | Addiere: 20 | Summe: 50
-> Maximum erreicht oder überschritten. EXIT.
Schleife beendet. Finale Summe: 50

3. DO n TIMES mit CONTINUE (Bestimmte Durchläufe überspringen)

DO 6 TIMES.
IF sy-index MOD 2 = 0. " Wenn sy-index gerade ist...
WRITE: / 'Durchlauf', sy-index, 'übersprungen (gerade Zahl).'.
CONTINUE. " ...gehe zum nächsten Durchlauf
ENDIF.
WRITE: / 'Durchlauf', sy-index, 'wird verarbeitet (ungerade Zahl).'.
ENDDO.

Ausgabe:

Durchlauf 1 wird verarbeitet (ungerade Zahl).
Durchlauf 2 übersprungen (gerade Zahl).
Durchlauf 3 wird verarbeitet (ungerade Zahl).
Durchlauf 4 übersprungen (gerade Zahl).
Durchlauf 5 wird verarbeitet (ungerade Zahl).
Durchlauf 6 übersprungen (gerade Zahl).

Wichtige Hinweise / Best Practice

  • Verwenden Sie DO <n> TIMES, wenn Sie genau wissen, wie oft eine Aktion wiederholt werden soll.
  • Seien Sie extrem vorsichtig mit der DO.-Syntax ohne TIMES. Stellen Sie absolut sicher, dass es eine erreichbare EXIT-Bedingung gibt, sonst erzeugen Sie eine Endlosschleife!
  • sy-index ist Ihr Freund innerhalb von DO-Schleifen, um den aktuellen Durchlauf zu verfolgen.
  • Wählen Sie die Schleifenkonstruktion (DO, WHILE, LOOP AT), die die Logik Ihres Problems am klarsten und effizientesten abbildet.