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:
- Feste Anzahl von Durchläufen: Führt den Schleifenblock genau
<n>
Mal aus. - 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öglichENDDO.
<n>
: Ein numerischer Ausdruck (Literal, Variable, Konstante - meist vom TypI
), 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 einerEXIT
-Anweisung (oderRETURN
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.
- Der Wert von
<n>
wird ermittelt. sy-index
wird auf 1 gesetzt.- Solange
sy-index
kleiner oder gleich<n>
ist: a. Der Anweisungsblock wird ausgeführt. b.sy-index
wird automatisch um 1 erhöht. - Ist
sy-index
größer als<n>
, wird die Schleife beendet, und die Ausführung geht nachENDDO
weiter.
DO.
sy-index
wird auf 1 gesetzt.- Der Anweisungsblock wird ausgeführt.
sy-index
wird automatisch um 1 erhöht.- Die Kontrolle springt immer zurück zum Anfang des Anweisungsblocks (nach
DO.
). - Die Schleife wird nur durch eine explizite
EXIT
-Anweisung (oderRETURN
etc.) verlassen.
Kontrollanweisungen innerhalb von DO
EXIT
: Beendet die gesamteDO
-Schleife (egal obDO n TIMES
oderDO.
) sofort. Die Ausführung wird nachENDDO
fortgesetzt.CONTINUE
: Überspringt den Rest des aktuellen Durchlaufs und springt zum Beginn des nächsten Durchlaufs (erhöhtsy-index
, prüft ggf. dieTIMES
-Bedingung).CHECK <bedingung>
: Wenn<bedingung>
falsch ist, wird der Rest des aktuellen Durchlaufs übersprungen (verhält sich wieCONTINUE
).
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: 5Durchlauf: 2 | Addiere: 10 | Summe: 15Durchlauf: 3 | Addiere: 15 | Summe: 30Durchlauf: 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 ohneTIMES
. Stellen Sie absolut sicher, dass es eine erreichbareEXIT
-Bedingung gibt, sonst erzeugen Sie eine Endlosschleife! sy-index
ist Ihr Freund innerhalb vonDO
-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.