ABAP: die logischen Operatoren AND, OR, NOT mit Codebeispielen

Die Programmiersprache ABAP kennt die logischen Operatoren AND, OR und NOT. Anders als in Programmiersprachen wie Java gibt es aber keinen echten booleschen Datentyp. Stattdessen speichert ABAP boolesche Daten in Strings der Länge 1. Das hat Folgen für den Umgang mit diesen Daten.

(Übrigens: benannt wurden boolesche Daten nach dem Englischen Mathematiker George Boole, der wichtige Arbeiten zur Logik geleistet hat.)

Boolesche Daten in ABAP-Variablen speichern

Schauen wir uns zunächst an, wie du in ABAP logische Werte in Variablen speichern kannst:

Die Typgruppe ABAP (“ABAP Language Type-Pool”) enthält diese Definitionen:

  • Abap_bool type c length 1. (Das ist ein Textfeld der Länge 1.)
  • Abap_false type abap_bool value ‘ ‘
  • Abap_true type abap_bool value ‘X’

Das heißt: aus Sicht von ABAP ist eine boolesche Variable ein Zeichenfeld der Länge 1. Konvention ist dabei, dass das Leerzeichen (also ‘ ‘ und nicht etwa der Leerstring ‘’) als false gilt. Das ‘X’ wird als true gewertet. Dafür sind die Konstanten abap_true und abap_false vorgesehen.

Im Prinzip kannst du natürlich auch ‘ ‘ und ‘X’ schreiben. Ich habe das auch schon oft so gesehen. Dein Code wird aber lesbarer, wenn du diese Konstanten verwendest. Es ist dann für jeden Leser klar, dass es hier um boolesche Werte geht. Auch schützt du dich damit vor Schreibfehlern wie

" falsch
x = ''. 

" richtig
x = ' '.

" falsch
x = 'x'

" richtig 
x = 'X'. 

Richtig ist also Blank und nicht der leere String. Richtig ist das große X und nicht das kleine x.

Man sieht oft auch Variablendefinitionen mit dem Datentyp flag. Flag ist ein Datenelement aus dem Data Dictionary. Es ist von der gleichnamigen Domäne flag, und diese ist definiert als CHAR der Länge 1.

Das Datenelement flag ist immer dann wichtig, wenn boolesche Werte in Datenbanken abgelegt werden sollen. Abap_bool lässt sich dort nicht einsetzen, weil die Spalten einer Datenbanktabelle immer auf den Basistypen des Data Dictionary aufbauen müssen. Die sogenannten „eingebauten Datentypen“ der ABAP-Programmiersprache können hier nicht verwendet werden.

Kommen wir nun zu den Operatoren AND, OR und NOT:

AND – die Und-Verknüpfung in ABAP

Hier ist ein Beispiel für den Einsatz von AND:

DATA: x TYPE abap_bool VALUE abap_true,
      y TYPE abap_bool VALUE abap_false,
      z TYPE abap_bool.

" hier könnte Code stehen, der x und y setzt

IF x = abap_true AND y = abap_false.
  z = abap_true.
ELSE.
  z = abap_false.
ENDIF.

WRITE: / 'Ergebnis:', z.

Wir verwenden drei boolesche Variablen x, y und z.

Die Werte x und y werden von irgendwo her beschafft. Anschließend sollen x und y miteinander verknüpft werden. Das Ergebnis wird ausgegeben. Die Ausgabe ist dann entweder ein X oder ein Leerstring.

Man sieht auch: der Code ist unhandlicher als in anderen Sprachen. Eine Kurzschreibweise wie in Java ist nicht möglich.

z = x && y;

Auch ist es in ABAP immer nötig, explizit mit abap_true oder abap_false zu vergleichen. Auch das hier ist nicht möglich:

" ungültige Schreibweise:
IF x AND y

Man sieht deutlich, dass abap_bool kein echter boolescher Datentyp ist.

OR – die Oder-Verknüpfung in ABAP

Hier ist ein Beispiel für den Einsatz von OR:

DATA: x TYPE abap_bool VALUE abap_true,
      y TYPE abap_bool VALUE abap_false,
      z TYPE abap_bool.

" hier könnte Code stehen, der x und y setzt

IF x = abap_true OR y = abap_false.
  z = abap_true.
ELSE.
  z = abap_false.
ENDIF.

