ABAP Schleifensteuerung: Die CONTINUE-Anweisung in DO, WHILE und LOOP AT

kategorie
ABAP-Statements
Veröffentlicht
autor
Johannes

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:

  1. Werden alle nachfolgenden Anweisungen innerhalb des aktuellen Schleifendurchlaufs ignoriert.
  2. 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 zur WHILE <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 ( aktualisiert sy-tabix, liest ggf. in den Arbeitsbereich/das Feldsymbol).
    • Bei SELECT ... ENDSELECT (obsolet): Der nächste passende Datenbankeintrag wird geholt.

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 dem ENDDO/ENDWHILE/ENDLOOP weiter.
  • CHECK <bedingung>.: Ist bedingt. Nur wenn <bedingung> falsch ist, wird der Rest des aktuellen Durchlaufs übersprungen (verhält sich dann wie CONTINUE).
  • 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: 5
Zusätzliche Aktion bei Zählerstand: 10
Zusätzliche Aktion bei Zählerstand: 15
Zusä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 der IF-Logik ohne CONTINUE klarer sein.
  • Achten Sie darauf, dass Schleifenvariablen (wie Zähler in WHILE-Schleifen) auch dann korrekt modifiziert werden, wenn CONTINUE verwendet wird, um Endlosschleifen zu vermeiden.