Die klassischen SY-Felder (Systemvariablen) sind seit Jahrzehnten fester Bestandteil der ABAP-Entwicklung. In ABAP Cloud sind viele dieser Felder jedoch nicht verfügbar oder nicht empfohlen. Dieser Artikel zeigt alle wichtigen Alternativen für Cloud-ready Code.
Warum SY-Felder in ABAP Cloud problematisch sind
In ABAP Cloud (Tier 1 / Level A) gelten strenge Regeln für API-Nutzung:
- Keine impliziten Abhängigkeiten: SY-Felder sind globale Variablen mit implizitem Zustand
- Keine Session-spezifischen Werte: Cloud-Anwendungen sind zustandslos
- Testbarkeit: SY-Felder sind schwer zu mocken
- Entkopplung: Released APIs bieten saubere Schnittstellen
┌─────────────────────────────────────────────────────────────┐│ Classic ABAP ABAP Cloud ││ ─────────────────────────────────────────────────────────── ││ SY-UNAME → CL_ABAP_CONTEXT_INFO ││ SY-DATUM / SY-UZEIT → CL_ABAP_CONTEXT_INFO ││ SY-LANGU → CL_ABAP_CONTEXT_INFO ││ SY-SUBRC → Weiterhin verfügbar (Ausnahme!) ││ SY-TABIX → Weiterhin verfügbar (Ausnahme!) ││ SY-DBCNT → Weiterhin verfügbar (Ausnahme!) │└─────────────────────────────────────────────────────────────┘Übersicht: SY-Felder und ihre Alternativen
| SY-Feld | Beschreibung | ABAP Cloud Alternative |
|---|---|---|
SY-UNAME | Technischer Benutzername | CL_ABAP_CONTEXT_INFO=>GET_USER_TECHNICAL_NAME( ) |
SY-DATUM | Systemdatum | CL_ABAP_CONTEXT_INFO=>GET_SYSTEM_DATE( ) |
SY-UZEIT | Systemzeit | CL_ABAP_CONTEXT_INFO=>GET_SYSTEM_TIME( ) |
SY-ZONLO | Zeitzone des Benutzers | CL_ABAP_CONTEXT_INFO=>GET_USER_TIME_ZONE( ) |
SY-LANGU | Anmeldesprache | CL_ABAP_CONTEXT_INFO=>GET_USER_LANGUAGE_ABAP_FORMAT( ) |
SY-MANDT | Mandant | CL_ABAP_CONTEXT_INFO=>GET_CLIENT( ) |
SY-SYSID | System-ID | CL_ABAP_CONTEXT_INFO=>GET_SYSTEM_ID( ) |
SY-SUBRC | Rückgabewert | ✅ Weiterhin verfügbar |
SY-TABIX | Tabellenindex | ✅ Weiterhin verfügbar |
SY-DBCNT | DB-Zeilenanzahl | ✅ Weiterhin verfügbar |
SY-INDEX | Schleifenindex | ✅ Weiterhin verfügbar |
SY-TFILL | Tabellenzeilen | ✅ LINES( itab ) empfohlen |
SY-MSGID | Nachrichtenklasse | ✅ Weiterhin verfügbar |
SY-MSGNO | Nachrichtennummer | ✅ Weiterhin verfügbar |
SY-MSGTY | Nachrichtentyp | ✅ Weiterhin verfügbar |
Die Zentrale Klasse: CL_ABAP_CONTEXT_INFO
Die Klasse CL_ABAP_CONTEXT_INFO ist die wichtigste Released API für Kontextinformationen in ABAP Cloud. Sie ersetzt die meisten benutzer- und systembezogenen SY-Felder.
Methoden im Überblick
CLASS cl_abap_context_info DEFINITION. PUBLIC SECTION. CLASS-METHODS: " Benutzerinformationen get_user_technical_name RETURNING VALUE(result) TYPE syuname, get_user_alias RETURNING VALUE(result) TYPE string, get_user_description RETURNING VALUE(result) TYPE string, get_user_formatted_name RETURNING VALUE(result) TYPE string,
" Datum und Zeit get_system_date RETURNING VALUE(result) TYPE d, get_system_time RETURNING VALUE(result) TYPE t, get_system_timestamp RETURNING VALUE(result) TYPE utclong, get_user_time_zone RETURNING VALUE(result) TYPE timezone,
" Sprache get_user_language_abap_format RETURNING VALUE(result) TYPE sy-langu, get_user_language_iso_format RETURNING VALUE(result) TYPE laiso,
" System get_system_id RETURNING VALUE(result) TYPE sy-sysid, get_client RETURNING VALUE(result) TYPE sy-mandt, get_system_url RETURNING VALUE(result) TYPE string.ENDCLASS.Praktisches Beispiel: Benutzer- und Systeminfo
CLASS zcl_context_demo DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION. TYPES: BEGIN OF ty_user_context, user_name TYPE string, user_alias TYPE string, system_date TYPE d, system_time TYPE t, timestamp TYPE utclong, time_zone TYPE timezone, language TYPE sy-langu, system_id TYPE sy-sysid, client TYPE sy-mandt, END OF ty_user_context.
METHODS get_current_context RETURNING VALUE(rs_context) TYPE ty_user_context.
ENDCLASS.
CLASS zcl_context_demo IMPLEMENTATION. METHOD get_current_context. " ✅ ABAP Cloud: Released API für Kontextinformationen rs_context = VALUE #( user_name = cl_abap_context_info=>get_user_technical_name( ) user_alias = cl_abap_context_info=>get_user_alias( ) system_date = cl_abap_context_info=>get_system_date( ) system_time = cl_abap_context_info=>get_system_time( ) timestamp = cl_abap_context_info=>get_system_timestamp( ) time_zone = cl_abap_context_info=>get_user_time_zone( ) language = cl_abap_context_info=>get_user_language_abap_format( ) system_id = cl_abap_context_info=>get_system_id( ) client = cl_abap_context_info=>get_client( ) ). ENDMETHOD.ENDCLASS.Kategorie 1: Benutzerinformationen
SY-UNAME → CL_ABAP_CONTEXT_INFO
" ❌ Classic ABAP (nicht Cloud-ready)DATA(lv_user) = sy-uname.
" ✅ ABAP CloudDATA(lv_user) = cl_abap_context_info=>get_user_technical_name( ).
" ✅ Benutzeralias (z.B. E-Mail-Adresse)DATA(lv_alias) = cl_abap_context_info=>get_user_alias( ).
" ✅ Formatierter Name (z.B. "Max Mustermann")DATA(lv_formatted) = cl_abap_context_info=>get_user_formatted_name( ).Anwendungsfall: Audit-Logging
METHOD log_user_action. DATA(lv_user) = cl_abap_context_info=>get_user_technical_name( ). DATA(lv_timestamp) = cl_abap_context_info=>get_system_timestamp( ).
INSERT INTO ztab_audit_log VALUES @( VALUE #( log_uuid = cl_system_uuid=>create_uuid_x16_static( ) user_name = lv_user action = iv_action entity_id = iv_entity_id timestamp = lv_timestamp ) ).ENDMETHOD.Kategorie 2: Datum und Zeit
SY-DATUM, SY-UZEIT → CL_ABAP_CONTEXT_INFO
" ❌ Classic ABAPDATA(lv_date) = sy-datum.DATA(lv_time) = sy-uzeit.
" ✅ ABAP Cloud: Datum und ZeitDATA(lv_date) = cl_abap_context_info=>get_system_date( ).DATA(lv_time) = cl_abap_context_info=>get_system_time( ).
" ✅ ABAP Cloud: UTC Timestamp (empfohlen für Datenbank)DATA(lv_timestamp) = cl_abap_context_info=>get_system_timestamp( ).Zeitzone und lokale Zeit
" ✅ Benutzer-Zeitzone ermittelnDATA(lv_timezone) = cl_abap_context_info=>get_user_time_zone( ).
" ✅ Zeitstempel in lokale Zeit konvertierenDATA: lv_local_date TYPE d, lv_local_time TYPE t.
CONVERT TIME STAMP cl_abap_context_info=>get_system_timestamp( ) TIME ZONE lv_timezone INTO DATE lv_local_date TIME lv_local_time.Anwendungsfall: Buchungsdatum setzen
METHOD set_booking_dates. " ✅ ABAP Cloud: Aktuelle Zeit als UTC Timestamp DATA(lv_now) = cl_abap_context_info=>get_system_timestamp( ).
" In RAP Determination verwenden MODIFY ENTITIES OF zi_booking IN LOCAL MODE ENTITY Booking UPDATE FIELDS ( CreatedAt LastChangedAt ) WITH VALUE #( FOR key IN keys ( %tky = key-%tky CreatedAt = lv_now LastChangedAt = lv_now ) ).ENDMETHOD.Kategorie 3: Sprache und Lokalisierung
SY-LANGU → CL_ABAP_CONTEXT_INFO
" ❌ Classic ABAPDATA(lv_langu) = sy-langu.
" ✅ ABAP Cloud: ABAP-Format (D, E, F, ...)DATA(lv_langu) = cl_abap_context_info=>get_user_language_abap_format( ).
" ✅ ABAP Cloud: ISO-Format (DE, EN, FR, ...)DATA(lv_langu_iso) = cl_abap_context_info=>get_user_language_iso_format( ).Anwendungsfall: Mehrsprachige Texte
METHOD get_status_text. DATA(lv_langu) = cl_abap_context_info=>get_user_language_abap_format( ).
SELECT SINGLE text FROM ztab_status_text WHERE status = @iv_status AND langu = @lv_langu INTO @rv_text.
IF sy-subrc <> 0. " Fallback auf Englisch SELECT SINGLE text FROM ztab_status_text WHERE status = @iv_status AND langu = 'E' INTO @rv_text. ENDIF.ENDMETHOD.Kategorie 4: System-Informationen
SY-MANDT, SY-SYSID → CL_ABAP_CONTEXT_INFO
" ❌ Classic ABAPDATA(lv_client) = sy-mandt.DATA(lv_sysid) = sy-sysid.
" ✅ ABAP CloudDATA(lv_client) = cl_abap_context_info=>get_client( ).DATA(lv_sysid) = cl_abap_context_info=>get_system_id( ).
" ✅ System-URL (für Links in E-Mails etc.)DATA(lv_url) = cl_abap_context_info=>get_system_url( ).Kategorie 5: Weiterhin verfügbare SY-Felder
Einige SY-Felder sind auch in ABAP Cloud verfügbar, da sie für grundlegende Sprachkonstrukte benötigt werden:
SY-SUBRC (Rückgabewert)
" ✅ SY-SUBRC ist auch in ABAP Cloud verfügbarSELECT SINGLE * FROM ztab_customer WHERE id = @lv_id INTO @ls_customer.IF sy-subrc = 0. " Kunde gefundenENDIF.
READ TABLE lt_customers WITH KEY id = lv_id INTO ls_customer.IF sy-subrc <> 0. " Nicht gefundenENDIF.SY-TABIX (Tabellenindex)
" ✅ SY-TABIX ist auch in ABAP Cloud verfügbarLOOP AT lt_items INTO DATA(ls_item). ls_item-position = sy-tabix. MODIFY lt_items FROM ls_item.ENDLOOP.
" Alternative mit Inline-DeklarationLOOP AT lt_items INTO DATA(ls_item2) USING KEY primary_key. DATA(lv_index) = sy-tabix.ENDLOOP.SY-DBCNT (Datenbankzähler)
" ✅ SY-DBCNT ist auch in ABAP Cloud verfügbarDELETE FROM ztab_old_data WHERE created_at < @lv_cutoff_date.DATA(lv_deleted_rows) = sy-dbcnt.
UPDATE ztab_status SET status = 'ARCHIVED' WHERE status = 'OLD'.DATA(lv_updated_rows) = sy-dbcnt.SY-INDEX (DO-Schleifenindex)
" ✅ SY-INDEX ist auch in ABAP Cloud verfügbarDO 5 TIMES. APPEND VALUE #( attempt = sy-index ) TO lt_retries.ENDDO.Sonderfall: Nachrichten-Felder
Die SY-Felder für Nachrichten (SY-MSGID, SY-MSGNO, SY-MSGTY, SY-MSGV1-4) sind in ABAP Cloud verfügbar, aber RAP verwendet ein eigenes Nachrichtensystem:
" ✅ In RAP: IF_ABAP_BEHV_MESSAGE verwendenAPPEND VALUE #( %tky = ls_booking-%tky %msg = new_message_with_text( severity = if_abap_behv_message=>severity-error text = |Ungültiger Status: { ls_booking-Status }| )) TO reported-booking.
" ✅ Oder mit Message ClassAPPEND VALUE #( %tky = ls_booking-%tky %msg = new_message( id = 'ZBOOKING_MSG' number = '001' severity = if_abap_behv_message=>severity-error v1 = ls_booking-Status )) TO reported-booking.UUID-Generierung
Auch für die UUID-Generierung gibt es eine Released API:
" ❌ Classic ABAP (funktioniert, aber nicht optimal)DATA: lv_uuid TYPE sysuuid_x16.TRY. lv_uuid = cl_system_uuid=>create_uuid_x16_static( ). CATCH cx_uuid_error.ENDTRY.
" ✅ ABAP Cloud: Gleiche API, aber expliziter ImportDATA(lv_uuid) = cl_system_uuid=>create_uuid_x16_static( ).
" ✅ Für String-FormatDATA(lv_uuid_string) = cl_system_uuid=>create_uuid_c36_static( ).Vergleich: Classic vs. Cloud
| Aufgabe | Classic ABAP | ABAP Cloud |
|---|---|---|
| Benutzername | sy-uname | cl_abap_context_info=>get_user_technical_name( ) |
| Aktuelles Datum | sy-datum | cl_abap_context_info=>get_system_date( ) |
| Aktuelle Zeit | sy-uzeit | cl_abap_context_info=>get_system_time( ) |
| UTC Timestamp | GET TIME STAMP | cl_abap_context_info=>get_system_timestamp( ) |
| Sprache | sy-langu | cl_abap_context_info=>get_user_language_abap_format( ) |
| Zeitzone | sy-zonlo | cl_abap_context_info=>get_user_time_zone( ) |
| Mandant | sy-mandt | cl_abap_context_info=>get_client( ) |
| System-ID | sy-sysid | cl_abap_context_info=>get_system_id( ) |
| UUID | cl_system_uuid=>... | cl_system_uuid=>create_uuid_x16_static( ) |
Best Practices
Do’s
- ✅ Nutze
CL_ABAP_CONTEXT_INFOfür alle Benutzer-/Systeminfos - ✅ Verwende
UTCLONGfür Timestamps in der Datenbank - ✅ Speichere Zeitzone separat, wenn lokale Zeit relevant ist
- ✅ Nutze
SY-SUBRCundSY-TABIX- diese sind Cloud-ready
Don’ts
- ❌ Kein
SY-UNAMEfür Cloud-Code (ATC-Fehler) - ❌ Kein
SY-DATUM/SY-UZEITfür Cloud-Code - ❌ Keine SY-Felder in Unit Tests - nutze Dependency Injection
- ❌ Nicht auf
SY-BATCHprüfen - Cloud ist immer online
Fazit
Die Migration von SY-Feldern zu ABAP Cloud APIs ist unkompliziert:
- Benutzer/System-Info:
CL_ABAP_CONTEXT_INFOist der zentrale Ersatz - Datum/Zeit: Ebenfalls
CL_ABAP_CONTEXT_INFOmitUTCLONGfür DB - SY-SUBRC/TABIX/DBCNT: Bleiben verfügbar - keine Migration nötig
- UUID:
CL_SYSTEM_UUIDist bereits Released API
Der ATC prüft automatisch auf nicht-Cloud-kompatible SY-Felder und zeigt Alternativen an.
Für die praktische Migration bestehenden Codes siehe den Folgeartikel System-Felder Lösungen - Praktische Migration. Mehr zu Cloud-ready APIs unter Clean Core Level-Konzept.