SELECT, DO, WHILE Schleifen und Abbruchanweisungen in ABAP

SELECT, DO, WHILE Schleifen und Abbruchanweisungen in ABAP
4.7 Sterne
6 Bewertungen


Dieser Beitrag ist Teil des Kurses ABAP Grundlagen.

Schleifen, oder auch Wiederholungen genannt, dienen dazu Anweisungsblöcke mehrfach auszuführen. In diesem Beitrag werden SELECTDO– und WHILE-Schleifen erläutert. Ferner werden die Abbruchbedingungen CONTINUE, CHECK, EXIT vorgestellt mit denen Sie die Schleifen verlassen können.

SELECT-Schleife
Die SELECT Schleife haben Sie bereits kennengelernt. Es ist auch möglich diese Anweisung mit einer Bedingung zu verknüpfen. Wenn Sie Sätze aus einer Tabelle lesen, können Sie über eine Selektionsbedingung filtern und nur die Sätze lesen, die diese Bedingung erfüllen. Wenn Sie zum Beispiel nur die Sätze lesen wollen, bei denen als Farbe „ROT“ steht, lautet die Anweisung wie folgt:

SELECT * FROM  zsmartphones INTO ls_zsmartphones.
  WHERE tfarbe = 'ROT'.
  lv_counter_rot = lv_counter_rot + 1.
ENDSELECT.

Dabei wird der Anweisungsblock, in unserem Beispiel der Counter, nur für die Treffersätze ausgeführt.

DO-Schleife
Die Struktur der DO-Schleife beginnt mit der DO Anweisung und wird mit ENDDO beendet. Dazwischen wird der zu wiederholende Anweisungsblock platziert.

DO.
* Anweisungsblock
ENDDO.

In diesem kleinen Befehl sehen Sie schon das wesentliche Problem, denn es ist nicht angegeben, wie oft der Anweisungblock ausgeführt werden soll. Nehmen Sie sich bei Ihrer Programmiertätigkeit vor Endlosschleifen in Acht! Im Folgenden werden daher Möglichkeiten aufgezeigt, wie Sie die Anzahl der Schleifendurchläufe begrenzen und Schleifen abbrechen.
Um die Anzahl der Durchläufe zu begrenzen, wird eine Obergrenze von Durchläufen festgelegt. Wenn Sie möchten, dass eine Schleife maximal drei mal durchlaufen wird, nutzen Sie die folgende Syntax:

DO 3 TIMES.

Sie könnten diesen Wert auch in einer Variablen vom Typ integer hinterlegen, anstatt die Anzahl der Durchläufe fix als Zahl anzugeben.
Die Schleife wird nun dreimal ausgeführt, danach wird das Programm mit der ersten Anweisung nach ENDDO fortgesetzt.
Während der Anweisungsblock in der Schleife wiederholt wird, führt das System automatisch einen Schleifenzähler mit. Das Feld SY-INDEX wird bei jedem Schleifendurchlauf mit dem aktuellen Wert gefüllt. So steht dort im ersten Durchlauf die 1, beim zweiten die 2 usw. Dieser Zähler kann im Debugging-Modus zur Fehlersuche aber auch als Abbruchkriterium nützlich sein.

WHILE-Schleife
Im Gegensatz zur DO-Schleife wird bei der WHILE-Schleife eine Bedingung geprüft, bevor der Anweisungsblock zum ersten Mal ausgeführt wird. Wenn die Bedingung erfüllt wird, wird der Anweisungsblock ausgeführt. Danach prüft das System erneut, ob die Bedingung noch gültig ist. Die Struktur der Syntax beginnt mit der Anweisung WHILE und einer Bedingung, anschließend folgt der Anweisungsblock, der ausgeführt wird, falls die Bedingung gültig ist. Die Sturktur endet mit der Anweisung ENDWHILE.

WHILE Bedingung.
* Anweisungsblock
ENDWHILE.

Im folgenden Beispiel läuft eine Stoppuhr rückwärts. Ist der Wert auf 0 heruntergezählt, wird die Anweisung nicht mehr ausgeführt. Das System setzt die Programmausführung mit der ersten Anweisung nach ENDWHILE fort.

DATA: sek TYPE i.
sek = 10.
WHILE sek > 0.
  WRITE / sek.
  sek = sek - 1.
ENDWHILE.

Abbruchanweisungen
Zum Abbruch von Schleifen existieren in ABAP mehrere verschiedenen Anweisungen.


CONTINUE
Die erste dieser Anweisungen lautet CONTINUE und dient zum Abbruch eines Anweisungsblocks innerhalb einer Schleife. Mit CONTINUE wird ein neuer Schleifendurchlauf gestartet. Dabei wird der aktuelle Durchlauf umgehend beendet. Die Anweisung selbst prüft keine Bedingung, daher packt man diese oft in eine Verzweigung. Falls die Bedingung erfüllt ist, wird der Befehl CONTINUE ausgeführt, das heißt die Schleife springt an den Anfang.
Die Syntax ist relativ einfach:

  IF Bedingung.
    CONTINUE.
  ENDIF.

So sollen zum Beispiel nur rote Smartphones gezählt werden. Wenn eine andere Farbe verarbeitet wird, soll die Schleife an den Anfang springen und einen neuen Datensatz, bzw. eine neue Zeile aus der Tabelle, lesen.

