Show TOC Anfang des Inhaltsbereichs

Schleifen  Dokument im Navigationsbaum lokalisieren

In Schleifen wird ein Anweisungsblock mehrmals hintereinander verarbeitet. In ABAP können vier verschiedene Schleifen programmiert werden:

·        Nicht bedingte Schleifen mit der Anweisung DO.

·        Bedingte Schleifen mit der Anweisung WHILE.

·        Schleifen über interne Tabellen und Extraktdatenbestände mit der Anweisung LOOP.

·        Schleifen über Datenbestände aus Datenbanktabellen mit der Anweisung SELECT.

DO- und WHILE-Schleifen werden in diesem Abschnitt vorgestellt. SELECT ist eine Open SQL-Anweisung und wird dort beschrieben. Die Anweisung LOOP wird bei Internen Tabellen und Extraktdatenbeständen behandelt.

Nicht bedingte Schleifen

Um einen Anweisungsblock ohne Bedingung mehrmals zu verarbeiten, verwendet man folgende Kontrollstruktur:

DO [n TIMES] ...
  [statement_block]
ENDDO.

wobei der Zusatz TIMES die Anzahl der Schleifendurchläufe auf n einschränkt.

Ohne Zusätze wird die Verarbeitung des Anweisungsblocks innerhalb der Anweisungen DO und ENDDO solange wiederholt, bis eine Abbruchanweisung wie EXIT oder STOP erreicht wird (siehe unten). Das Systemfeld sy-indexenthält während eines Schleifendurchlaufs die Anzahl der bisherigen Schleifendurchläufe inklusive dem aktuellen Durchlauf.

DO-Schleifen können beliebig geschachtelt oder mit anderen Schleifen kombiniert werden.

Beispiel

Beispiel für eine einfache DO-Schleife.

DO.

WRITE sy-index.
  IF sy-index = 3.
    
EXIT.
  ENDIF.
ENDDO.

Die Listenausgabe ist:

         1          2          3

Die Schleife wird dreimal durchlaufen. Die Schleifenverarbeitung wird im dritten Durchlauf mit der EXIT-Anweisung beendet.

Beispiel

Beispiel für zwei geschachtelte Schleifen mit dem Zusatz TIMES.

DO 2 TIMES.
  WRITE sy-index.
  SKIP.
  DO 3 TIMES.
    WRITE sy-index.
  
ENDDO.
  SKIP.
ENDDO.

Die Listenausgabe ist:

         1
         1          2          3
         2
         1          2          3

Die äußere Schleife wird zweimal durchlaufen. Für jeden Durchlauf der äußeren Schleife läuft die innere Schleife dreimal ab. Das Systemfeld sy-index gibt die Zahl der Schleifendurchläufe für jede Schleife gesondert zurück.

Bedingte Schleifen

Um einen Anweisungsblock mehrmals zu verarbeiten solange eine Bedingung erfüllt ist, verwendet man folgende Kontrollstruktur:

WHILE log_exp
  [statemaent_block]
ENDWHILE.

Wobei für log_exp ein beliebiger logischer Ausdruck verwendet werden kann. Die Verarbeitung des Anweisungsblocks innerhalb der Anweisungen WHILE und ENDWHILE wird wiederholt, solange die Bedingung erfüllt ist oder bis eine Abbruchanweisung wie EXIT oder STOP erreicht wird. Das Systemfeld sy-index enthält während eines Schleifendurchlaufs die Anzahl der bisherigen Schleifendurchläufe inklusive dem aktuellen Durchlauf.

WHILE-Schleifen können beliebig geschachtelt oder mit anderen Schleifen kombiniert werden.

Beispiel

REPORT demo_flow_control_while.

DATA: length     TYPE i VALUE 0,
      strl       TYPE i VALUE 0,
      string(30) TYPE c VALUE 'Test String'.

strl = strlen( string ).

WHILE string NE space.
  WRITE string(1).
  length = sy-index.
  SHIFT string.
ENDWHILE.

WRITE: / 'STRLEN:          ', strl.
WRITE: / 'Length of string:', length.

Die Ausgabe sieht folgendermaßen aus:

T e s t   S t r i n g
STRLEN:                    11
Length of String:          11

