IF und CASE Verzweigungen in ABAP
Dieser Beitrag ist Teil des Kurses ABAP Grundlagen.
Eine Verzweigung kann ungangsprachlich als eine entweder-oder Bedingung formuliert werden. Dabei sollen bestimmte Aktionen bzw. Anweisungen nur dann ausgeführt werden, wenn die Bedingung erfüllt ist. Im ABAP werden dazu Felder und Feldinhalte verglichen oder mit logischen Ausdrücken verknüpft. In diesem Beitrag werden IF
und CASE
Anweisungen behandelt.
IF
Ein Beispiel für eine solche Verzweigung stellt die IF-Struktur dar. Diese Kontrollstruktur beginnt in ABAP mit der Anweisung
IF
, danach folgt eine Bedingung. Die Struktur endet mit der Anweisung ENDIF
. Dazwischen stehen Befehle, die ausgeführt werden, falls die Bedingung erfüllt ist.Angenommen, Sie wollen in einer Tabelle, die Smartphones enthält, nur die roten Smartphones zählen. Dazu verarbeiten Sie alle Sätze der Tabelle ganz normal, wenn jedoch ein Satz eine besondere Bedingung erfüllt, wird der Counter um 1 erhöht.
SELECT * FROM zsmartphones into ls_zsmartphones. IF ls_zsmartphones-tfarbe = 'ROT'. lv_counter_rot = lv_counter_rot + 1. ENDIF. ENDSELECT.
Wenn das Feld für die Farbe den Inhalt „ROT“ hat (achten Sie bitte auf Groß- und Kleinschreibung!), ist die Bedignung erfüllt und der Anweisungsblock wird ausgeführt.
Sie können Ihre Verzweigung auch nach dem entweder-oder Prinzip aufbauen. Verwenden Sie dazu den Befehl ELSE
. Falls die Bedingung der IF
-Anweisung erfüllt ist, wird der erste Anweisungsblock ausgeführt, ansonsten der zweite Block nach der ELSE
-Anweisung. So erweitern wir unser Coding, um auch die restlichen Smartphones zu zählen.
SELECT * FROM zsmartphones into ls_zsmartphones. IF ls_zsmartphones-tfarbe = 'ROT'. lv_counter_rot = lv_counter_rot + 1. ELSE. lv_counter_sonst = lv_counter_sonst + 1. ENDIF. ENDSELECT.
Sie können mit ELSEIF
auch mehrere Bedingungen prüfen. Wird die erste Bedingung nicht erfüllt, wird die zweite Bedingung geprüft. Falls auch diese nicht erfüllt ist, wird eine dritte Bedingung geprüft. Das Spiel lässt sich unendlich fortsetzen und kann für die restlichen Fälle auch noch mit ELSE
abgeschlossen werden.
SELECT * FROM zsmartphones INTO ls_zsmartphones. IF ls_zsmartphones-tfarbe = 'ROT'. lv_counter_rot = lv_counter_rot + 1. ELSEIF ls_zsmartphones-tfarbe = 'BLAU'. lv_counter_blau = lv_counter_blau + 1. ELSEIF ls_zsmartphones-tfarbe = 'GELB'. lv_counter_gelb = lv_counter_gelb + 1. ELSE. lv_counter_sonst = lv_counter_sonst + 1. ENDIF. ENDSELECT.
Die erste Bedingung wird erfüllt, wenn im Feld „Farbe“ der Wert „ROT“ enthalten ist. Dann wird der Counter für rote Smartphones um eins erhöht. Anschließend prüft das System keine weiteren Bedingungen mehr. Das System springt sofort zu ENDIF
und setzt das Programm fort. In unserem Fall geht es wieder in die Schleife, bis alle Datensätze verarbeitet sind.
Ist die erste Bedingung nicht erfüllt, prüft das System ob die zweite Bedingung erfüllt ist. Also, ob die Farbe „BLAU“ lautet. Ist das der Fall, wird der zweite Anweisungsblock ausgeführt und die blauen Smartphones gezählt. Ist die zweite Bedingung ebenfalls nicht erfüllt, wird die dritte Bedingung „GELB“ geprüft. Trifft diese zu, werden die gelben Smartphones hochgezählt.
Falls auch die dritte Bedingung nicht erfüllt ist, trifft der ELSE
-Fall ein. Dann werden die sonstigen Smartphones gezählt. Danach springt das System zu ENDIF
und geht anschließend zum nächsten Kommando nach ENDIF
.
Anbei der komplette Code:
REPORT z_smartphones. DATA: ls_zsmartphones TYPE zsmartphones, lv_counter_rot TYPE i, lv_counter_blau TYPE i, lv_counter_gelb TYPE i, lv_counter_sonst TYPE i. SELECT * FROM zsmartphones INTO ls_zsmartphones. IF ls_zsmartphones-tfarbe = 'ROT'. lv_counter_rot = lv_counter_rot + 1. ELSEIF ls_zsmartphones-tfarbe = 'BLAU'. lv_counter_blau = lv_counter_blau + 1. ELSEIF ls_zsmartphones-tfarbe = 'GELB'. lv_counter_gelb = lv_counter_gelb + 1. ELSE. lv_counter_sonst = lv_counter_sonst + 1. ENDIF. ENDSELECT. WRITE: / lv_counter_rot, 'rote Smartphones', / lv_counter_blau, 'blaue Smartphones', / lv_counter_gelb, 'gelbe Smartphones', / lv_counter_sonst, 'sonstige Smartphones'.
Das Ergebnis sieht wie folgt aus:
Sie können IF-Strukturen schachteln oder verknüpfen.
Geschachtelte Strukturen würden wie folgt aussehen:
IF bedingung1. IF bedingung2. anweisung. ENDIF. ENDIF.
Wenn Bedingung 1 zturifft, prüfe Bedingung 2. Wenn Bedingung 2 zutrifft, führe die Anweisung aus.
Sie können die Ausdrücke aber auch verknüpfen:
IF bedingung1 AND bedingung2. anweisung. ENDIF.
Dabei sind die beiden Beispiele inhaltlich identisch. Die Anweisung wird nur ausgeführt, wenn beide Bedingungen erfüllt sind.
CASE
Im Gegensatz zu der IF
-Struktur, die komplexe logische Bedingungen prüfen kann, prüft CASE
nur den Inhalt eines einzigen Feldes. Wenn die Bedingung und Feldinhalt übereinstimmen, wird der zugehörige Anweisungsblock ausgeführt, sonst nicht. Umgangssprachlich ausgedrückt: Während bei der IF
-Struktur es den Fall geben kann, dass es regnet und die Sonne scheint, kann in CASE
entweder die Sonne scheinen oder es regnet. Daher ist der CASE
Befehl ein wenig schneller als IF
.
Genau wie in einer IF
-Struktur wird in CASE
immer nur ein Anweisungsblock verarbeitet. Nach diesem verzweigt das System zu ENDCASE
, ohne weitere Feldinhalte zu prüfen, und setzt die Verarbeitung mit dem ersten Befehl nach der CASE
-Struktur fort.
Die CASE
-Struktur kommt zur Anwendung, wenn es gelingt, eine Bedingung eindeutig mit einem Feldinhalt abzustimmen.
In unserem Beispiel könnten wir gut mit CASE
arbeiten. Wir prüfen den Inhalt des Tabellenfeldes tfarbe
, je nach Feldinhalt wird in den entsprechenden Anweisungsblock verzweigt. Dabei übernimmt die Anweisung WHEN OTHERS
die gleiche Funktion wie ELSE
bei der IF
-Struktur.
SELECT * FROM zsmartphones INTO ls_zsmartphones. CASE ls_zsmartphones-tfarbe. WHEN 'ROT'. lv_counter_rot = lv_counter_rot + 1. WHEN 'BLAU'. lv_counter_blau = lv_counter_blau + 1. WHEN 'GELB'. lv_counter_gelb = lv_counter_gelb + 1. WHEN OTHERS. lv_counter_sonst = lv_counter_sonst + 1. ENDCASE. ENDSELECT.
In der Regel wird CASE bei der Auswertung von Returncodes angewendet. So hat, je nach Erfolg oder Misserfolg eines Befehls, SY-SUBRC
einen eindeutigen Inhalt. Diesen können wir über die CASE
-Struktur abfragen. So kann ein Programm trotz eines Fehlers zu Ende ausgeführt werden bzw. alternative Prozesse eingeleitet werden.
Wenn Sie zum Beispiel mithilfe von SELECT
in einer Tabelle suchen, liefert der Befehl den Reutrncode 0
, falls mindestens ein Satz in der Tabelle gelesen werden konnte. Falls kein passender Satz gelesen werden konnte, wird der Returncode 4
ausgegeben.
SELECT * FROM zsmartphones INTO ls_zsmartphones WHERE tfarbe = 'ROT'. lv_counter_rot = lv_counter_rot + 1. ENDSELECT. CASE sy-subrc. WHEN 0. WRITE: / lv_counter_rot, 'rote Smartphones gefunden'. WHEN 4. WRITE: / 'Keine rote Smartphones gefunden'. ENDCASE.
Ist der Returncode 0
, ist die Welt in Ordnung.
Falls der Returncode 4
geliefert wird (z.B. wenn wir nur weiße oder schwarze Smartphones liefern), wird die Routine für Fehlerbehandlung durchlaufen.
CASE
-Strukturen können genauso wie IF
-Strukturen geschachtelt werden. Außerdem ist auch eine Kombination von IF
und CASE
möglich.
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!