SELECT * FROM zsmartphones INTO ls_zsmartphones.
  IF ls_zsmartphones-tfarbe NE 'ROT'.
    CONTINUE.
  ENDIF.
  lv_counter_rot = lv_counter_rot + 1.
ENDSELECT.

Wenn die Farbe nicht ROT entspricht, springt das Programm an den Anfang der SELECT Anweisung. Sonst wird hochgezählt. Bei NE handelt es sich um einen logischen Ausdruck, die in einem anderen Artikel erläutert werden. Ich kann an dieser Stelle aber schon mal verraten, dass NE für not equal, also ungleich steht.


CHECK
Die zweite Abbruchanweisung CHECK vereint in sich die Anweisungen CONTINUE und IF. Die Syntax ist denkbar einfach:

  CHECK Bedingung.

Wenn die Anweisung CHECK aufgerufen wird und Bedingung falsch ist, wird der aktuelle Schleifendurchgang umgehend beendet und der Programmablauf mit dem nächsten Durchgang fortgesetzt. Für Bedingung kann ein beliebiger logischer Ausdruck angegeben werden. Ist die Bedingung erfüllt, werden alle nachfolgenden Anweisungen ausgeführt.

SELECT * FROM zsmartphones INTO ls_zsmartphones.
  CHECK ls_zsmartphones-tfarbe EQ 'ROT'.
  lv_counter_rot = lv_counter_rot + 1.
ENDSELECT.

Wenn die Farbe des Smartphones rot ist, wird der Zähler um eins erhöht. Ansonsten wird der Schleifendurchlauf abgebrochen und ein neuer Datensatz aus der Tabelle zsmartphones gelesen.


EXIT
Im Gegensatz zu CONTINUE und CHECK beendet die Anweisung EXIT nicht nur den Anweisungsblock, sondern die Schleifenverarbeitung an sich. Das System springt zum Ende der Schleifenstruktur und setzt die Programmausführung nach der Schleife fort.
Dabei bezieht sich die Anweisung immer auf die Ebene, auf der diese aufgerufen wird. Die Verarbeitung auf dieser Ebene wird beendet und es Programmfortsetzung auf der nächsthöheren, äußeren Ebene bewirkt. Wenn die EXIT-Anweisung bei zwei geschachtelten Schleifen in der inneren Schleife steht, wird diese beendet und das Programm mit der Anweisung nach dem Strukturende der inneren Schleife fortgesetzt. Das heißt eine Ebene höher in der äußeren Schleife.

SELECT * FROM zsmartphones INTO ls_zsmartphones.
  IF ls_zsmartphones-tfarbe EQ 'ROT'.
    EXIT.
  ENDIF.
ENDSELECT.

WRITE 'Hello world'.

In unserem letzten Beispiel haben wir genug von der Zählerei. Sobald ein rotes Smartphone kommt, soll die Schleife beendet und „Hello world“ ausgegeben werden.
SAP empfiehlt EXIT nur in Schleifen zu verwenden. Wenn Sie ein Unterprogramm oder eine Methode verlassen wollen, verwenden Sie die RETURN-Anweisung.

Diese ABAP Tricks machen Ihr Leben leichter!

  • In meinem Newsletter gebe ich eine Menge Tipps und Kniffe rund um ABAP.
  • Die Mini-Tutorials unterstützen Sie dabei, Software in ABAP effizienter zu entwickeln.
  • Praktische Anleitungen ermöglichen Ihnen schnelle Erfolge bei der Optimierung Ihrer Arbeit.
  • Bei der Anmeldung zu meinem Newsletter erhalten Sie das Buch „ABAP Tipps und Tricks“ als Willkommensgeschenk.
ABAP Tipps und Tricks

Jetzt anfordern!

* Pflichtfeld
 
Kein SPAM. Ich hasse Spam genau so wie du.

Quellen:
Karl-Heinz Kühnhauser, Thorsten Franz (2011): Discover ABAP, 3. Auflage, Bonn
SAP Hilfe – ABAP-Systemfelder

Falls Ihnen dieser Beitrag weitergeholfen hat, wäre es eine sehr nette Anerkennung meiner Arbeit wenn Sie z.B. Ihre Bücher über Amazon bestellen würden. Wenn Sie ein Produkt kaufen, erhalte ich dafür eine Provision. Für Sie ändert sich am Preis des Produktes gar nichts. Ich möchte mich an dieser Stelle jetzt schon für Ihre Unterstützung bedanken.

Denis Reis ist Business Intelligence Consultant und gibt als Buchautor sein Wissen rund um den SAP Projektalltag weiter. Wenn Sie tatkräftige Unterstützung bei Ihren SAP BI Projekten benötigen, können Sie ihn über Xing, LinkedIn oder Facebook kontaktieren.
Des Weiteren unterrichtet er Projektmanagement und Controlling an der Wiesbaden Business School. Der aus Düsseldorf stammende Familienmensch zählt zu denjenigen, die auf komplizierte Darstellungen verzichten und das Ganze auf den Punkt bringen.

0 Kommentare

Dein Kommentar

Want to join the discussion?
Feel free to contribute!

Kommentar verfassen