[ABAP] SAP Release Information lesen

TYPES: ty_it_supp_db TYPE STANDARD TABLE OF thllines WITH DEFAULT KEY.

DATA(lv_kern_rel) = VALUE thllines-thline( ).
DATA(lv_kern_dblib) = VALUE thllines-thline( ).
DATA(lv_kern_comp_on) = VALUE thllines-thline( ).
DATA(lv_kern_comp_time) = VALUE thllines-thline( ).
DATA(lv_kern_patchlevel) = VALUE thllines-thline( ).
DATA(lv_kern_supportlevel) = VALUE thllines-thline( ).
DATA(lv_kern_patchnumber) = VALUE thllines-thline( ).
DATA(lv_kern_sourceid) = VALUE thllines-thline( ).

DATA(it_supp_db_sap) = VALUE ty_it_supp_db( ).
DATA(it_supp_db_vendor) = VALUE ty_it_supp_db( ).
DATA(it_supp_op_sys) = VALUE ty_it_supp_db( ).
DATA(it_patchcomment) = VALUE ty_it_supp_db( ).

* ruft ThSysInfo
CALL FUNCTION 'TH_SAPREL3'
  IMPORTING
    kern_rel          = lv_kern_rel
    kern_dblib        = lv_kern_dblib
    kern_comp_on      = lv_kern_comp_on
    kern_comp_time    = lv_kern_comp_time
    kern_patchlevel   = lv_kern_patchlevel
    kern_supportlevel = lv_kern_supportlevel
    kern_patchnumber  = lv_kern_patchnumber
    kern_sourceid     = lv_kern_sourceid
  TABLES
    supp_db_sap       = it_supp_db_sap
    supp_db_vendor    = it_supp_db_vendor
    supp_op_sys       = it_supp_op_sys
    patchcomment      = it_patchcomment.

cl_demo_output=>write_data( lv_kern_rel ).
cl_demo_output=>write_data( lv_kern_dblib ).
cl_demo_output=>write_data( lv_kern_comp_on ).
cl_demo_output=>write_data( lv_kern_comp_time ).
cl_demo_output=>write_data( lv_kern_patchlevel ).
cl_demo_output=>write_data( lv_kern_supportlevel ).
cl_demo_output=>write_data( lv_kern_patchnumber ).
cl_demo_output=>write_data( lv_kern_sourceid ).
cl_demo_output=>write_data( it_supp_db_sap ).
cl_demo_output=>write_data( it_supp_db_vendor ).
cl_demo_output=>write_data( it_supp_op_sys ).
cl_demo_output=>write_data( it_patchcomment ).
cl_demo_output=>display( ).

[ABAP] Transportaufträge für Benutzer und Auftragsnummern suchen

* Tabellen:
*  E070 (Transportsystem: Header von Aufträgen/Aufgaben)
*  E07T (Transportsystem: Kurzbeschreibungen von Aufträgen/Aufgaben)
*  E070C (Transportsystem: Quell-/Zielmandant von Aufträgen/Aufgaben)
*  E071 (Transportsystem: Objekt-Einträge von Aufträgen/Aufgaben)
*  TADIR (Katalog der Repository-Objekte)
*  TPLOG (Logging der tp Aufrufe)

* https://www.berater-wiki.de/Transportauftrag
* https://www.berater-wiki.de/Access_Tabellenbeziehung_Transportauftrag/-Aufgabe
* http://sapyourself.com/2014/06/11/transporte-transporteur-ermitteln-und-analysieren-tabelle-tplog/

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE title.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_rb1 RADIOBUTTON GROUP grp1 DEFAULT 'X'.
SELECTION-SCREEN COMMENT (20) lbl1 FOR FIELD p_rb1.
PARAMETERS: p_usr TYPE e070-as4user DEFAULT sy-uname.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_rb2 RADIOBUTTON GROUP grp1.
SELECTION-SCREEN COMMENT (20) lbl2 FOR FIELD p_rb2.
PARAMETERS: p_tr TYPE e070-trkorr DEFAULT ''.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK b1.

INITIALIZATION.
  title = 'Suche'.
  lbl1 = 'Benutzer'.
  lbl2 = 'Transportauftrag'.

START-OF-SELECTION.

* dynamische Where-Clause erzeugen
  DATA(lv_where) = ||.

  CASE abap_true.
    WHEN p_rb1.
      lv_where = |    e~as4user = '{ p_usr }'| &&
                 |AND t~langu   = @sy-langu|.
    WHEN p_rb2.
      lv_where = |    e~trkorr  = '{ p_tr }'| &&
                 | OR e~strkorr = '{ p_tr }'| &&
                 |AND t~langu   = @sy-langu|.
  ENDCASE.

