Die CONTINUE
-Anweisung ist eine Kontrollanweisung, die ausschließlich innerhalb von Schleifenkonstrukten
verwendet wird (DO
, WHILE
, LOOP AT
, und die veraltete SELECT...ENDSELECT
-Schleife).
Ihr Zweck ist es, die Ausführung des aktuellen Schleifendurchlaufs sofort abzubrechen und direkt mit dem Beginn
des nächsten Durchlaufs fortzufahren. Alle Anweisungen, die im Schleifenblock nach dem CONTINUE
-Befehl stehen
würden, werden für diesen speziellen Durchlauf übersprungen.
Wichtig: CONTINUE
beendet nicht die gesamte Schleife (das tut EXIT
), sondern sorgt nur dafür, dass der
aktuelle Durchlauf nicht zu Ende geführt wird und stattdessen der nächste begonnen wird (sofern die Schleifenbedingung
dies noch zulässt).
Syntax
Die Syntax ist denkbar einfach:
CONTINUE.
Funktionsweise und Verhalten
Wenn die Programmausführung innerhalb einer Schleife auf CONTINUE
trifft:
- Werden alle nachfolgenden Anweisungen innerhalb des aktuellen Schleifendurchlaufs ignoriert.
- Springt die Kontrolle direkt zum Ende des aktuellen Durchlaufs und leitet den Beginn des nächsten Durchlaufs
ein. Das bedeutet konkret:
- Bei
DO ... ENDDO
: Der Schleifenzähler (sy-index
) wird erhöht, und die Schleifenbedingung (z. B.TIMES
) wird für den nächsten Durchlauf geprüft. - Bei
WHILE ... ENDWHILE
: Die Kontrolle kehrt zurWHILE <bedingung>
-Zeile zurück, und die Bedingung wird erneut ausgewertet. - Bei
LOOP AT ... ENDLOOP
: Das System versucht, die nächste Zeile der internen Tabelle zu verarbeiten ( aktualisiertsy-tabix
, liest ggf. in den Arbeitsbereich/das Feldsymbol). - Bei
SELECT ... ENDSELECT
(obsolet): Der nächste passende Datenbankeintrag wird geholt.
- Bei
Kontext
CONTINUE
ist nur innerhalb der genannten Schleifentypen gültig und sinnvoll. Außerhalb einer Schleife führt CONTINUE
zu einem Syntaxfehler.
Abgrenzung zu EXIT
und CHECK
EXIT
: Beendet die gesamte Schleife sofort. Die Ausführung macht nach demENDDO
/ENDWHILE
/ENDLOOP
weiter.CHECK <bedingung>.
: Ist bedingt. Nur wenn<bedingung>
falsch ist, wird der Rest des aktuellen Durchlaufs übersprungen (verhält sich dann wieCONTINUE
).CONTINUE
: Überspringt den Rest des aktuellen Durchlaufs unbedingt, wenn die Anweisung erreicht wird. Die Schleife läuft aber prinzipiell weiter.
Beispiele
1. CONTINUE
in LOOP AT
(Überspringen bestimmter Zeilen)
TYPES: BEGIN OF ty_task, id TYPE i, description TYPE string, status TYPE c LENGTH 1, " O=Open, C=Closed END OF ty_task.DATA: lt_tasks TYPE STANDARD TABLE OF ty_task, ls_task TYPE ty_task.
APPEND VALUE #( id = 1 description = 'Task A' status = 'O' ) TO lt_tasks.APPEND VALUE #( id = 2 description = 'Task B' status = 'C' ) TO lt_tasks.APPEND VALUE #( id = 3 description = 'Task C' status = 'O' ) TO lt_tasks.APPEND VALUE #( id = 4 description = 'Task D' status = 'C' ) TO lt_tasks.
WRITE: / 'Verarbeite offene Tasks:'.LOOP AT lt_tasks INTO ls_task. IF ls_task-status = 'C'. " Wenn Task geschlossen ist... WRITE: / '-> Task', ls_task-id, 'ist geschlossen, wird übersprungen (CONTINUE).'. CONTINUE. " ... überspringe den Rest und nimm den nächsten Task ENDIF.
" Dieser Code wird nur für offene Tasks ('O') ausgeführt WRITE: / '--> Verarbeite Task:', ls_task-id, ls_task-description. " ... eigentliche Verarbeitung ...ENDLOOP.
Ausgabe:
Verarbeite offene Tasks:--> Verarbeite Task: 1 Task A-> Task 2 ist geschlossen, wird übersprungen (CONTINUE).--> Verarbeite Task: 3 Task C-> Task 4 ist geschlossen, wird übersprungen (CONTINUE).
2. CONTINUE
in DO
(Überspringen bestimmter Zählerstände)
DO 10 TIMES. DATA(lv_index) = sy-index.
IF lv_index > 3 AND lv_index < 7. " Überspringe Durchläufe 4, 5, 6 WRITE: / 'Durchlauf', lv_index, 'wird übersprungen.'. CONTINUE. ENDIF.
WRITE: / 'Durchlauf', lv_index, 'wird normal bearbeitet.'.ENDDO.
Ausgabe:
Durchlauf 1 wird normal bearbeitet.Durchlauf 2 wird normal bearbeitet.Durchlauf 3 wird normal bearbeitet.Durchlauf 4 wird übersprungen.Durchlauf 5 wird übersprungen.Durchlauf 6 wird übersprungen.Durchlauf 7 wird normal bearbeitet.Durchlauf 8 wird normal bearbeitet.Durchlauf 9 wird normal bearbeitet.Durchlauf 10 wird normal bearbeitet.
3. CONTINUE
in WHILE
DATA counter TYPE i VALUE 0.
WHILE counter < 20. counter = counter + 1.
" Beispiel: Nur alle 5 Schritte eine zusätzliche Aktion ausführen IF counter MOD 5 <> 0. " Wenn Zähler NICHT durch 5 teilbar ist... CONTINUE. " ... überspringe den Rest dieses Durchlaufs ENDIF.
" Diese Aktion wird nur ausgeführt, wenn counter 5, 10, 15, 20 ist WRITE: / 'Zusätzliche Aktion bei Zählerstand:', counter.
ENDWHILE.
Ausgabe:
Zusätzliche Aktion bei Zählerstand: 5Zusätzliche Aktion bei Zählerstand: 10Zusätzliche Aktion bei Zählerstand: 15Zusätzliche Aktion bei Zählerstand: 20
Wichtige Hinweise / Best Practice
CONTINUE
ist ein nützliches Werkzeug, um Code innerhalb von Schleifen übersichtlicher zu gestalten, indem bestimmte Fälle frühzeitig abgehandelt und übersprungen werden.- Es wird fast immer innerhalb einer
IF
-Struktur verwendet, um das Überspringen von einer Bedingung abhängig zu machen (IF <Bedingung> THEN CONTINUE. ENDIF.
). - Stellen Sie sicher, dass die Verwendung von
CONTINUE
die Lesbarkeit des Codes nicht beeinträchtigt. Manchmal kann eine Umstrukturierung derIF
-Logik ohneCONTINUE
klarer sein. - Achten Sie darauf, dass Schleifenvariablen (wie Zähler in
WHILE
-Schleifen) auch dann korrekt modifiziert werden, wennCONTINUE
verwendet wird, um Endlosschleifen zu vermeiden.