Das if-Statement in ABAP (if, elsif, else, endif)

Wie in allen höheren Programmiersprachen hat auch ABAP ein if-Statement: Die Ausführung eines Teils des Codes kann damit von Bedingungen abhängig gemacht werden.

So sieht der einfachste Fall aus:

data: a type i.
a = 7.
if a > 5.
  write: / 'a ist größer als 5'.
endif.

Auch ein else-Zweig wird unterstützt:

data: a type i.
a = 7.
if a > 5.
  write: / 'a ist größer als 5'.
else.
  write: / 'a ist nicht größer als 5'.
endif.

ABAP kennt auch die Möglichkeit, mehrere if-Abfragen nacheinander zu machen. Das Schlüsselwort hierzu lautet elseif. Wichtig ist: bei dieser Konstruktion wird nur einer der möglichen Pfade genommen. Wenn der erste Vergleich zutrifft, wird der zweite nicht mehr geprüft. Das ist bei dieser Abfrage auch genau so gewollt:

data: a type i.
a = 7.
if a > 7.
  write: / 'a ist größer als 7'.
elseif a > 5.
  write: / 'a ist größer als 5'.
else.
  write: / 'a ist nicht größer als 5'.
endif.

Auf einige Unterschiede zu anderen Programmiersprachen möchte ich gesondert hinweisen:

ABAP verwendet keine Klammern

Anders als C oder Java verwendet ABAP keine geschweiften Klammern zur Kennzeichnung der Codeblöcke.

Anders als C oder Java verwendet ABAP keine runden Klammern um die Bedingung.

Stattdessen werden alle Schlüsselwörter des IF-Befehls mit Punkt abgeschlossen:

  • das IF
  • das ELSEIF (es heißt in ABAP elseif, nicht wie in anderen Sprachen elsif oder elif)
  • das ELSE
  • und nicht zuletzt das explizite ENDIF.

Vergleichsoperatoren in ABAP vs. in Java

  • Der Test auf Gleichheit lautet in ABAP „=“ und nicht wie in Java „==“. In C ist das == wichtig, weil ein einfaches „=“ an dieser Stelle als Wertzuweisung betrachtet werden würde. In C ist das ein häufiger Fehler. In Java ist ein = an dieser Stelle deshalb ein Syntax Error.
  • Der Test auf Ungleichheit lautet in ABAP „<>“ und nicht „!=“ wie in Java und C . (Es wäre eine Aufgabe von wenigen Minuten, dem ABAP-Compiler beizubringen, beides zu unterstützen, aber leider wurde das nie gemacht…)

APAB hat keine boolschen Variablen

Ein wichtiger Unterschied beim Umstieg von Java zu ABAP ist: im ABAP gibt es keine boolschen Variablen. Stattdessen wird ein Zeichentyp (Character) der Länge 1 verwendet. Dieser ist z.B: im Datenelement flag oder xflag vorhanden. (In beiden ist die Domäne entsprechend definiert.) Daneben gibt es die Typdefinition abap_bool als „type c length 1“. Vorzuziehen ist m.E. abap_bool.

Die Verabredung ist

  • ‚X‘ steht für true,
  • ‚ ‚, also ein Leerzeichen (blank) steht für false.

Man findet daher häufig ABAP code mit direktem Vergleich auf ‚X‘. Gut ist das nicht, weil man sich hierbei leicht verschreiben kann. Der Unterschied zwischen große, und kleinem X ist gering und im Code nur schwer zu sehen.

if myvar = 'X'.
   " some code
endif.
 
if myvar = 'X'.
   " some code
endif.

Besser ist es daher, die in ABAP definierten Konstanten zu verwenden. Diese befinden sich, genauso wie der Typ abap_bool in der Typgruppe ABAP:

  • abap_true steht für ‚X‘
  • abap_false steht für ‚ ‚

Neben der Sicherheit gegen Verschreiber verbessert dies auch die Lesbarkeit: es wird deutlich, dass wir es mit einem bool’schen Wert zu tun haben und nicht mit einem Zeichen.

if myvar = abap_true.
   " some ABAP code
endif.
 
if myothervar = abap_false.
   " some ABAP code
endif.

Weil es in ABAP keinen echten bool’schen Datentyp gibt, kann man auch die aus Java gewohnte Kurzschreibweise nicht verwenden. Wenn in Java myboolvar vom Typ boolean ist, kann man dort schreiben:

if (myboolvar) {
  // some Java code
}

In ABAP geht dies nicht. Dieser Code ist laut ABAP-Compiler fehlerhaft:

data: a type abap_bool.

a = abap_true.
if a. " This is a syntax error!
 write: / 'a ist true'.
endif.

Man muss immer explizit „if myboolvar = abap_true“ ausschreiben.

Vergleichsoperatoren in ABAP

ABAP kennt eine Reihe von logischen Operatoren. Manche haben eine merkwürdige Schreibweise als Buchstabenkombination:

= bzw. EQ

Hier wird auf Gleichheit geprüft. Neben dem üblichen = kann auch EQ geschrieben werden. (Englisch: equals)

<> bzw. NE

Hier wird auf Ungleichheit geprüft. Neben <> kann auch NE für (not equals) geschrieben werden. Wichtig ist: != (Java und C) geht in ABAP nicht.

> bzw. GT

Neben > geht auch GT für „greater than“

< bzw. LT

Neben < geht auch LT für „less than‘

>= bzw. GE

Neben >= geht auch GE für „greater or equal“

<= bzw. LE

Neben <= geht auch LE für „less or equal“

AND

AND prüft, ob beide Bedingungen erfüllt sind. Bsp:

IF x = 1 AND y = 2.

OR

OR prüft, ob eine der beiden Bedingungen erfüllt ist:

IF x = 1 OR y = 2.

NOT

Der NOT-Operator kehrt abap_true und abap_false um:

IF NOT x = 1.

Between

Anstelle von

if a >= 10 and a <=100.

geht auch

if a between 10 and 100.

Dieses Konstrukt gibt es in Java oder C nicht.

IN

Der IN-Operator arbeitet auf Variablen vom Typ range. Wenn s_range ein Rangetyp ist, der zum Typ von x passt, dann kann man schreiben:

IF x IN s_range.

Der Range kann dabei eine komplexe Struktur haben. Beispiele dafür kennt man in der Tabellensicht SE16 bei den Seletionsbedingungen. Das können Einzelwerte oder Zahlenbereiche sein, jeweils als Einschluss- oder als Ausschlusskriterium

geschachtelte if-Befehle

Man kann If-Statements schachteln. Hier ist ein Beispiel:

IF x < y.
  WRITE 'x is less than y'.
ELSE.
  IF x > y.
    WRITE 'x is greater than y'.
  ELSE.
    WRITE 'x is equal to y'.
  ENDIF.
ENDIF.

Je nach Aufgabenstellung kann der Code dabei beliebig komplex werden.

Ich finde es wichtig, die Schachtelungsebenen knapp zu halten. Je tiefer die Verschachtelung geht, desto unübersichtlicher und damit unverständlicher wird der Code.

Mehr Artikel zu SAP gibt es hier:

heiko

Dipl.-Ing. Heiko Evermann

Vorheriger Artikel