Programmieren mit SAP ABAP: Teil 4 – Bedingungen setzen mit IF und CASE
Im dritten Teil unserer Blogreihe „Programmieren mit ABAP“ haben wir ein ABAP-Programm zur Ausgabe von Datensätzen in Listenform erstellt. Der vierte Teil beschäftigt sich mit den IF- und CASE-Bedingungen.
Inhaltsverzeichnis
Bedingungen im Alltag
Viele Aktivitäten und Ereignisse in unserem Alltag sind an gewisse Bedingungen geknüpft.
- Ein Beispiel aus dem Privatleben: Falls es heute Abend regnet, gehen wir nicht in den Biergarten.
- Ein Beispiel aus dem Berufsleben: Falls ich meine Verkaufszahlen auf X Stück steigere, erhalte ich am Ende des Jahres meinen Bonus.
Unabhängig von der Programmiersprache ist es auch in der Softwareentwicklung oft notwendig und gängige Praxis, die Ausführung bestimmter Anweisungsblöcke im Quellcode an Bedingungen zu knüpfen. Beim Programmieren mit ABAP werden zur Definition von Bedingungen regelmäßig Konstrukte mit den Befehlen IF oder CASE verwendet. Diese werden auch IF- beziehungsweise CASE-Verzweigungen genannt, da sie – vergleichbar mit einer „entweder oder“-Formulierung – verschiedene Handlungsalternativen beziehungsweise Handlungszweige beinhalten.
Eine im Alltag aufgestellte Bedingung kann unter Umständen sehr vage oder abhängig von der eigenen Interpretation sein (wie etwa „falls morgen schönes Wetter ist, …“). Bei Bedingungen im Programmcode muss es sich hingegen um exakt messbare Sachverhalte handeln. Dazu werden Felder und Feldinhalte, gegebenenfalls mithilfe von logischen Ausdrücken, miteinander verglichen. Falls Feldinhalte abgefragt werden, ist es wichtig, die korrekte Schreibweise dieser Inhalte einzuhalten. Beispiel: Ein Feld STUDIENABSCHLUSS in einem Arbeitsbereich WA_MITARBEITER kann mitunter den Feldinhalt „Dipl.-Ing.“ haben. Genau diese Variante möchten Sie als Bedingung für die Ausführung Ihres Anweisungsblocks festlegen, also: WA_MITARBEITER-STUDIENABSCHLUSS = ‘Dipl.-Ing.’. Verwenden Sie hier eine abweichende Schreibweise, wie etwa ‘Dipl-Ing’ oder ‘Dipl. Ing.’, wird der Computer nicht in der Lage sein, den Vergleich korrekt durchzuführen. Auch auf die Groß- und Kleinschreibung sollte geachtet werden, dabei kann aber unter Umständen mit dem Befehl TRANSLATE <text> TO UPPER CASE bzw. LOWER CASE Abhilfe geschaffen werden. Mehr über die Funktionsweise dieses Befehls erfahren Sie in diesem SAP-Hilfeartikel: https://help.sap.com/doc/saphelp_nw70/7.0.31/en-US/fc/eb33a5358411d1829f0000e829fbfe/content.htm?no_cache=true
Die IF-Verzweigung
Eine einfache Kontrollstruktur zur Formulierung von Bedingungen in Ihrem ABAP-Programmcode beginnt mit dem Statement IF.((vgl. SAP Hilfeartikel „IF“, https://help.sap.com/doc/abapdocu_750_index_htm/7.50/de-DE/abapif.htm letzter Aufruf: 27.03.2020)) Verkürzt lautet die Syntax der Kontrollstruktur folgendermaßen:
IF <log_expr>.
[<statement_block>]
ENDIF.
<log_expr> steht hier für eine „logical expression“, also einen logischen Ausdruck. Dabei handelt es sich um eine Bedingung für die Ausführung des darauffolgenden <statement_block>, also einer oder mehrerer Programmieranweisungen. Abgeschlossen wird die Kontrollstruktur mit dem Statement ENDIF.
Durch das folgende Beispiel wird die Funktionsweise der IF-Kontrollstruktur deutlicher: In der internen Tabelle ITAB_STUDENTEN in Ihrem ABAP-Programm befinden sich verschiedene Informationen zu den Studenten an einer Universität, wie etwa der jeweilige Studiengang. Mit Hilfe einer „Zählvariable“ ANZ_TECH_INF (vom Datentyp i) möchten Sie die Studenten zählen, die den Studiengang „Technische Informatik“ belegen. Die Umsetzung mit einem IF-Konstrukt kann folgendermaßen aussehen:
In diesem Beispiel werden alle Datensätze aus der internen Tabelle ITAB_STUDENTEN mit Hilfe einer LOOP-Schleife in den Arbeitsbereich WA_STUDENTEN gelesen. Zwischen IF und ENDIF werden die Bedingung und die davon abhängige Aktion festgelegt: Jedes Mal, wenn beim Verarbeiten der Tabelle ein Student mit dem Studiengang „Technische Informatik“ gefunden wird (IF WA_STUDENTEN-STUDIENGANG = ‘Technische Informatik’.), soll die Zählvariable um den Wert 1 erhöht werden (ANZ_TECH_INF = ANZ_TECH_INF + 1.). Sobald die Verarbeitung der Tabelle abgeschlossen ist, enthält die Zählvariable ANZ_TECH_INF die Gesamtanzahl der Studenten mit dem entsprechenden Studiengang.
Definition einer Handlungsalternative mit ELSE
Mit dem aktuellen IF-Konstrukt kommt es nur dann zu einer Aktion, falls die gegebene Bedingung erfüllt ist. Falls sie nicht erfüllt ist – und das gilt für alle Studenten-Datensätze mit einem abweichenden Studiengang – passiert schlichtweg nichts. Die Kontrollstruktur soll nun so erweitert werden, dass im Sinne von „entweder oder“ auch im zweiten Fall eine Aktion ausgelöst wird. Die abweichenden Studenten-Datensätze sollen anhand einer weiteren Zählvariable gezählt werden. Um dies umzusetzen, wird dem bisherigen Konstrukt eine ELSE-Anweisung hinzugefügt:
Sobald die IF-Bedingung („entweder“) durchlaufen wird und diese für den betrachteten Datensatz nicht zutrifft, springt das Programm weiter in den ELSE-Zweig („oder“) der Kontrollstruktur, um die alternative Programmieranweisung auszuführen.
Ergänzung weiterer Handlungszweige mit ELSEIF
Oft ist es jedoch notwendig, zusätzliche Handlungsalternativen in einem Programm zu berücksichtigen, die wiederum jeweils an Bedingungen geknüpft sind. Das funktioniert dann nach dem folgenden Prinzip: Falls Bedingung 1 erfüllt ist, führe Aktion A aus. Falls nicht: Prüfe, ob Bedingung 2 erfüllt ist. Falls Bedingung 2 erfüllt ist, führe Aktion B aus. Falls nicht: Prüfe, ob Bedingung 3 erfüllt ist. Falls Bedingung 3 erfüllt ist, führe Aktion C aus und so weiter.
Das Hinzufügen weiterer Bedingungen zum Programmcode wird durch die Anweisung ELSEIF umgesetzt. Nehmen wir an, Sie wollen zusätzlich zu den Studenten mit dem Studiengang „Technische Informatik“ auch jene mit den Studiengängen „Wirtschaftsmathematik“ und „Betriebswirtschaftslehre“ zählen. Die IF-Kontrollstruktur ist dazu folgendermaßen zu erweitern:
- Analog zu der oben aufgeführten Grafik wird im Programmcode zunächst geprüft, ob die erste Bedingung für den aktuell zu verarbeitenden Datensatz erfüllt ist: Enthält das Feld WA_STUDENTEN-STUDIENGANG den Wert „Technische Informatik“ (IF…)? Falls ja, wird der Zähler ANZ_TECH_INF um 1 erhöht.
- Falls nicht, wird die zweite Bedingung überprüft: Enthält das Feld WA_STUDENTEN-STUDIENGANG den Wert „Wirtschaftsmathematik“ (ELSEIF…)? Falls ja, wird der Zähler ANZ_WIMATHE um 1 erhöht.
- Falls nicht, wird die dritte Bedingung überprüft: Enthält das Feld WA_STUDENTEN-STUDIENGANG den Wert „Betriebswirtschaftslehre“ (ELSEIF…)? Falls ja, wird der Zähler ANZ_BWL um 1 erhöht.
- Falls keine der genannten Bedingungen erfüllt ist, also das Feld WA_STUDENTEN-STUDIENGANG für den betrachteten Datensatz einen ganz anderen Inhalt hat, greift der ELSE-Zweig: Der Zähler ANZ_SONSTIGE wird um 1 erhöht.
- Sobald eine der genannten Handlungsalternativen ausgeführt wurde, springt das Programm zur Anweisung ENDIF und verlässt damit die IF-Anweisung (für den gerade betrachteten Studenten-Datensatz).
Schachtelung und Verknüpfung von IF-Strukturen
Sie können IF-Strukturen auch schachteln, also eine IF-Struktur in eine andere IF-Struktur einbauen. Ein Beispiel dafür stellt der folgende Codeabschnitt dar:
Hier muss zunächst die Bedingung der übergeordneten IF-Struktur erfüllt sein, damit das Programm in die untergeordnete IF-Struktur springt, die dort aufgeführten Bedingungen wiederum prüft und die gewünschten Programmieranweisungen in Abhängigkeit davon ausgeführt werden.
Neben der Schachtelung besteht die Möglichkeit, verschiedene IF-Bedingungen mit Hilfe von AND beziehungsweise OR zu verknüpfen. Auch hierzu folgt ein passendes Codebeispiel:
Der Zähler ANZ_TECH_INF wird in diesem Beispiel erst dann um 1 erhöht, wenn beim betrachteten Studenten-Datensatz das Feld STATUS den Wert „aktiv“ und gleichzeitig das Feld STUDIENGANG den Wert „Technische Informatik“ hat.
Die CASE-Verzweigung
Im zuletzt genannten Codebeispiel wurden innerhalb einer einzigen IF-Kontrollstruktur zwei unterschiedliche Felder auf ihren Inhalt überprüft: das Feld Status und das Feld Studiengang. Dies ist nur ein Beispiel dafür, dass IF-Strukturen auch zur Abbildung von komplexen Bedingungsgefügen gut geeignet sind. In CASE-Verzweigungen hingegen wird nur ein einziges Datenobjekt, beispielsweise ein Feld, auf seinen Inhalt hin geprüft. ((vgl. SAP Hilfeartikel „CASE“, https://help.sap.com/doc/abapdocu_750_index_htm/7.50/de-DE/abapcase.htm letzter Aufruf: 27.03.2020)) Dafür lassen sich für das eine Feld sehr viel leichter (mit kürzerer Syntax) verschiedene Feldinhalte behandeln als dies mit einer IF-Struktur möglich ist. Die Syntax einer Kontrollstruktur mit CASE lautet folgendermaßen:
CASE <operand>.
[WHEN <operand1> [OR <operand2> [OR <operand3>] […]]].
[<statement_block1>] ]
… [WHEN OTHERS.
[<statement_blockn>] ]
ENDCASE.
Bei <operand> handelt es sich um das Datenobjekt, dessen Inhalt geprüft werden soll. Jeweils eingeleitet mit WHEN werden dann beliebig viele verschiedene Prüffälle für das Datenobjekt nacheinander durchlaufen. Sobald ein Prüffall-Operand (<operand1>, <operand2>, …) mit dem abgefragten ersten <operand> übereinstimmt, wird der zugeordnete Anweisungsblock (<statement_block>) ausgeführt. Wurde hingegen beim Durchlaufen der WHEN-Prüffälle kein übereinstimmender Operand gefunden, läuft das Programm in den Zweig WHEN OTHERS, der analog zum ELSE-Zweig bei IF-Strukturen „alle sonstigen Fälle“ abdeckt. Abgeschlossen wird das CASE-Konstrukt durch das Statement ENDCASE.
Zu beachten ist: Nicht in jeder IF-Struktur wird eine ELSE-Anweisung benötigt, denn auch ohne eine solche läuft das entsprechende Programm weiter, sofern die IF-Bedingung nicht erfüllt wird. Innerhalb einer CASE-Verzweigung sollte jedoch immer auch ein WHEN OTHERS-Statement formuliert werden: Ohne dieses würde das Programm abbrechen, falls sich beim Durchlaufen einer CASE-Anweisung kein zutreffender Zweig findet.
CASE, WHEN und WHEN OTHERS im Praxisbeispiel
So viel zur Theorie – das folgende Beispiel zeigt, wie die praktische Umsetzung einer CASE-Kontrollstruktur aussehen kann. Auch hier wird die oben bereits verwendete interne Tabelle für Studenten-Daten und insbesondere das darin enthaltene Feld STUDIENGANG betrachtet:
Im ersten Schritt werden mit Hilfe der LOOP-Anweisung erneut die Studenten-Datensätze aus der internen Tabelle ITAB_STUDENTEN in den passenden Arbeitsbereich gelesen. Nach dem CASE-Statement wird das Datenobjekt genannt, dessen Inhalt anschließend überprüft werden soll, hier das Feld WA_STUDENTEN-STUDIENGANG. Um dieses Feld geht es nun in der gesamten CASE-Kontrollstruktur.
Mithilfe des Statements WHEN werden verschiedene Möglichkeiten im Hinblick auf den aktuellen Inhalt des Feldes überprüft. So fragt beispielsweise WHEN ‘Technische Informatik’ ab, ob das Feld STUDIENGANG im aktuellen Verarbeitungsdurchlauf den Wert „Technische Informatik“ enthält. Ist diese Bedingung erfüllt, so wird die darauffolgende Programmieranweisung ausgeführt, also ANZ_TECH_INF = ANZ_TECH_INF + 1.
Anschließend springt das Programm direkt weiter zum Befehl ENDCASE. Ist die Bedingung jedoch nicht erfüllt, wird geprüft, ob die nächste WHEN-Bedingung zutrifft und so weiter. Falls der aktuelle Wert des Feldes STUDIENGANG mit keinem der abgefragten Werte übereinstimmt, hier also weder mit „Technische Informatik“ noch mit „Wirtschaftsmathematik“, läuft das Programm in den WHEN OTHERS-Zweig hinein und die dort definierte Programmieranweisung wird ausgeführt. Analog zu IF-Strukturen können auch CASE-Strukturen bei Bedarf geschachtelt werden.
Unterschiede zwischen IF- und CASE-Verzweigungen
Falls Sie in einem Programm Bedingungen aufstellen möchten, die sich auf den Inhalt eines bestimmten Feldes beziehen, stellen die IF- und die CASE-Kontrollstruktur grundsätzlich semantisch gleichwertige Alternativen für die Umsetzung dar. In dieser Ausgangslage ist es jedoch aus zwei Gründen vorteilhaft, die CASE-Struktur zu verwenden:
- Wenn viele Fallunterscheidungen gemacht werden sollen, werden entsprechend viele ELSEIF- beziehungsweise. WHEN-Zweige benötigt. Während nach ELSEIF jedoch stets sowohl der Feldname als auch der zu prüfende Feldinhalt genannt werden müssen, ist nach WHEN jeweils nur der Feldinhalt aufzuführen. Im direkten Vergleich:
Die CASE-Variante ist hier nicht nur übersichtlicher, sondern kostet Sie in der Programmierung auch weniger Zeit.
- Unter dem Aspekt der Programm-Performance sind CASE-Strukturen ebenfalls zu bevorzugen, da sie etwas schneller verarbeitet werden können als IF-Strukturen.
Gestaltet sich Ihre Ausgangslage hingegen derart, dass Sie mit einer Kontrollstruktur mehrere unterschiedliche Bedingungen oder geschachtelt wechselnde Bedingungen prüfen wollen, so ist eine IF-Struktur in der Regel besser geeignet.
Das war unser vierter Teil der Reihe “Programmieren mit ABAP”. An dieser Stelle möchten wir Sie auf die vorangegangenen Teile hinweisen:
- Programmieren mit ABAP: Teil 1 – Das ABAP Dictionary in der Theorie
- Programmieren mit ABAP: Teil 2 – Das ABAP Dictionary in der Praxis
- Programmieren mit ABAP: Teil 3 – Erstellung eines ABAP-Programms
Quellen
- Franz, Thorsten/Kühnhauser, Karl-Heinz (2019): Einstieg in ABAP, 2. Aufl., S. 260-265;
- SAP Hilfeartikel „IF“, https://help.sap.com/doc/abapdocu_750_index_htm/7.50/de-DE/abapif.htm letzter Aufruf: 27.03.2020
- SAP Hilfeartikel „CASE“, https://help.sap.com/doc/abapdocu_750_index_htm/7.50/de-DE/abapcase.htm letzter Aufruf: 27.03.2020
Über den Autor
Franziska Georg beschäftigt sich im Bereich Workplace Solutions mit der Entwicklung von Lösungsbausteinen im Rahmen von Microsoft 365. Standardprodukte wie SharePoint Online oder Microsoft Teams passt sie mit Hilfe der eigenentwickelten Komponenten so an, dass eine individuell zugeschnittene Arbeitsumgebung entsteht.