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
EXITverlassen 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 (oderRETURNin 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-indexwird auf 1 gesetzt.- Solange
sy-indexkleiner oder gleich<n>ist: a. Der Anweisungsblock wird ausgeführt. b.sy-indexwird automatisch um 1 erhöht. - Ist
sy-indexgrößer als<n>, wird die Schleife beendet, und die Ausführung geht nachENDDOweiter.
DO.
sy-indexwird auf 1 gesetzt.- Der Anweisungsblock wird ausgeführt.
sy-indexwird 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 (oderRETURNetc.) verlassen.
Kontrollanweisungen innerhalb von DO
EXIT: Beendet die gesamteDO-Schleife (egal obDO n TIMESoderDO.) sofort. Die Ausführung wird nachENDDOfortgesetzt.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: Hallo2. 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: 503. 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-indexist 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.