* TRFUNCTION
*  K  Workbench-Auftrag
*  W  Customizing-Auftrag
*  C  Umzug von Objekten ohne Paketwechsel
*  O  Umzug von Objekten mit Paketwechsel
*  E  Umzug eines kompletten Pakets
*  T  Transport von Kopien
*  S  Entwicklung/Korrektur
*  R  Reparatur
*  X  Unklassifizierte Aufgabe
*  Q  Customizing-Aufgabe
*  G  Stückliste für CTS-Projekt
*  M  Auftrag für Mandantentransport
*  P  Stückliste für Upgrade
*  D  Stückliste für Patch
*  F  Stückliste
*  L  Löschtransport
* TRSTATUS
*  D  Änderbar
*  L  Änderbar, geschützt
*  O  Freigabe gestartet
*  R  Freigegeben
*  N  Freigegeben (Importschutz für reparierte Objekte aktiv)
* KORRDEV
*  CUST  mandantenabhängiges Customizing
*  SYST  Repository, mandantenunabbhängige Objekte
* LOCKFLAG
*     nicht gesperrt
*  X  gesperrt
*  0  nicht importiert
*  1  importiert mit Fehler
*  2  erfolgreich importiert
*  3  erfolgreich aktiviert /After-Import-Methode ausgeführt
*  6  erfolgreich in Schattentabellen importiert
*  7  erfolgreich in neue Schattentabellen importiert
*  8  inaktiver Anteil erfolgreich importiert
  SELECT e~trkorr,      " Auftrag/Aufgabe
         e~trfunction,  " Typ des Auftrags/Aufgabe
         e~trstatus,    " Status des Auftrags/der Aufgabe
         e~tarsystem,   " Transportziel eines Auftrags
         e~korrdev,     " Kategorie des Auftrags/der Aufgabe
         e~as4user,     " Inhaber eines Auftrags oder einer Aufgabe
         e~as4date,     " Datum der letzten Änderung
         e~as4time,     " Uhrzeit der letzten Änderung
         e~strkorr,     " Übergeordneter Auftrag
         t~as4text,     " Kurzbeschreibung von Repository-Objekten
         c~client,      " Quellmandant eines Auftrags
         c~tarclient,   " Zielmandant eines Auftrags
         o~as4pos,      " Dictionary: Zeilenposition
         o~pgmid,       " Programm-ID in Aufträgen und Aufgaben
         o~object,      " Objekttyp
         o~obj_name,    " Objektname in der Objektliste
         o~objfunc,     " Objektfunktion
         o~lockflag,    " Sperrstatus oder Importstatus zu einem Objekteintrag
         o~activity     " Aktivität, mit der Eintrag in Objektliste geschrieben wurde
    INTO TABLE @DATA(it_e070)
    FROM e070 AS e                                    " Transportsystem: Header von Aufträgen/Aufgaben
    INNER JOIN e07t AS t ON e~trkorr = t~trkorr       " Transportsystem: Kurzbeschreibungen von Aufträgen/Aufgaben
    INNER JOIN e070c AS c ON e~trkorr = c~trkorr      " Transportsystem: Quell-/Zielmandant von Aufträgen/Aufgaben
    LEFT OUTER JOIN e071 AS o ON e~trkorr = o~trkorr  " Transportsystem: Objekt-Einträge von Aufträgen/Aufgaben
    WHERE (lv_where).

  IF sy-subrc = 0.
* sortieren nach Auftrag und Datum / Uhrzeit
    SORT: it_e070 BY trkorr as4date as4time.

    DATA: o_salv TYPE REF TO cl_salv_table.

    cl_salv_table=>factory( EXPORTING
                              r_container  = cl_gui_container=>default_screen
                            IMPORTING
                              r_salv_table = o_salv
                            CHANGING
                              t_table      = it_e070 ).

    o_salv->get_functions( )->set_all( abap_true ).
    o_salv->get_columns( )->set_optimize( abap_true ).
    o_salv->get_display_settings( )->set_list_header( 'Transporte' ).
    o_salv->get_display_settings( )->set_striped_pattern( abap_true ).
    o_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).

    LOOP AT o_salv->get_columns( )->get( ) ASSIGNING FIELD-SYMBOL(<c>).
      <c>-r_column->set_short_text( '' ).
      <c>-r_column->set_medium_text( '' ).
      <c>-r_column->set_long_text( |{ <c>-r_column->get_columnname( ) } [{ <c>-r_column->get_long_text( ) }]| ).
    ENDLOOP.

    o_salv->display( ).

    WRITE: space.
  ENDIF.

