SELECT, DO, WHILE Schleifen und Abbruchanweisungen in ABAP
Dieser Beitrag ist Teil des Kurses ABAP Grundlagen.
Schleifen, oder auch Wiederholungen genannt, dienen dazu Anweisungsblöcke mehrfach auszuführen. In diesem Beitrag werden SELECT
– DO
– 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.
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.
Hinterlasse einen Kommentar
An der Diskussion beteiligen?Hinterlasse uns deinen Kommentar!