
ABAP Cloud - Systemfelder (SYST)
Aktuell gibt es verschiedene Alternativen für den Zugriff auf SYST Felder in ABAP Cloud. In diesem Artikel schauen wir uns die alternativen und obsoleten Varianten an.
Inhaltsverzeichnis
In diesem Artikel vergleichen wir die verschiedenen relevanten Felder der SY bzw. SYST-Struktur und zeigen Alternativen in der ABAP Cloud Welt. Dabei schauen wir uns verschiedene Aspekte der Nutzung an.
Einleitung
In der klassischen Welt gibt es in der Systemvariable SY ca. 170 verschiedene Felder mit unterschiedlichen Informationen, die zur Laufzeit immer aktuell gehalten werden. Dazu zählen Informationen wie das aktuelle Datum im System, der aktuelle User oder die letzte Meldung. Bei der Anzahl der Felder sind bereits viele Informationen nicht mehr relevant oder wurden durch SAP auf Obsolet gesetzt. Zusätzlich beziehen sich viele Felder auf Reports und Listenausgaben die in ABAP Cloud nicht mehr unterstützt werden.
Technische Felder
In diesem Kapitel schauen wir uns technische Felder an, die du immer wieder in der Verarbeitung und in Logiken verwendest, für die es bisher keine Alternativen gibt.
Verarbeitung
- INDEX - Aktueller Index in einem DO.
- TABIX - Aktueller Tabellenindex in einem LOOP.
- DBCNT - Anzahl der Datensätze die bei der letzten Datenbankoperation geändert wurden.
- SUBRC - Status der letzten Aktion zum Beispiel beim Prüfen der Berechtigungen, ob eine LOOP Datensätze enthalten hat oder ob der SELECT der Daten funktioniert hat. Dabei ist 0 (Null) der Erfolgsfall.
- ABCDE - Statische Variable, die das lateinische Alphabet in UPPER enthält.
Informationen
- MANDT - Aktueller Mandant des Systems, besteht aus drei Ziffern, wobei bestimmte Mandanten für SAP reserviert sind (z.B. 000)
- DBSYS - Aktuelles Datenbanksystem des Systems. In modernen Systemen sollte hier HDB stehen.
- SYSID - ID des Systems, dieses ist ein Kürzel aus drei Buchstaben oder Zahlen.
- OPSYS - Betriebssystem, auf dem das System aufgesetzt wurde, hier kann zum Beispiel Linux stehen.
- SAPRL - Informationen zum aktuellen ABAP Release. Ein S/4HANA On-Prem 2023 System hat zum Beispiel das Release 758, das aktuelle ABAP Environment liegt bei 917.
Content Felder
In diesem Kapitel schauen wir uns die Felder im Detail an und machen dazu einen Vergleich zum SY-Feld, der Context Klasse und der XCO Bibliothek.
User
Auf die aktuelle User-ID zugreifen zu können, ist vor allem im Umfeld des Loggings und Abgleichs nötig. In der modernen Cloud Umgebung befindet sich meist der Business Partner in diesem Feld.
DATA(syst) = sy-uname.
DATA(context) = cl_abap_context_info=>get_user_technical_name( ).
DATA(xco) = xco_cp=>sy->user( )->name.
User Alias
Bist du in einem modernen Umfeld und nicht On-Prem, möchtest du vielleicht auch die echte User ID zum aktuell angemeldeten User ableiten. Hier gibt es aktuell nur die Context Klasse.
DATA(syst) = '-'.
DATA(context) = cl_abap_context_info=>get_user_alias( ).
DATA(xco) = '-'.
System Datum/Zeit
Das aktuelle Datum des Systems wird meistens in UTC abgelegt. Für die XCO Bibliothek machen wir ein Mapping auf ein Datum, da der Wert als String zurückgegeben wird.
DATA(syst) = sy-datum.
DATA(context) = cl_abap_context_info=>get_system_date( ).
DATA(xco) = CONV d( xco_cp=>sy->date( xco_cp_time=>time_zone->utc )->as( xco_cp_time=>format->abap )->value ).
Möchtest du die aktuelle Uhrzeit für das System haben, kannst du die Informationen so ermitteln.
DATA(syst) = sy-uzeit.
DATA(context) = cl_abap_context_info=>get_system_time( ).
DATA(xco) = CONV t( xco_cp=>sy->time( xco_cp_time=>time_zone->utc )->as( xco_cp_time=>format->abap )->value ).
Lokales Datum/Zeit
Die lokale Zeit beschreibt die aktuelle Zeit des angemeldeten Users. Diese Einstellung ist für jeden Anwender unterschiedlich, je nachdem, was er bei sich in den Einstellungen hinterlegt hat. Die Context Klasse bietet hier keine Alternative an, grundsätzlich könnte es aber berechnet werden mit der Zeitzone und den Systemdaten.
DATA(syst) = sy-datlo.
DATA(context) = '-'.
DATA(xco) = CONV d( xco_cp=>sy->date( xco_cp_time=>time_zone->user )->as( xco_cp_time=>format->abap )->value ).
Die Uhrzeit leitet sich ähnlich wie das lokale Datum ab, eine Alternative im Context Objekt gibt es hier nicht.
DATA(syst) = sy-timlo.
DATA(context) = '-'.
DATA(xco) = CONV t( xco_cp=>sy->time( xco_cp_time=>time_zone->user )->as( xco_cp_time=>format->abap )->value ).
Eine dritte wichtige Eigenschaft in diesem Zusammenhang ist die Zeitzone des Users. Damit kannst du weitere Berechnungen und Details ableiten.
DATA(syst) = sy-zonlo.
DATA(context) = cl_abap_context_info=>get_user_time_zone( ).
DATA(xco) = xco_cp_time=>time_zone->user->value.
Sprache
Die aktuelle Sprache der Anmeldung ist wichtig, wenn es um Texte und Übersetzungen im System geht. Das Format der SAP ist aber einstellig, damit ist die Groß- und Kleinschreibung für die Ableitung der Sprache wichtig und nicht mehr so leicht verständlich, dies hat historische Gründe.
DATA(syst) = sy-langu.
DATA(context) = cl_abap_context_info=>get_user_language_abap_format( ).
DATA(xco) = xco_cp=>sy->language( )->value.
Möchtest du den allgemeinen ISO Code für die Sprache haben, dann gibt es bereits in den neuen Frameworks eine Alternative.
SELECT SINGLE FROM I_Language
FIELDS LanguageISOCode
WHERE Language = @sy-langu
INTO @DATA(syst).
DATA(context) = cl_abap_context_info=>get_user_language_iso_format( ).
DATA(xco) = xco_cp=>sy->language( )->as( xco_cp_language=>format->iso_639 ).
Nachrichten
Wurde eine Message im System erzeugt, werden die entsprechenden Variablen in der SYST befüllt. Da es sich hier aber um 7 Variablen handelt, kann das Handling in manchen Fällen etwas umständlich sein
DATA(syst) = VALUE symsg( msgid = sy-msgid
msgno = sy-msgno
msgty = sy-msgty
msgv1 = sy-msgv1
msgv2 = sy-msgv2
msgv3 = sy-msgv3
msgv4 = sy-msgv4 ).
DATA(context) = '-'.
DATA(xco) = xco_cp=>sy->message( )->value.
Verwendung
Wieso wollen wir eigentlich von den Systemfeldern weg? Der Grund ist relativ einfach, viele der Felder passen nicht mehr zum aktuellen Standard der SAP mit ihren deutschen Namen. Daher wurden die Felder in ABAP Cloud auf Obsolet gesetzt. Zu Beginn des ABAP Environments waren die Felder sogar komplett verboten, wurden aber wegen Aufwand in der Migration wieder erlaubt, aber mit Warnung.
Grundsätzlich sind die Felder auch nicht sauber entkoppelbar, wenn es um Unit Tests geht. Wir greifen direkt auf die Informationen zu, was eigentlich einer DOC (Dependend-On Component) gleich kommt.
Vollständiges Beispiel
Das vollständige Beispiel aus dem heutigen Artikel findest du als ausführbare Klasse in diesem Abschnitt. Möchtest du die Beispiele nachstellen, dann kannst du dazu die Klasse auf dein System kopieren.
CLASS zcl_bs_demo_system_compare DEFINITION
PUBLIC FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
PRIVATE SECTION.
METHODS compare_user
IMPORTING !out TYPE REF TO if_oo_adt_classrun_out.
METHODS compare_system_date
IMPORTING !out TYPE REF TO if_oo_adt_classrun_out.
METHODS compare_system_time
IMPORTING !out TYPE REF TO if_oo_adt_classrun_out.
METHODS compare_local_date
IMPORTING !out TYPE REF TO if_oo_adt_classrun_out.
METHODS compare_local_time
IMPORTING !out TYPE REF TO if_oo_adt_classrun_out.
METHODS compare_time_zone
IMPORTING !out TYPE REF TO if_oo_adt_classrun_out.
METHODS compare_client
IMPORTING !out TYPE REF TO if_oo_adt_classrun_out.
METHODS compare_language
IMPORTING !out TYPE REF TO if_oo_adt_classrun_out.
METHODS compare_language_iso
IMPORTING !out TYPE REF TO if_oo_adt_classrun_out.
METHODS compare_system_id
IMPORTING !out TYPE REF TO if_oo_adt_classrun_out.
METHODS compare_user_alias
IMPORTING !out TYPE REF TO if_oo_adt_classrun_out.
METHODS compare_message
IMPORTING !out TYPE REF TO if_oo_adt_classrun_out.
ENDCLASS.
CLASS zcl_bs_demo_system_compare IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
compare_user( out ).
compare_user_alias( out ).
compare_system_date( out ).
compare_system_time( out ).
compare_local_date( out ).
compare_local_time( out ).
compare_time_zone( out ).
compare_language( out ).
compare_language_iso( out ).
compare_client( out ).
compare_system_id( out ).
compare_message( out ).
ENDMETHOD.
METHOD compare_user.
DATA(syst) = sy-uname.
DATA(context) = cl_abap_context_info=>get_user_technical_name( ).
DATA(xco) = xco_cp=>sy->user( )->name.
out->write( syst ).
out->write( context ).
out->write( xco ).
ENDMETHOD.
METHOD compare_user_alias.
DATA(syst) = '-'.
DATA(context) = cl_abap_context_info=>get_user_alias( ).
DATA(xco) = '-'.
out->write( syst ).
out->write( context ).
out->write( xco ).
ENDMETHOD.
METHOD compare_system_date.
DATA(syst) = sy-datum.
DATA(context) = cl_abap_context_info=>get_system_date( ).
DATA(xco) = CONV d( xco_cp=>sy->date( xco_cp_time=>time_zone->utc )->as( xco_cp_time=>format->abap )->value ).
out->write( syst ).
out->write( context ).
out->write( xco ).
ENDMETHOD.
METHOD compare_system_time.
DATA(syst) = sy-uzeit.
DATA(context) = cl_abap_context_info=>get_system_time( ).
DATA(xco) = CONV t( xco_cp=>sy->time( xco_cp_time=>time_zone->utc )->as( xco_cp_time=>format->abap )->value ).
out->write( syst ).
out->write( context ).
out->write( xco ).
ENDMETHOD.
METHOD compare_local_date.
DATA(syst) = sy-datlo.
DATA(context) = '-'.
DATA(xco) = CONV d( xco_cp=>sy->date( xco_cp_time=>time_zone->user )->as( xco_cp_time=>format->abap )->value ).
out->write( syst ).
out->write( context ).
out->write( xco ).
ENDMETHOD.
METHOD compare_local_time.
DATA(syst) = sy-timlo.
DATA(context) = '-'.
DATA(xco) = CONV t( xco_cp=>sy->time( xco_cp_time=>time_zone->user )->as( xco_cp_time=>format->abap )->value ).
out->write( syst ).
out->write( context ).
out->write( xco ).
ENDMETHOD.
METHOD compare_time_zone.
DATA(syst) = sy-zonlo.
DATA(context) = cl_abap_context_info=>get_user_time_zone( ).
DATA(xco) = xco_cp_time=>time_zone->user->value.
out->write( syst ).
out->write( context ).
out->write( xco ).
ENDMETHOD.
METHOD compare_language.
DATA(syst) = sy-langu.
DATA(context) = cl_abap_context_info=>get_user_language_abap_format( ).
DATA(xco) = xco_cp=>sy->language( )->value.
out->write( syst ).
out->write( context ).
out->write( xco ).
ENDMETHOD.
METHOD compare_language_iso.
SELECT SINGLE FROM I_Language
FIELDS LanguageISOCode
WHERE Language = @sy-langu
INTO @DATA(syst).
DATA(context) = cl_abap_context_info=>get_user_language_iso_format( ).
DATA(xco) = xco_cp=>sy->language( )->as( xco_cp_language=>format->iso_639 ).
out->write( syst ).
out->write( context ).
out->write( xco ).
ENDMETHOD.
METHOD compare_client.
DATA(syst) = sy-mandt.
DATA(context) = '-'.
DATA(xco) = '-'.
out->write( syst ).
out->write( context ).
out->write( xco ).
ENDMETHOD.
METHOD compare_system_id.
DATA(syst) = sy-sysid.
DATA(context) = '-'.
DATA(xco) = '-'.
out->write( syst ).
out->write( context ).
out->write( xco ).
ENDMETHOD.
METHOD compare_message.
DATA(syst) = VALUE symsg( msgid = sy-msgid
msgno = sy-msgno
msgty = sy-msgty
msgv1 = sy-msgv1
msgv2 = sy-msgv2
msgv3 = sy-msgv3
msgv4 = sy-msgv4 ).
DATA(context) = '-'.
DATA(xco) = xco_cp=>sy->message( )->value.
out->write( syst ).
out->write( context ).
out->write( xco ).
ENDMETHOD.
ENDCLASS.
Führst du die Klasse aus, dann solltest du ein ähnliches Ergebnis erhalten, dabei bilden immer drei Zeilen eine Methode. An der Formatierung solltest du dich daher nicht stören.
Fazit
Aktuell gibt es nicht die eine Alternative, wenn du an alle Systemfelder kommen möchtest. Du solltest aber nun einen groben Überblick haben, welche Felder noch so weit relevant sind und wofür du sie einsetzen kannst.
Weitere Informationen:
SAP Help - ABAP System Fields
SAP Help - Obsolete Fields