[ABAP] Transaktionsdienst (Objektorientiert)

* https://help.sap.com/saphelp_nw70/helpdata/de/fa/f23c18330411d5992100508b6b8b11/content.htm?no_cache=true
* https://rvanmil.wordpress.com/2011/04/14/using-the-transaction-service/
* https://archive.sap.com/discussions/thread/3338833
* https://help.sap.com/saphelp_erp60_sp/helpdata/de/f5/a3682ebc6911d4b2e80050dadfb92b/frameset.htm

* Typgruppe: OSCON
* Update modes
*   OSCON_DMODE_DIRECT           local updates (like the procedural SET UPDATE TASK LOCAL)
*   OSCON_DMODE_UPDATE_TASK      asynchronous updates
*   OSCON_DMODE_LOCAL            local updates (like the procedural SET UPDATE TASK LOCAL)
*   OSCON_DMODE_UPDATE_TASK_SYNC synchronous updates (like the procedural COMMIT WORK AND WAIT)
*   OSCON_DMODE_DEFAULT          (OSCON_DMODE_UPDATE_TASK)
* Programme:
*   DEMO_TRANSACTION_SERVICE
*   DEMO_CREATE_PERSISTENT

CLASS lcl_ta_handler DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS on_finished FOR EVENT finished OF if_os_transaction
      IMPORTING
          status.
ENDCLASS.

CLASS lcl_ta_handler IMPLEMENTATION.
  METHOD on_finished.
    IF status = oscon_tstatus_fin_success.
      WRITE: / 'Update erfolgreich.'.
    ENDIF.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.

  TRY.
      cl_os_system=>init_and_set_modes( i_external_commit = oscon_true
                                        i_update_mode     = oscon_dmode_default ).

      DATA(o_tam) = cl_os_system=>get_transaction_manager( ).
      DATA(o_ta) = o_tam->create_transaction( ).

      SET HANDLER lcl_ta_handler=>on_finished FOR o_ta.

      o_ta->start( ).
      
      ...

* ruft implizit COMMIT WORK
      o_ta->end( ).
    CATCH cx_root INTO DATA(e_txt).
      WRITE: / e_txt->get_text( ).
  ENDTRY.

[ABAP] Binärdaten: Bits setzen und auslesen, Bitoperationen

* DEMO_DATA_BIT
TRY.
* zwei Bytes
    DATA: lv_xa TYPE x LENGTH 1.
    DATA: lv_xb TYPE x LENGTH 1.

* Bit 1 und 8 setzen
    SET BIT 1 OF lv_xa.
    SET BIT 8 OF lv_xb.

* xstring mit Bit == 1 an der 7. Stelle
    DATA(lv_hex) = bit-set( 7 ).

    cl_demo_output=>write_data( lv_xa ).
    cl_demo_output=>write_data( lv_xb ).
    cl_demo_output=>write_data( lv_hex ).

* Bit 1 lesen
    DATA(lv_bit1) = 0.
    GET BIT 1 OF lv_xa INTO lv_bit1.

    cl_demo_output=>write_data( lv_bit1 ).

* Bit 8 lesen
    DATA(lv_bit8) = 0.
    GET BIT 8 OF lv_xb INTO lv_bit8.

    cl_demo_output=>write_data( lv_bit8 ).

    DATA: lv_and TYPE x LENGTH 1.
    DATA: lv_or TYPE x LENGTH 1.
    DATA: lv_xor TYPE x LENGTH 1.
    DATA: lv_not TYPE x LENGTH 1.

* AND
    lv_and = lv_xa BIT-AND lv_xb.
    cl_demo_output=>write_data( lv_and ).

* OR
    lv_or = lv_xa BIT-OR lv_xb.
    cl_demo_output=>write_data( lv_or ).

* XOR
    lv_xor = lv_xa BIT-XOR lv_xb BIT-XOR lv_hex.
    cl_demo_output=>write_data( lv_xor ).

* NOT
    lv_not = BIT-NOT lv_xb.
    cl_demo_output=>write_data( lv_not ).

