System-Felder in ABAP Cloud: Alternativen zu SY-*

Kategorie
ABAP Cloud
Veröffentlicht
Autor
Johannes

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-FeldBeschreibungABAP Cloud Alternative
SY-UNAMETechnischer BenutzernameCL_ABAP_CONTEXT_INFO=>GET_USER_TECHNICAL_NAME( )
SY-DATUMSystemdatumCL_ABAP_CONTEXT_INFO=>GET_SYSTEM_DATE( )
SY-UZEITSystemzeitCL_ABAP_CONTEXT_INFO=>GET_SYSTEM_TIME( )
SY-ZONLOZeitzone des BenutzersCL_ABAP_CONTEXT_INFO=>GET_USER_TIME_ZONE( )
SY-LANGUAnmeldespracheCL_ABAP_CONTEXT_INFO=>GET_USER_LANGUAGE_ABAP_FORMAT( )
SY-MANDTMandantCL_ABAP_CONTEXT_INFO=>GET_CLIENT( )
SY-SYSIDSystem-IDCL_ABAP_CONTEXT_INFO=>GET_SYSTEM_ID( )
SY-SUBRCRückgabewert✅ Weiterhin verfügbar
SY-TABIXTabellenindex✅ Weiterhin verfügbar
SY-DBCNTDB-Zeilenanzahl✅ Weiterhin verfügbar
SY-INDEXSchleifenindex✅ Weiterhin verfügbar
SY-TFILLTabellenzeilenLINES( itab ) empfohlen
SY-MSGIDNachrichtenklasse✅ Weiterhin verfügbar
SY-MSGNONachrichtennummer✅ Weiterhin verfügbar
SY-MSGTYNachrichtentyp✅ 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 Cloud
DATA(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 ABAP
DATA(lv_date) = sy-datum.
DATA(lv_time) = sy-uzeit.
" ✅ ABAP Cloud: Datum und Zeit
DATA(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 ermitteln
DATA(lv_timezone) = cl_abap_context_info=>get_user_time_zone( ).
" ✅ Zeitstempel in lokale Zeit konvertieren
DATA: 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 ABAP
DATA(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 ABAP
DATA(lv_client) = sy-mandt.
DATA(lv_sysid) = sy-sysid.
" ✅ ABAP Cloud
DATA(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ügbar
SELECT SINGLE * FROM ztab_customer WHERE id = @lv_id INTO @ls_customer.
IF sy-subrc = 0.
" Kunde gefunden
ENDIF.
READ TABLE lt_customers WITH KEY id = lv_id INTO ls_customer.
IF sy-subrc <> 0.
" Nicht gefunden
ENDIF.

SY-TABIX (Tabellenindex)

" ✅ SY-TABIX ist auch in ABAP Cloud verfügbar
LOOP AT lt_items INTO DATA(ls_item).
ls_item-position = sy-tabix.
MODIFY lt_items FROM ls_item.
ENDLOOP.
" Alternative mit Inline-Deklaration
LOOP 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ügbar
DELETE 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ügbar
DO 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 verwenden
APPEND 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 Class
APPEND 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 Import
DATA(lv_uuid) = cl_system_uuid=>create_uuid_x16_static( ).
" ✅ Für String-Format
DATA(lv_uuid_string) = cl_system_uuid=>create_uuid_c36_static( ).

Vergleich: Classic vs. Cloud

AufgabeClassic ABAPABAP Cloud
Benutzernamesy-unamecl_abap_context_info=>get_user_technical_name( )
Aktuelles Datumsy-datumcl_abap_context_info=>get_system_date( )
Aktuelle Zeitsy-uzeitcl_abap_context_info=>get_system_time( )
UTC TimestampGET TIME STAMPcl_abap_context_info=>get_system_timestamp( )
Sprachesy-langucl_abap_context_info=>get_user_language_abap_format( )
Zeitzonesy-zonlocl_abap_context_info=>get_user_time_zone( )
Mandantsy-mandtcl_abap_context_info=>get_client( )
System-IDsy-sysidcl_abap_context_info=>get_system_id( )
UUIDcl_system_uuid=>...cl_system_uuid=>create_uuid_x16_static( )

Best Practices

Do’s

  • ✅ Nutze CL_ABAP_CONTEXT_INFO für alle Benutzer-/Systeminfos
  • ✅ Verwende UTCLONG für Timestamps in der Datenbank
  • ✅ Speichere Zeitzone separat, wenn lokale Zeit relevant ist
  • ✅ Nutze SY-SUBRC und SY-TABIX - diese sind Cloud-ready

Don’ts

  • ❌ Kein SY-UNAME für Cloud-Code (ATC-Fehler)
  • ❌ Kein SY-DATUM/SY-UZEIT für Cloud-Code
  • ❌ Keine SY-Felder in Unit Tests - nutze Dependency Injection
  • ❌ Nicht auf SY-BATCH prüfen - Cloud ist immer online

Fazit

Die Migration von SY-Feldern zu ABAP Cloud APIs ist unkompliziert:

  1. Benutzer/System-Info: CL_ABAP_CONTEXT_INFO ist der zentrale Ersatz
  2. Datum/Zeit: Ebenfalls CL_ABAP_CONTEXT_INFO mit UTCLONG für DB
  3. SY-SUBRC/TABIX/DBCNT: Bleiben verfügbar - keine Migration nötig
  4. UUID: CL_SYSTEM_UUID ist 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.