IF und CASE Verzweigungen in ABAP

IF und CASE Verzweigungen in ABAP
4.3 Sterne
9 Bewertungen


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:

Ausgabe des Programms

Ergebnis

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.

Ausgabe SY-SUBRC 0

Ergebnis SY-SUBRC 0

Falls der Returncode 4 geliefert wird (z.B. wenn wir nur weiße oder schwarze Smartphones liefern), wird die Routine für Fehlerbehandlung durchlaufen.

Ergebnis sy-subrc 4

Ausgabe SY-SUBRC 4

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.
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 bei Dahlbeer und gibt als Buchautor sein Wissen rund um den SAP Projektalltag weiter. 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