Modernes ABAP

Enumerations - Aufzählungstypen

(C) Brandeis Consulting.

Beispiele für konstante Werte in Programmen

  CONSTANTS:
    gc_green          TYPE gty_light_state VALUE 0,
    gc_yellow         TYPE gty_light_state VALUE 1,
    gc_red            TYPE gty_light_state VALUE 2,
    gc_red_and_yellow TYPE gty_light_state VALUE 3.
-----
  IF sign = 'EQ' or sign = 'NE'.
  ...



(C) Brandeis Consulting.

Konzept von Enumerations

Mit der Definition von Enumerations (deutsch: Aufzählungsobjekten) werden gleichzeitig zwei Dinge angelegt:

  • Ein Datentyp
  • Ein oder mehrere Konstante Werte mit diesem Datentypen
    TYPES:  BEGIN OF ENUM ecolour,
              "colour_red, 
              colour_green,
              colour_blue,
              colour_yellow,
              colour_orange,
              colour_violet,
            END OF ENUM ecolour.

Es wird zur Designzeit geprüft, dass alle Zuweisungen und Vergleiche immer mit dem exakt gleichen Typ stattfinden. Damit ist es nicht möglich, andere Werte zu verwenden.

(C) Brandeis Consulting.

Enumerations - Einfaches Beispiel

    TYPES:  BEGIN OF ENUM ecolour,
              colour_red,
              colour_green,
              colour_blue,
              colour_yellow,
              colour_orange,
              colour_violet,
            END OF ENUM ecolour.

    METHODS get_colour_text 
          IMPORTING colour TYPE ecolour
          RETURNING VALUE(result) TYPE STRING. 

  ....
  CLASS xyz IMPLEMENTATION. 

    METHOD get_colour_text. 
      IF colour = colour_red.
        result = |Beautiful colour|. 
      ENDIF.
    ENDMETHDOD.  

Alle Verwender beziehen sich auf genau diese eine Definition:

  • Der Typ ECOLOUR kann zur Definition von Variablen oder Parametern verwendet werden.
  • Die Werte COLOUR_RED etc. können als Konstante verwendet werden.
(C) Brandeis Consulting.

Vorteile der Verwendung von Enumerations

  • Es können nur erlaubte (d.h. definierte) Werte verwendet werden. Damit kann sich Programmlogik darauf 100% verlassen.
  • Es gibt exakt eine zentrale Definition. Das hilft z.B. bei der Suche nach Verwendungen der Werte.
  • Die Typprüfung lässt keine Zuweisungen von anderen Datentypen bzw. Enumerations zu, auch wenn intern der gleiche Datentyp verwendet wird. Das verhindert, das die gleiche Konstante X-fach definiert wird.
  • Der interne Datentyp spielt kaum eine Rolle.
(C) Brandeis Consulting.

Konstante in Strukturen - STRUCTURE

Die definierten Konstanten können auch als Komponenten einer Struktur definiert werden. Damit sind diese schön gruppiert.

TYPES:  BEGIN OF ENUM ecolour STRUCTURE colour,
          red,
          green,
          blue,
          yellow,
          orange,
          violet,
        END OF ENUM ecolour STRUCTURE colour.

  IF new_colour = colour-red. 

  ENDIF.
(C) Brandeis Consulting.

Manuelle Wertzuweisung - VALUE

Den Konstanten können manuell feste Werte vergeben werden. Das ist insbesondere wichtig, falls die Werte irgendwo persistiert werden oder falls bestehende Anwendungen migriert werden sollen.
Ein anderer guter Grund kann sein, dass man die Reihenfolge beim Sortieren nach dem Wert festlegen möchte.

  TYPES: BEGIN OF ENUM ecolour ,
              red     VALUE 0,
              green   VALUE 1,
              blue    VALUE 2,
              yellow  VALUE 3,
              orange  VALUE 4,
              violet  VALUE 5,
        END OF ENUM ecolour.

(C) Brandeis Consulting.

Typisierte Enumerations - BASE TYPE

Normalerweise verwendet ABAP intern den Typen i für Enumerations. Wenn zeichenartiger Werte manuell vergeben werden sollen, dann muss der Datentyp entsprechend gesetzt werden.

  TYPES toption TYPE C LENGTH 2. 

  TYPES: BEGIN OF ENUM eoption BASE TYPE toption,
          eq VALUE 'EQ',
          bt VALUE 'BT',
          le VALUE 'LE',
          lt VALUE 'LT',
          ...
         END OF ENUM eoption.

Bei Zeichenketten gibt es eine Maximallänge von 8 Zeichen! Siehe Beispiel Aufgabenstatus.
(C) Brandeis Consulting.

Zugriff auf den Wert

Auf den Wert eines Enumeration Objektes kann nicht direkt zugegriffen werden. Statt dessen liefert eine Zuweisung bzw. Ausgabe dessen Bezeichner. SAP Doku

Konvertierung in den Wert

Wenn der Wert in die Datenbank geschrieben wird, dann passt der Typ nicht und muss konvertiert werden.

variable_of_basetype = CONV base_type( enum_value ).{abap}

Konvertierung in die Enumeration

Umgekehrt muss aus dem Wert in der Datenbank wieder ein passender Enumerationstyp werden:

variable_of_enumtype = CONV enum_type( basetype_value ).

(C) Brandeis Consulting.

Demo/Beispiel: Zugriff auf den Wert

TYPES: BEGIN OF ENUM ebool 
               BASE TYPE char1,
         true  VALUE 'X',
         false VALUE IS INITIAL,
       END OF ENUM ebool.
...
METHOD if_oo_adt_classrun~main.
out->write( |Wert ohne CONV: { true } | ).
out->write( |Wert mit CONV: { CONV char1( true ) }| ).
ENDMETHOD.

Ausgabe

Wert ohne CONV: TRUE 
Wert mit CONV: X
(C) Brandeis Consulting.

Empfehlung zur Arbeit mit Konstanten

Enumerations und Domaine müssen 1:1 zusammenpassen. Da die Enumeration kein DDic-Typ ist kann das nicht 100% sichergestellt werden.

Im Buch Clean ABAP wird deshalb vom ENUM weitgehend abgeraten, weil theoretisch Wiedersprüche zu Domänendefinitionen möglich sind.

Ich halte die Komplexität der vorgeschlagenen Alternativen für zu hoch.

(C) Brandeis Consulting.

Clean Code Empfehlungen

  • Bei Enumerations vom Typ Zeichenketten: Der Wert sollte immer identisch wie die Konstante sein.
  • Keine Sammelklassen bzw. Interfaces, die viele Konstante bzw. Enumerations enthalten. Beispiel: ZCL_FICO_CONSTS
    Die Definition von Enumerations gehört an die Stelle, wo man sie auch suchen würde.
(C) Brandeis Consulting.