* Bitweises lesen
    DATA(lv_bitstring_a) = ||.
    DATA(lv_bitstring_b) = ||.
    DATA(lv_bitstring_hex) = ||.
    DATA(lv_bitstring_and) = ||.
    DATA(lv_bitstring_or) = ||.
    DATA(lv_bitstring_xor) = ||.
    DATA(lv_bitstring_not) = ||.
    DO 8 TIMES.
      DATA(lv_bit) = 0.
      GET BIT sy-index OF lv_xa INTO lv_bit.
      lv_bitstring_a = lv_bitstring_a && lv_bit.
      GET BIT sy-index OF lv_xb INTO lv_bit.
      lv_bitstring_b = lv_bitstring_b && lv_bit.
      GET BIT sy-index OF lv_hex INTO lv_bit.
      lv_bitstring_hex = lv_bitstring_hex && lv_bit.
      GET BIT sy-index OF lv_and INTO lv_bit.
      lv_bitstring_and = lv_bitstring_and && lv_bit.
      GET BIT sy-index OF lv_or INTO lv_bit.
      lv_bitstring_or = lv_bitstring_or && lv_bit.
      GET BIT sy-index OF lv_xor INTO lv_bit.
      lv_bitstring_xor = lv_bitstring_xor && lv_bit.
      GET BIT sy-index OF lv_not INTO lv_bit.
      lv_bitstring_not = lv_bitstring_not && lv_bit.
    ENDDO.

    cl_demo_output=>write_data( lv_bitstring_a ).
    cl_demo_output=>write_data( lv_bitstring_b ).
    cl_demo_output=>write_data( lv_bitstring_hex ).
    cl_demo_output=>write_data( lv_bitstring_and ).
    cl_demo_output=>write_data( lv_bitstring_or ).
    cl_demo_output=>write_data( lv_bitstring_xor ).
    cl_demo_output=>write_data( lv_bitstring_not ).

    cl_demo_output=>display( ).
  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

[ABAP] Komplexbeispiel: Binärdaten Screenshot mit GZIP komprimieren, in Base64-String wandeln und zurück (CL_ABAP_GZIP, SSFC_BASE64_ENCODE, SSFC_BASE64_DECODE)

TRY.
    DATA: lv_mime_type TYPE string.
    DATA: lv_image_bytes TYPE xstring.

* Ein paar Bytes holen: Screenshot aufnehmen
    cl_gui_frontend_services=>get_screenshot( IMPORTING
                                                mime_type_str = lv_mime_type
                                                image         = lv_image_bytes ).

    DATA: lv_xstr_gzip TYPE xstring.

* Binärdaten mit GZIP komprimieren
    cl_abap_gzip=>compress_binary( EXPORTING raw_in   = lv_image_bytes
                                   IMPORTING gzip_out = lv_xstr_gzip ).

    DATA(lv_base64_data) = ||.

* Base64 codieren
    CALL FUNCTION 'SSFC_BASE64_ENCODE'
      EXPORTING
        bindata                  = lv_xstr_gzip
      IMPORTING
        b64data                  = lv_base64_data
      EXCEPTIONS
        ssf_krn_error            = 1
        ssf_krn_noop             = 2
        ssf_krn_nomemory         = 3
        ssf_krn_opinv            = 4
        ssf_krn_input_data_error = 5
        ssf_krn_invalid_par      = 6
        ssf_krn_invalid_parlen   = 7
        OTHERS                   = 8.
    IF sy-subrc = 0.

* Base64-String in der Listenausgabe darstellen
      DATA: it_text80 TYPE STANDARD TABLE OF text80 WITH DEFAULT KEY.
* formatierte Ausgabe (80 Zeichen Breite)
      CALL FUNCTION 'SWA_STRING_TO_TABLE'
        EXPORTING
          character_string = lv_base64_data
        IMPORTING
          character_table  = it_text80.

      LOOP AT it_text80 ASSIGNING FIELD-SYMBOL(<t>).
        WRITE: / <t>.
      ENDLOOP.

      DATA: lv_xstr_dec TYPE xstring.

* Base64 decodieren
      CALL FUNCTION 'SSFC_BASE64_DECODE'
        EXPORTING
          b64data                  = lv_base64_data
        IMPORTING
          bindata                  = lv_xstr_dec
        EXCEPTIONS
          ssf_krn_error            = 1
          ssf_krn_noop             = 2
          ssf_krn_nomemory         = 3
          ssf_krn_opinv            = 4
          ssf_krn_input_data_error = 5
          ssf_krn_invalid_par      = 6
          ssf_krn_invalid_parlen   = 7
          OTHERS                   = 8.

      IF sy-subrc = 0.
        DATA: lv_pic_bytes TYPE xstring.

