This is a test message to test the length of the message box.
Login
ABAP Cloud Systemfelder
Erstellt von Software-Heroes

ABAP Cloud - Systemfelder (SYST)

176

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.

Werbung


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


Enthaltene Themen:
ABAP CloudABAPSystemfelderSYST
Kommentare (0)



Und weiter ...

Bist du zufrieden mit dem Inhalt des Artikels? Wir posten jeden Freitag neuen Content im Bereich ABAP und unregelmäßig in allen anderen Bereichen. Schaue bei unseren Tools und Apps vorbei, diese stellen wir kostenlos zur Verfügung.


ABAP Cloud - Test Daten Container

Kategorie - ABAP

Test Daten Container sind unter ABAP Cloud nicht freigegeben, wie also auf generische Testdaten zugreifen können? Hier ein Vorschlag für ein einfaches Framework.

08.07.2025

ABAP Cloud ... ohne BTP?

Kategorie - ABAP

In diesem Artikel gehen wir der Frage nach, ob ABAP Cloud auch ohne BTP möglich ist und was du dabei beachten solltest.

24.06.2025

ABAP Cloud - Fähigkeiten für den Start

Kategorie - ABAP

Wann kannst du eigentlich mit moderner ABAP Entwicklung starten und welche Fähigkeiten brauchst du dafür mindestens? Lass uns diese Frage gemeinsam klären.

17.06.2025

ABAP Cloud - Systemfelder (Lösung)

Kategorie - ABAP

Wie könnte eine Lösung für ABAP Cloud aussehen, um an die Systeminformationen und -felder zu gelangen und dabei testbar und offen zu bleiben? Hier mehr.

13.06.2025

ABAP Cloud - Dokumentation

Kategorie - ABAP

Ein wichtiger Teil in der ABAP Entwicklung ist eine gute und nachhaltige Dokumentation die am besten so nah wie möglich am eigentlichen Code ist. In diesem Artikel schauen wir uns das Thema einmal etwas näher an.

03.06.2025