WRITE: / 'Ergebnis:', z.

Bis auf den Wechsel von AND zu OR ist der Code identisch. Auch hier gilt: es gibt keine Kurzschreibweise wie in Java:

z = x || y;

NOT – die Nicht-Verknüpfung in ABAP

Der NOT-Operator dreht einen booleschen Ausdruck um. Aus true wird false, aus false wird true. Hier ein Codebeispiel:

Data: a type flag.
If not ( a = abap_true ).
     " Do someting
endif.

Auch hier gilt: a ist in Wirklichkeit ein String der Länge 1. Deshalb kannst du nicht schreiben:

" das hier geht nicht:
data: a, b type flag.
" get some value for a
b = not a

Es gibt keinen XOR-Befehl in ABAP

Hinweisen möchte ich noch auf XOR: es gibt in ABAP keinen XOR-Befehl. Das wäre ein Befehl, der prüft, ob genau eine der beiden Seiten TRUE ist.

Also c = a xor b.

Das Ergebnis wäre true, wenn a = true ist, aber b nicht (oder umgekehrt).

Wenn aber a und b beide true sind, wäre das Ergebnis von xor false.

Manche Programmiersprachen kennen so etwas. Java beispielsweise hat den Operator ^.

ABAP hat so einen Operator aber nicht.

Wo kann man die logischen Operatoren einsetzen?

Der natürliche Ort, wo man die logischen Operatoren AND, OR und NOT findet, sind If-Statements. Beispiele dafür hatten wir uns oben angeschaut.

Darüber hinaus gibt es noch weitere Möglichkeiten, auf diese Operatoren zu stoßen:

  • while-Loops
  • Case-Statements
  • eingebettete SQL-Statements

Logische Operatoren in while-Loops

Eine while-Schleife wiederholt den Schleifenrumpf solange die Eingangsbedingung erfüllt ist. Nach while steht daher ein logischer Ausdruck. Dieser kann auch boolesche Operatoren enthalten.

Hier ein Beispiel mit AND

DATA: i TYPE i VALUE 1.
DATA: j TYPE i VALUE 10.

" initialize i and j somehow
" ...

WHILE i < 5 AND j > 5.
  WRITE: / 'i is', i, 'and j is', j.
  i = i + 1.
  j = j - 1.
ENDWHILE.

Und ein Beispiel mit OR

DATA: i TYPE i VALUE 1.

" initialize i and j somehow
" ...

WHILE i < 5 OR i > 8.
  WRITE: / 'i is', i.
  i = i + 1.
ENDWHILE.

Und zu guter Letzt noch eines mit NOT

DATA: i TYPE i VALUE 1.

" initialize i somehow
" ...

WHILE NOT i > 5.
  WRITE: / 'i is', i.
  i = i + 1.
ENDWHILE.

OR in Case-Statements

Das ABAP-Schlüsselwort OR kann in Case-Staments verwendet werden. (AND oder NOT allerdings nicht.)

Nehmen wir an, wir haben eine Variable mit dem Name „grade“ für eine Benotung. Es kommen Werte A, B, C etc. und wir wollen das kommentieren. Dann könnte dieser Code entstehen.

DATA: grade TYPE char1.
" get some value for grade
" ...
" now decide
CASE grade.
  WHEN 'A' OR 'B'.
    WRITE: / 'Congratulations! You passed with honors.'.
  WHEN 'C' OR 'D'.
    WRITE: / 'You passed, but there's room for improvement.'.
  WHEN OTHERS.
    WRITE: / 'Sorry, you failed. Better luck next time.'.
ENDCASE.

Du siehst, du kannst mehrere When-Fälle zusammenfassen. Die Werte werden dabei mit OR verbunden.

eingebettete SQL-Statements

Es ist eine der großen Stärken von ABAP, dass Datenbankabfragen direkt im Programmcode möglich sind. Auch hier können AND, OR und NOT verwendet werden.

Hier ist ein Codebeispiel für die Standard-Beispieltabelle sflight:

DATA: lt_sflight TYPE TABLE OF sflight.

SELECT * FROM sflight INTO TABLE lt_sflight
  WHERE carrid = 'LH' AND connid = '0400'.

Weitere SAP- und ABAP-Tipps findest du hier.

heiko

Dipl.-Ing. Heiko Evermann

Vorheriger Artikel