ABAP Lokale Typdefinition: Die TYPES-Anweisung für Variablen, Strukturen und Tabellen

kategorie
ABAP-Statements
Veröffentlicht
autor
Johannes

Die TYPES-Anweisung wird in ABAP verwendet, um lokale Datentypen innerhalb eines Programms (Report, Klasse, Funktionsgruppe, Interface etc.) zu definieren. Man kann sie sich als Schablonen oder Baupläne für Daten vorstellen.

Im Gegensatz zur DATA-Anweisung, die eine Variable (also einen konkreten Speicherbereich) deklariert, definiert TYPES nur die Struktur und die Eigenschaften eines Datentyps. Dieser selbst definierte Typ kann dann mehrfach verwendet werden, um:

  1. Datenobjekte (Variablen mit DATA, Konstanten mit CONSTANTS) zu deklarieren.
  2. Feldsymbole (FIELD-SYMBOLS) zu typisieren.
  3. Parameter von Prozeduren (Methoden, Funktionsbausteine, FORM-Routinen) oder generische Typen zu definieren.

Vorteile der Verwendung von TYPES:

  • Wiederverwendbarkeit: Komplexe Typdefinitionen (Strukturen, Tabellen) müssen nur einmal definiert und können dann vielfach verwendet werden.
  • Lesbarkeit & Strukturierung: Code wird klarer und besser strukturiert, besonders bei komplexen Datenstrukturen.
  • Wartbarkeit: Änderungen am Typ müssen nur an der zentralen TYPES-Definition vorgenommen werden.
  • Typsicherheit: Ermöglicht eine strengere Typisierung von Variablen und Parametern.

Abgrenzung:

  • TYPES: Definiert einen Typ (Bauplan), reserviert keinen Speicher. Gültigkeit ist meist lokal im Programm/Objekt.
  • DATA: Definiert eine Variable (Datenobjekt), reserviert Speicher basierend auf einem Typ.
  • ABAP Dictionary (SE11): Definiert globale Typen (Datenelemente, Strukturen, Tabellentypen), die systemweit verfügbar sind. TYPES kann auf diese globalen Typen referenzieren.

Syntax

Es gibt verschiedene Möglichkeiten, Typen mit TYPES zu definieren:

1. Basierend auf einem vorhandenen Typ (Bevorzugt)

TYPES <typname> TYPE <basis_typ> [LENGTH <länge>] [DECIMALS <nachkommastellen>].
  • <typname>: Name des neuen lokalen Typs.
  • <basis_typ>: Ein bereits existierender Typ (elementarer ABAP-Typ wie I, P, STRING, D, T; ein globaler Dictionary-Typ wie matnr, bukrs; ein anderer lokaler Typ; eine Klasse/Interface für REF TO).

2. Basierend auf einem vorhandenen Datenobjekt (Veraltet)

TYPES <typname> LIKE <datenobjekt>.
  • <datenobjekt>: Eine bereits deklarierte Variable, Konstante oder Strukturkomponente. Sollte in neuem Code vermieden und durch TYPE ersetzt werden.

3. Strukturtyp definieren

TYPES: BEGIN OF <strukturtyp_name>,
<komponente1> TYPE <typ1> | LIKE <feld1>,
<komponente2> TYPE <typ2> | LIKE <feld2>,
" Optional: INCLUDE TYPE|STRUCTURE ...
...
END OF <strukturtyp_name>.

Definiert einen Verbundtyp aus mehreren Komponenten.

4. Tabellentyp (für interne Tabellen) definieren

TYPES <tabellentyp_name> TYPE [STANDARD | SORTED | HASHED] TABLE OF <zeilentyp>
[WITH [UNIQUE | NON-UNIQUE] KEY <schlüsselkomponenten> | DEFAULT KEY]
[INITIAL SIZE 0]. " Für Typen ist INITIAL SIZE oft 0
  • <zeilentyp>: Der Typ der einzelnen Zeilen in der Tabelle (kann ein einfacher Typ, Strukturtyp, Referenztyp etc. sein).
  • STANDARD, SORTED, HASHED: Definiert die Art der Tabelle.
  • WITH KEY: Definiert den Schlüssel für SORTED und HASHED Tabellen.

