Schleifen 

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

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] [VARYING <f> FROM <f1> NEXT <f 2>].
  <anweisungsblock>
ENDDO.

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-INDEX enthält während eines Schleifendurchlaufs die Anzahl der bisherigen Schleifendurchläufe inklusive dem aktuellen Durchlauf.

Der Zusatz TIMES schränkt die Anzahl der Schleifendurchläufe auf <n> ein. <n> kann ein Literal oder eine Variable sein. Ist <n> Null oder eine negative Zahl, wird die Schleife nicht durchlaufen. Falls die Option TIMES nicht verwendet wird, ist darauf zu achten, daß mindestens eine Abbruchanweisung wie EXIT oder STOP im Anweisungsblock erreicht wird, um Endlosschleifen zu vermeiden.

Der Zusatz VARYING weist einer Variablen <f> bei jedem Schleifendurchlauf einen neuen Wert zu. Der Zusatz VARYING kann in einer DO-Anweisung mehrfach verwendet werden. <f 1 > und <f 2 > sind die ersten beiden Felder einer Folge von Feldern, die den gleichen Abstand im Speicher haben und vom selben Typ und derselben Länge sind. Im ersten Schleifendurchgang erhält <f> den Wert <f 1 >, im zweiten Durchgang erhält <f> den Wert <f 2 >, etc. Wenn der Wert des Felds <f> innerhalb der DO-Schleife geändert wird, wird auch der Wert des aktuellen Felds <f i > entsprechend geändert. Es ist darauf zu achten, daß nicht mehr Schleifen durchlaufen werden, als Felder in der Feldfolge vorhanden sind, da dies sonst einen Laufzeitfehler verursacht.

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

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 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.

Beispiel für den VARYING-Zusatz in DO-Schleifen:

DATA: BEGIN OF text,
        word1(4) TYPE c VALUE 'This',
        word2(4) TYPE c VALUE 'is',
        word3(4) TYPE c VALUE 'a',
        word4(4) TYPE c VALUE 'loop',
      END OF text.

DATA: string1(4) TYPE c, string2(4) TYPE c.

DO 4 TIMES VARYING string1 FROM text-word1 NEXT text-word2.
  WRITE string1.
  IF string1 = 'is'.
    string1 = 'was'.
  ENDIF.
ENDDO.

SKIP.

DO 2 TIMES VARYING string1 FROM text-word1 NEXT text-word3
           VARYING string2 FROM text-word2 NEXT text-word4.
  WRITE: string1, string2.
ENDDO..

Die Listenausgabe ist:

This is   a    loop

This was  a    loop

Die Struktur TEXT enthält vier Felder mit gleichem Abstand im Speicher. Beim Durchlauf der ersten DO-Schleife werden die Komponenten der Struktur nacheinander STRING1 zugewiesen. Wenn STRING1 'is' enthält, wird der Inhalt auf 'was' geändert. Dabei wird TEXT-WORD2 ebenfalls in 'was' geändert. Bei jedem Durchlauf der zweiten DO-Schleife werden die Komponenten der Struktur an STRING1 und STRING2 übergeben.

Bedingte Schleifen

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

WHILE <bedingung> [VARY <f> FROM <f1> NEXT <f 2>].
   <anweisungsblock>
ENDWHILE.

Für <bedingung> kann ein beliebiger logischer Ausdruck verwendet werden. 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. Der Zusatz VARY hat die gleiche Funktion wie die Option VARYING der DO-Anweisung (siehe oben).

Um Endlosschleifen zu vermeiden muß darauf geachtet werden, daß die Bedingung einer WHILE-Anweisung irgendwann nicht mehr erfüllt sein sollte oder daß im Anweisungsblock eine Abbruchanweisung wie EXIT oder STOP erreicht wird.

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

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 verwenden, 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 STRLEN leichter 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. Diese werden unter Ereignisblöcke verlassen näher beschrieben.

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.

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 daß 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.

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 daß die WRITE-Anweisung verarbeitet wird, weil SY-INDEX nicht 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 un der Programmablauf nach der schließenden Anweisung (ENDDO, ENDWHILE, ENDLOOP ENDSELECT) wieder aufgenommen. Bei geschachtelten Schleifen wird nur die aktuelle Schleife abgebrochen.

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.