In diesem Beispiel wird eine WHILE-Schleife dazu verwendet, die Länge einer Zeichenkette zu bestimmen. Hierzu wird die Zeichenkette bei jedem Schleifendurchlauf eine Stelle weiter nach links gerückt, solange bis sie nur noch Leerzeichen enthält. Anhand dieses Beispiels soll lediglich die Verwendung der WHILE-Anweisung demonstriert werden. Die Stringlänge kann natürlich mit Hilfe der eingebauten Funktion strlenleichter und performanter bestimmt werden.

Schleifen abbrechen

Um eine Schleife vorzeitig abzubrechen, verwendet man Abbruchanweisungen. Bei den Abbruchanweisungen müssen wir solche Anweisungen unterscheiden, die lokal für die Schleife wirken und solche, die den gesamten Verarbeitungsblock abbrechen, in dem die Schleife programmiert ist. Zu letzteren gehören die Anweisungen STOP und REJECT (siehe Ereignisblöcke verlassen).

Abbruchanweisungen, die lokal für ein Schleife wirken sind CONTINUE, CHECK und EXIT. CONTINUE ist nur in einer Schleife einsetzbar. CHECK und EXIT sind kontextsensitiv. Innerhalb einer Schleife wirken sie nur auf die Ausführung der Schleife. Außerhalb einer Schleife bewirken sie den Abbruch des gesamten Verarbeitungsblocks (Unterprogramm, Dialogmodul, Ereignisblock etc.).

Die Abbruchanweisungen CONTINUE, CHECK und EXIT funktionieren in allen vier Schleifen, die in ABAP möglich sind (DO, WHILE, LOOP und SELECT).

Schleifendurchlauf ohne Bedingung abbrechen

Um einen Schleifendurchlauf unmittelbar und ohne Bedingung abzubrechen, verwendet man im Anweisungsblock der Schleife die Anweisung

CONTINUE.

Nach dieser Anweisung werden die übrigen Anweisungen des aktuellen Anweisungsblocks übersprungen und der nächste Schleifendurchlauf wird ausgeführt.

Beispiel

DO 4 TIMES.
  IF sy-index = 2.
    CONTINUE.
  ENDIF.
  WRITE sy-index.
ENDDO.

Die Listenausgabe ist:

         1          3          4

Der zweite Schleifendurchlauf wird beendet, ohne dass die WRITE-Anweisung verarbeitet wird.

Schleifendurchlauf unter einer Bedingung abbrechen

Um einen Schleifendurchlauf unter einer Bedingung abzubrechen, verwendet man im Anweisungsblock der Schleife die Anweisung

CHECK bedingung.

Wenn die Bedingung nicht erfüllt wird, werden die übrigen Anweisungen des aktuellen Anweisungsblocks übersprungen und der nächste Schleifendurchlauf wird ausgeführt. Für bedingung kann ein beliebiger logischer Ausdruck verwendet werden.

Beispiel

DO 4 TIMES.
  CHECK sy-index BETWEEN 2 and 3.
  
WRITE sy-index.
ENDDO.

Die Listenausgabe ist:

         2          3

Der erste und vierte Schleifendurchlauf werden beendet, ohne dass die WRITE-Anweisung verarbeitet wird, weil sy-indexnicht zwischen 2 und 3 liegt.

Schleife vollständig beenden

Um eine Schleife vollständig und ohne Bedingung abzubrechen, verwendet man im Anweisungsblock der Schleife die Anweisung

EXIT.

Nach dieser Anweisung wird die Schleife vollständig beendet und der Programmablauf nach der schließenden Anweisung (ENDDO, ENDWHILE, ENDLOOP, ENDSELECT) wieder aufgenommen. Bei geschachtelten Schleifen wird nur die aktuelle Schleife abgebrochen.

Beispiel

DO 4 TIMES.
  IF sy-index = 3.
    EXIT.
  ENDIF.
  WRITE sy-index.
ENDDO.

Die Listenausgabe ist:

         1          2

Im dritten Schleifendurchlauf wird die Schleife vor Ausführung der WRITE-Anweisung vollständig abgebrochen.

 

 

 

Ende des Inhaltsbereichs