* Binärdaten mit GZIP dekomprimieren
        cl_abap_gzip=>decompress_binary( EXPORTING gzip_in = lv_xstr_dec IMPORTING raw_out = lv_pic_bytes ).

* freier Custom-Container innerhalb der Listenansicht
        DATA(o_cnt) = NEW cl_gui_custom_container( container_name = ''
                                                   repid          = 'SAPMSSY0'
                                                   dynnr          = '0120' ).

* Position des Containers setzen
        o_cnt->set_top( 50 ).
        o_cnt->set_left( 50 ).
        o_cnt->set_width( 640 ).
        o_cnt->set_height( 240 ).

* Bild über die URL laden und anzeigen
        DATA(o_pic) = NEW cl_gui_picture( parent = o_cnt ).
        o_pic->set_display_mode( display_mode = cl_gui_picture=>display_mode_stretch ).

* xstring -> solix
        DATA(it_bin_data) = cl_bcs_convert=>xstring_to_solix( lv_pic_bytes ).

        DATA: lv_url TYPE swk_url.

* temporäre URL für das Bild erzeugen
        CALL FUNCTION 'DP_CREATE_URL'
          EXPORTING
            type                 = 'image/jpeg' " https://wiki.selfhtml.org/wiki/Referenz:MIME-Typen
            subtype              = ''
          TABLES
            data                 = it_bin_data
          CHANGING
            url                  = lv_url
          EXCEPTIONS
            dp_invalid_parameter = 1
            dp_error_put_table   = 2
            dp_error_general     = 3
            OTHERS               = 4.

* Bild von URL laden
        o_pic->load_picture_from_url_async( lv_url ).

      ENDIF.
    ENDIF.

  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

[ABAP] Klasse zur Verarbeitung von Binärdaten (binary streams)

TRY.
* Beispieldaten
    DATA: lv_xstr TYPE xstring VALUE 'FF000000'.
    WRITE: / 'STREAM:', lv_xstr.

* Binary stream
    DATA(o_stream) = NEW cl_fxs_binary_stream( mv_byteorder = cl_fxs_binary_stream=>co_byteorder_little
                                               mv_data      = lv_xstr ).

* Länge
    DATA(lv_len) = o_stream->get_length( ).
    WRITE: / 'Länge:', lv_len.
* Byteorder
    WRITE: / 'Byteorder:', o_stream->get_byteorder( ).

    IF lv_len > 0.
* 1 Byte lesen
      WRITE: / 'BYTE:', o_stream->read_byte( iv_offset = 0 ).
* Int lesen
      WRITE: / 'INT:', o_stream->read_int( iv_offset = 0 ).
* Short lesen
      WRITE: / 'SHORT:', o_stream->read_short( iv_offset = 0 ).
* WORD lesen
      WRITE: / 'WORD:', o_stream->read_word( iv_offset = 0 ).
* 1 DWORD (4 Bytes) lesen, ahängig der Byteorder
      WRITE: / 'DWORD:', o_stream->read_dword( iv_offset = 0 ).
* Datenzeiger auf Byte 4 setzen
      o_stream->seek_to( 3 ).
* Byte schreiben
      WRITE: / 'Byte 4 schreiben:', 32.
      o_stream->write_byte( iv_offset = 0
                            iv_value  = 32 ).
* Byte-Sequenz lesen
      WRITE: / 'BYTE-Sequenz (Byte 3 und 4):', o_stream->read_byteseq( iv_offset = -1
                                                                       iv_len    = 2 ).
    ENDIF.

  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

[ABAP] Binärdaten (RAW) mit GZIP komprimieren und Base64 codieren

/iwwrk/cl_mgw_workflow_rt_util

TRY.
* Binärdaten
    DATA: lv_xstr TYPE xstring VALUE '54657374737472696E672066C3BC7220646965204B6F6D7072657373696F6E206D697420475A49502E'.
    DATA: lv_xstr_gzip TYPE xstring.

* GZIP komprimieren
    cl_abap_gzip=>compress_binary( EXPORTING raw_in   = lv_xstr
                                   IMPORTING gzip_out = lv_xstr_gzip ).

* Base64 codieren
    DATA(lv_base64_data) = /iwwrk/cl_mgw_workflow_rt_util=>base64_encode( lv_xstr_gzip ).

    WRITE: / lv_base64_data.

  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

SSFC_BASE64_ENCODE