5. Referenztyp definieren

TYPES <reftyp_name> TYPE REF TO <typ> | <klasse> | <interface> | DATA.

Definiert einen Typ für Referenzvariablen (Zeiger).

6. Range-Tabellentyp definieren

TYPES <rangetyp_name> TYPE RANGE OF <elementarer_typ>.

Definiert einen speziellen Tabellentyp (mit Feldern SIGN, OPTION, LOW, HIGH), der häufig für SELECT-OPTIONS oder WHERE-Klauseln verwendet wird. Das Typ von LOW und HIGH wird durch <elementarer_typ> bestimmt.

7. Kettenanweisung

Mehrere TYPES-Definitionen können mit einer Kettenanweisung (Doppelpunkt nach TYPES, Kommas zwischen den Definitionen, Punkt am Ende) zusammengefasst werden.

Beispiele

REPORT z_types_demo.
" --- Definition verschiedener lokaler Typen ---
TYPES:
" Einfache Typen
ty_id TYPE i,
ty_description TYPE string,
ty_plant TYPE werks_d, " Basiert auf Datenelement aus Dictionary
" Strukturtyp für Benutzerdaten
BEGIN OF ty_s_user,
user_id TYPE ty_id, " Verwendet lokalen Typ ty_id
user_name TYPE xubname, " Dictionary-Typ
email TYPE ad_smtpadr, " Dictionary-Typ
active TYPE abap_bool VALUE abap_true, " Kann auch Default-Wert haben
END OF ty_s_user,
" Tabellentyp für Benutzer
ty_t_users TYPE STANDARD TABLE OF ty_s_user WITH EMPTY KEY, " Standardtabelle
" Sortierter Tabellentyp für Materialnummern
ty_t_materials_sorted TYPE SORTED TABLE OF matnr WITH UNIQUE KEY table_line,
" Referenztyp auf eine Klasse
ty_ref_alv TYPE REF TO cl_salv_table,
" Range-Typ für Datumsbereich
ty_r_date TYPE RANGE OF d.
" --- Verwendung der definierten Typen ---
" Variablen deklarieren
DATA gv_user_counter TYPE ty_id.
DATA gs_current_user TYPE ty_s_user.
DATA gt_all_users TYPE ty_t_users.
DATA gt_material_list TYPE ty_t_materials_sorted.
DATA go_alv TYPE ty_ref_alv.
DATA gr_posting_date TYPE ty_r_date. " Variable für Datums-Range
" Parameter einer lokalen Methode (Beispiel)
CLASS lcl_processor DEFINITION.
PUBLIC SECTION.
METHODS process_users
IMPORTING it_users TYPE ty_t_users " Verwendet Tabellentyp
RETURNING VALUE(rv_success) TYPE abap_bool.
ENDCLASS.
" Feldsymbol typisieren
FIELD-SYMBOLS <fs_user> TYPE ty_s_user.
" --- Logik (Beispiel) ---
START-OF-SELECTION.
gv_user_counter = 0.
gs_current_user-user_id = 1.
gs_current_user-user_name = sy-uname.
gs_current_user-email = '[email protected]'.
APPEND gs_current_user TO gt_all_users.
gv_user_counter = lines( gt_all_users ).
WRITE: / 'Anzahl Benutzer:', gv_user_counter.
LOOP AT gt_all_users ASSIGNING <fs_user>.
WRITE: / <fs_user>-user_name, <fs_user>-email.
ENDLOOP.
" Range füllen (Beispiel)
APPEND VALUE #( sign = 'I' option = 'BT' low = '20250101' high = sy-datum ) TO gr_posting_date.
WRITE: / 'Range Low:', gr_posting_date[ 1 ]-low.

Zusammenfassend lässt sich sagen: Die TYPES-Anweisung ist ein essenzielles Werkzeug zur Definition von wiederverwendbaren, lokalen Datentypen in ABAP. Sie trägt maßgeblich zur Strukturierung, Lesbarkeit und Wartbarkeit von ABAP-Code bei, insbesondere bei der Arbeit mit komplexen Datenstrukturen und der Sicherstellung von Typsicherheit in Prozedur-Schnittstellen.