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:
- Datenobjekte (Variablen mit
DATA
, Konstanten mitCONSTANTS
) zu deklarieren. - Feldsymbole (
FIELD-SYMBOLS
) zu typisieren. - 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 wieI
,P
,STRING
,D
,T
; ein globaler Dictionary-Typ wiematnr
,bukrs
; ein anderer lokaler Typ; eine Klasse/Interface fürREF 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 durchTYPE
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ürSORTED
undHASHED
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 deklarierenDATA 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 typisierenFIELD-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. 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.