* Binärdaten
DATA: lv_xstr TYPE xstring VALUE '54657374737472696E672066C3BC7220646965204B6F6D7072657373696F6E206D697420475A49502E'.
DATA: lv_xstr_gzip TYPE xstring.

* GZIP komprimieren
cl_abap_gzip=>compress_binary( EXPORTING raw_in   = lv_xstr
                               IMPORTING gzip_out = lv_xstr_gzip ).

DATA(lv_base64_data) = ||.

* Base64 codieren
CALL FUNCTION 'SSFC_BASE64_ENCODE'
  EXPORTING
    bindata                  = lv_xstr_gzip
  IMPORTING
    b64data                  = lv_base64_data
  EXCEPTIONS
    ssf_krn_error            = 1
    ssf_krn_noop             = 2
    ssf_krn_nomemory         = 3
    ssf_krn_opinv            = 4
    ssf_krn_input_data_error = 5
    ssf_krn_invalid_par      = 6
    ssf_krn_invalid_parlen   = 7
    OTHERS                   = 8.
IF sy-subrc = 0.
  WRITE: / lv_base64_data.
ENDIF.

[ABAP] Base64 codierten String in Binärdaten (RAW) konvertieren und mit GZIP dekomprimieren

/iwwrk/cl_mgw_workflow_rt_util

TRY.
* Base64 String welcher GZIP-komprimierte Binärdaten beinhaltet
    DATA(lv_base64_data) = |C0ktLikuKcrMS1dIO7ynSCElM1XBOz+3oCi1uDgzP08hN7NEwT3KM0APAA==|.

* Base64 decodieren
    DATA(lv_xstr_gzip) = /iwwrk/cl_mgw_workflow_rt_util=>base64_decode( lv_base64_data ).

* Binärdaten
    DATA: lv_xstr TYPE xstring.
    cl_abap_gzip=>decompress_binary( EXPORTING gzip_in = lv_xstr_gzip IMPORTING raw_out = lv_xstr ).

    DATA: lv_str TYPE string.

* xstring (binary) -> string (UTF-8)
    DATA(o_conv) = cl_abap_conv_in_ce=>create( input    = lv_xstr
                                               encoding = 'UTF-8' ).
    o_conv->read( IMPORTING data = lv_str ).

    WRITE: / lv_str.

  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

SSFC_BASE64_DECODE

* Base64 String welcher GZIP-komprimierte Binärdaten beinhaltet
DATA(lv_base64_data) = |C0ktLikuKcrMS1dIO7ynSCElM1XBOz+3oCi1uDgzP08hN7NEwT3KM0APAA==|.

* Binärdaten
DATA: lv_xstr TYPE xstring.
DATA: lv_xstr_gzip TYPE xstring.

* Base64 decodieren
CALL FUNCTION 'SSFC_BASE64_DECODE'
  EXPORTING
    b64data                  = lv_base64_data
  IMPORTING
    bindata                  = lv_xstr_gzip
  EXCEPTIONS
    ssf_krn_error            = 1
    ssf_krn_noop             = 2
    ssf_krn_nomemory         = 3
    ssf_krn_opinv            = 4
    ssf_krn_input_data_error = 5
    ssf_krn_invalid_par      = 6
    ssf_krn_invalid_parlen   = 7
    OTHERS                   = 8.

IF sy-subrc = 0.
  cl_abap_gzip=>decompress_binary( EXPORTING gzip_in = lv_xstr_gzip IMPORTING raw_out = lv_xstr ).

  DATA: lv_str TYPE string.

* xstring (binary) -> string (UTF-8)
  DATA(o_conv) = cl_abap_conv_in_ce=>create( input    = lv_xstr
                                             encoding = 'UTF-8' ).
  o_conv->read( IMPORTING data = lv_str ).

  WRITE: / lv_str.
ENDIF.

[ABAP] Systemnamen ermitteln

* Variante 1 (SQL)
DATA(man) = cl_abap_syst=>get_client( ).

SELECT SINGLE logsys FROM t000 INTO @DATA(lv_logsys) WHERE mandt = @man.

IF sy-subrc = 0.
  WRITE: / lv_logsys.
ENDIF.

* Variante 2 (OWN_LOGICAL_SYSTEM_GET)
DATA: lv_logsys TYPE tbdls-logsys.

CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
  IMPORTING
    own_logical_system             = lv_logsys
  EXCEPTIONS
    own_logical_system_not_defined = 1
    OTHERS                         = 2.

IF sy-subrc = 0.
  WRITE: / lv_logsys.
ENDIF.