[ABAP] ABAP-Sprache aus T002, T002T und T002TX lesen (xco_cp_language)

DATA(lv_lang) = xco_cp=>language( 'D' ).
* DE
WRITE: / lv_lang->value.
* DE
WRITE: / lv_lang->as( xco_cp_language=>format->iso_639 ).
* Deutsch
WRITE: / lv_lang->get_name( ).
* Deutsch, Deutschland
WRITE: / lv_lang->get_long_text_description( ).

Links

[ABAP] Excel-Daten mit XCO API (xco_cp_xlsx) lesen

TYPES: BEGIN OF ty_xl_sheet,
         col1 TYPE string,
         col2 TYPE string,
         col3 TYPE string,
       END OF ty_xl_sheet.

TYPES: ty_it_users TYPE STANDARD TABLE OF ty_xl_sheet WITH DEFAULT KEY.

TRY.

    DATA: lv_rc TYPE i.
    DATA: it_files TYPE filetable.
    DATA: lv_action TYPE i.

* FileOpen-Dialog aufrufen
    cl_gui_frontend_services=>file_open_dialog( EXPORTING file_filter = |xlsx (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }|
                                                CHANGING  file_table  = it_files
                                                          rc          = lv_rc
                                                          user_action = lv_action ).

    IF lv_action = cl_gui_frontend_services=>action_ok.
* wenn Datei ausgewählt wurde
      IF lines( it_files ) > 0.
* ersten Tabelleneintrag lesen
        DATA: lv_filesize TYPE w3param-cont_len.
        DATA: lv_filetype TYPE w3param-cont_type.
        DATA: it_bin_data TYPE w3mimetabtype.

* Excel-Datei auf Appl. Server hochladen (binary)
        cl_gui_frontend_services=>gui_upload( EXPORTING filename   = |{ it_files[ 1 ]-filename }|
                                                        filetype   = 'BIN'
                                              IMPORTING filelength = lv_filesize
                                              CHANGING  data_tab   = it_bin_data ).

* solix -> xstring
        DATA(lv_xsts_xlsx) = cl_bcs_convert=>solix_to_xstring( it_solix = it_bin_data ).

* Excel-Dokument
        DATA(o_xl) = xco_cp_xlsx=>document->for_file_content( lv_xsts_xlsx )->read_access( ).

* Sheet
        DATA(o_sheet) = o_xl->get_workbook( )->worksheet->at_position( 1 ).

        IF abap_true = o_sheet->exists( ).

* komplette Sheet auswählen
          DATA(o_sel_pattern) = xco_cp_xlsx_selection=>pattern_builder->simple_from_to( )->get_pattern( ).

          DATA: it_sheet_data TYPE ty_it_users.

* Daten aus Sheet als Strings in interne Tabelle schreiben
          DATA(o_result) = o_sheet->select( o_sel_pattern
                                          )->row_stream(
                                          )->operation->write_to( REF #( it_sheet_data )
                                          )->set_value_transformation( xco_cp_xlsx_read_access=>value_transformation->string_value
                                          )->execute( ).

          IF abap_true = o_result->succeeded.
* Datenausgabe
            cl_demo_output=>write_data( it_sheet_data ).

*             HTML-Code vom Demo-Output holen
            DATA(lv_html) = cl_demo_output=>get( ).

*             Daten im Inline-Browser im SAP-Fenster anzeigen
            cl_abap_browser=>show_html( EXPORTING title       = 'Excel'
                                                  html_string = lv_html
                                                  container   = cl_gui_container=>default_screen ).

*             cl_gui_container=>default_screen erzwingen
            WRITE: space.
          ENDIF.

        ELSE.

* Fehlerbehandlung
          LOOP AT o_result->messages INTO DATA(o_msg).
            WRITE: / o_msg->get_text( ).
          ENDLOOP.

        ENDIF.
      ENDIF.
    ENDIF.

  CATCH cx_root INTO DATA(e_text).
    MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
ENDTRY.

Links

[ABAP] Daten einer internen Tabelle als Excel-Datei speichern (xco_cp_xlsx)

TYPES: BEGIN OF ty_xl_sheet,
         col1 TYPE string,
         col2 TYPE string,
         col3 TYPE string,
       END OF ty_xl_sheet.

TYPES: ty_it_users TYPE STANDARD TABLE OF ty_xl_sheet WITH DEFAULT KEY.

TRY.
* leeres Excel-Dokument
    DATA(o_xl) = xco_cp_xlsx=>document->empty( )->write_access( ).

* 1. Sheet holen
    DATA(o_sheet) = o_xl->get_workbook( )->worksheet->at_position( 1 ).

    IF abap_true = o_sheet->exists( ).

* neuen Namen für Sheet setzen
      o_sheet->set_name( 'Test1' ).

* Daten
      DATA(it_sheet_data) = VALUE ty_it_users( ( col1 = 'Name' col2 = 'Adr.' col3 = 'Age' )
                                               ( col1 = 'Ulf'  col2 = 'Str. 1' col3 = '22' )
                                               ( col1 = 'Ida'  col2 = 'Str. 2' col3 = '21' ) ).

* komplette Sheet auswählen
      DATA(o_sel_pattern) = xco_cp_xlsx_selection=>pattern_builder->simple_from_to( )->get_pattern( ).

* Daten einfügen
      DATA(o_result) = o_sheet->select( o_sel_pattern
                                      )->row_stream(
                                      )->operation->write_from( REF #( it_sheet_data )
                                      )->execute( ).

      IF abap_true = o_result->succeeded.
* Daten als XSTRING (Excel-Datei holen)
        DATA(lv_xl_xtsr) = o_xl->get_file_content( ).

* xstring -> itab (bytes)
        DATA: lv_size TYPE i.
        DATA: it_raw_data TYPE xml_rawdata.

* xstring (Bytes) -> RAW (iTab)
        cl_scp_change_db=>xstr_to_xtab( EXPORTING im_xstring = lv_xl_xtsr
                                        IMPORTING ex_size    = lv_size
                                                  ex_xtab    = it_raw_data ).

        IF lines( it_raw_data ) > 0.
          DATA: lv_action TYPE i.
          DATA: lv_filename TYPE string.
          DATA: lv_fullpath TYPE string.
          DATA: lv_path TYPE string.

* SaveDialog aufrufen
          cl_gui_frontend_services=>file_save_dialog( EXPORTING default_extension   = 'xlsx'
                                                                default_file_name   = 'export.xlsx'
                                                                file_filter         = |Excel-Datei (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }|
                                                                prompt_on_overwrite = abap_true
                                                      CHANGING  filename            = lv_filename
                                                                path                = lv_path
                                                                fullpath            = lv_fullpath
                                                                user_action         = lv_action ).

          IF lv_action EQ cl_gui_frontend_services=>action_ok.
* iTab (bytes) -> lokale Datei
            cl_gui_frontend_services=>gui_download( EXPORTING filename     = lv_fullpath
                                                              filetype     = 'BIN'
                                                              bin_filesize = lv_size " Size ist wichtig für das korrekte Schreiben der Excel-Datei
                                                    CHANGING  data_tab     = it_raw_data ).
* lokale Datei im Excel aufrufen
* parameter muss wegen möglicher Leerzeichen im Pfad mit "" quotiert werden
            cl_gui_frontend_services=>execute( application = 'excel.exe'
                                               parameter   = |"{ lv_fullpath }"| ).
          ENDIF.

        ELSE.

* Fehlerbehandlung
          LOOP AT o_result->messages INTO DATA(o_msg).
            WRITE: / o_msg->get_text( ).
          ENDLOOP.

        ENDIF.
      ENDIF.
    ENDIF.

  CATCH cx_root INTO DATA(e_text).
    MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
ENDTRY.

Links

[ABAP] JSON -> ABAP (xco_cp_json)

TYPES: BEGIN OF ty_s_person,
         name  TYPE string,
         title TYPE string,
         age   TYPE i,
       END OF ty_s_person.

DATA(lv_json) = |\{"name":"Horst","title":"Herr","age":30\}|.

DATA(lv_persons) = VALUE ty_s_person( ).

TRY.
    xco_cp_json=>data->from_string( lv_json
                                  )->apply( VALUE #( ( xco_cp_json=>transformation->boolean_to_abap_bool )
                                                     ( xco_cp_json=>transformation->pascal_case_to_underscore ) )
                                  )->write_to( REF #( lv_persons ) ).

    cl_demo_output=>write_data( lv_json ).
    cl_demo_output=>write_data( lv_persons ).

* HTML-Code vom Demo-Output holen
    DATA(lv_html) = cl_demo_output=>get( ).

* Daten im Inline-Browser im SAP-Fenster anzeigen
    cl_abap_browser=>show_html( EXPORTING title       = 'JSON'
                                          html_string = lv_html
                                          container   = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
    WRITE: space.
  CATCH cx_root.
ENDTRY.

Links

[ABAP] ABAP -> JSON (xco_cp_json)

TYPES: BEGIN OF ty_s_person,
         name  TYPE string,
         title TYPE string,
         age   TYPE i,
       END OF ty_s_person.

TYPES: ty_t_person TYPE STANDARD TABLE OF ty_s_person WITH DEFAULT KEY.

DATA(it_persons) = VALUE ty_t_person( ( name = 'Horst' title = 'Herr' age = 30 )
                                      ( name = 'Jutta' title = 'Frau' age = 35 )
                                      ( name = 'Ingo'  title = 'Herr' age = 31 ) ).

TRY.
* ABAP -> JSON
    DATA(lv_json) = xco_cp_json=>data->from_abap( it_persons )->to_string( ).

    cl_demo_output=>write_data( it_persons ).
    cl_demo_output=>write_data( lv_json ).

* HTML-Code vom Demo-Output holen
    DATA(lv_html) = cl_demo_output=>get( ).

* Daten im Inline-Browser im SAP-Fenster anzeigen
    cl_abap_browser=>show_html( EXPORTING title       = 'JSON'
                                          html_string = lv_html
                                          container   = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
    WRITE: space.
  CATCH cx_root.
ENDTRY.

Links

[ABAP] String nach SYMSG-Struktur konvertieren

* String
DATA(lv_string) = |Ein String der mehrere Zeichen hat und noch viel länger als gedacht sein kann.|.
* Error-Message als SYMSG-Struktur
DATA(lv_message) = xco_cp=>string( lv_string )->as_message( xco_cp_message=>type->error )->value.

cl_demo_output=>write_data( lv_message ).

* HTML-Code vom Demo-Output holen
DATA(lv_html) = cl_demo_output=>get( ).

* Daten im Inline-Browser im SAP-Fenster anzeigen
cl_abap_browser=>show_html( EXPORTING title       = 'Message'
                                      html_string = lv_html
                                      container   = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
WRITE: space.

[ABAP] Unix-Timestamp erzeugen

* akt. UNIX Timestamp
DATA(lv_ut) = xco_cp=>sy->unix_timestamp( )->value.

WRITE: / lv_ut.

* akt. UNIX Timestamp aus Datums-Vorgabe
DATA(lv_ut_cust) = xco_cp_time=>moment( iv_year   = '2025'
                                        iv_month  = '05'
                                        iv_day    = '25'
                                        iv_hour   = '07'
                                        iv_minute = '00'
                                        iv_second = '00'
                                      )->get_unix_timestamp( )->value.

WRITE: / lv_ut_cust.

[ABAP] API-Klasse mit Ersatzfunktionen für eingeschränkte ABAP-Funktionalität in der SAP S/4HANA Cloud-Umgebung

Variante 1 (cl_abap_context_info)

* Verfügbar für SAP S/4HANA Cloud
* SY-DATUM
DATA(lv_sy_datum) = cl_abap_context_info=>get_system_date( ).
* SY-UZEIT
DATA(lv_sy_uzeit) = cl_abap_context_info=>get_system_time( ).
* SY-UNAME
DATA(lv_sy_uname) = cl_abap_context_info=>get_user_technical_name( ).
* Username
DATA(lv_user_name) = cl_abap_context_info=>get_user_formatted_name( ).
* User Description
DATA(lv_user_desc) = cl_abap_context_info=>get_user_description( ).
* SY-LANGU
DATA(lv_sy_langu) = cl_abap_context_info=>get_user_language_abap_format( ).
* ISO-Language
DATA(lv_langu_iso) = cl_abap_context_info=>get_user_language_iso_format( ).
* SY-ZONLO
DATA(lv_sy_zonlo) = cl_abap_context_info=>get_user_time_zone( ).
* System URL
DATA(lv_system_url) = cl_abap_context_info=>get_system_url( ).
* User Business Partner ID
DATA(lv_user_bpid) = cl_abap_context_info=>get_user_business_partner_id( ).
* User alias
DATA(lv_user_alias) = cl_abap_context_info=>get_user_alias( ).

Variante 2 (xco_cp, xco_cp_time)

* sy-uname
DATA(lv_sy_uname) = xco_cp=>sy->user( )->name.

* sy-langu
DATA(lv_sy_langu) = xco_cp=>sy->language( )->value.
DATA(lv_sy_langu_name) = xco_cp=>sy->language( )->get_name( ).
DATA(lv_sy_langu_long_text) = xco_cp=>sy->language( )->get_long_text_description( ).
DATA(lv_sy_langu_iso639) = xco_cp=>sy->language( )->as( xco_cp_language=>format->iso_639 ).

* sy-datlo
DATA(lv_sy_datlo) = xco_cp=>sy->date( )->as( xco_cp_time=>format->abap )->value.
DATA(lv_sy_datlo_iso_8601_basic) = xco_cp=>sy->date( )->as( xco_cp_time=>format->iso_8601_basic )->value.
DATA(lv_sy_datlo_iso_8601_extended) = xco_cp=>sy->date( )->as( xco_cp_time=>format->iso_8601_extended )->value.

* sy-timlo
DATA(lv_sy_timlo) = xco_cp=>sy->time( )->as( xco_cp_time=>format->abap )->value.

* sy-msgid
DATA(lv_sy_msgid) = xco_cp=>sy->message( )->value-msgid.
* sy-msgno
DATA(lv_sy_msgno) = xco_cp=>sy->message( )->value-msgno.
* sy-msgty
DATA(lv_sy_msgty) = xco_cp=>sy->message( )->value-msgty.
* sy-msgv1
DATA(lv_sy_msgv1) = xco_cp=>sy->message( )->value-msgv1.

Links

[ABAP] MD5, SHA1, SHA256, SHA384, SHA512 HASH-Summen berechnen

Variante 1 (Strings)

* MD5, SHA1, SHA256, SHA384, SHA512
DATA(lv_algo) = |MD5|.
* zu kodierende String-Daten
DATA(lv_data) = |Teststring|.

* Hash-Wert als Hex-Encoded String
DATA: lv_hashstring TYPE string.
* Hash-Wert binär als XString
DATA: lv_hashxstring TYPE xstring.
* Hash-Wert als Base64-Encoded String
DATA: lv_hashb64string TYPE string.

TRY.
* Generische Hash-Funktion (Char-Input)
    cl_abap_message_digest=>calculate_hash_for_char( EXPORTING
                                                       if_algorithm     = lv_algo
                                                       if_data          = lv_data
                                                     IMPORTING
                                                       ef_hashstring    = lv_hashstring
                                                       ef_hashxstring   = lv_hashxstring
                                                       ef_hashb64string = lv_hashb64string ).
    cl_demo_output=>write_data( lv_algo ).
    cl_demo_output=>write_data( lv_data ).
    cl_demo_output=>write_data( lv_hashstring ).
    cl_demo_output=>write_data( lv_hashxstring ).
    cl_demo_output=>write_data( lv_hashb64string ).
    cl_demo_output=>display( ).
  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

Variante 2 (Bytefolgen / RAW)

* MD5, SHA1, SHA256, SHA384, SHA512
DATA(lv_algo) = |MD5|.
* zu kodierende String-Daten
DATA(lv_data) = |Teststring|.
* zu kodierende String-Daten als XSTRING
DATA(lv_datax) = cl_abap_message_digest=>string_to_xstring( lv_data ).

* Hash-Wert als Hex-Encoded String
DATA: lv_hashstring TYPE string.
* Hash-Wert binär als XString
DATA: lv_hashxstring TYPE xstring.
* Hash-Wert als Base64-Encoded String
DATA: lv_hashb64string TYPE string.

TRY.
* Generische Hash-Funktion (XString)
    cl_abap_message_digest=>calculate_hash_for_raw( EXPORTING
                                                      if_algorithm     = lv_algo
                                                      if_data          = lv_datax
                                                    IMPORTING
                                                      ef_hashstring    = lv_hashstring
                                                      ef_hashxstring   = lv_hashxstring
                                                      ef_hashb64string = lv_hashb64string ).
    cl_demo_output=>write_data( lv_algo ).
    cl_demo_output=>write_data( lv_data ).
    cl_demo_output=>write_data( lv_datax ).
    cl_demo_output=>write_data( lv_hashstring ).
    cl_demo_output=>write_data( lv_hashxstring ).
    cl_demo_output=>write_data( lv_hashb64string ).
    cl_demo_output=>display( ).
  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

Variante 3 (xco_cp, xco_cp_hash)

* MD5, SHA1, SHA256, SHA384, SHA512
DATA(lv_md5_hash) = xco_cp=>string( 'Teststring' )->as_xstring( xco_cp_hash=>algorithm->for( 'MD5' ) )->value.
DATA(lv_sha1_hash) = xco_cp=>string( 'Teststring' )->as_xstring( xco_cp_hash=>algorithm->for( 'SHA1' ) )->value.
DATA(lv_sha256_hash) = xco_cp=>string( 'Teststring' )->as_xstring( xco_cp_hash=>algorithm->for( 'SHA256' ) )->value.
DATA(lv_sha384_hash) = xco_cp=>string( 'Teststring' )->as_xstring( xco_cp_hash=>algorithm->for( 'SHA384' ) )->value.
DATA(lv_sha512_hash) = xco_cp=>string( 'Teststring' )->as_xstring( xco_cp_hash=>algorithm->for( 'SHA512' ) )->value.

WRITE: / lv_md5_hash.
WRITE: / lv_sha1_hash.
WRITE: / lv_sha256_hash.
WRITE: / lv_sha384_hash.
WRITE: / lv_sha512_hash.

Links

[ABAP] xstring (Bytes) nach string (Text) wandeln

Variante 1 (cl_abap_conv_in_ce)

DATA: lv_xstr TYPE xstring VALUE '54657374737472696E672066C3BC7220646965204B6F6D7072657373696F6E206D697420475A49502E'.
DATA: lv_str TYPE string.
  
* xstring (binary) -> string (UTF-8)
DATA(o_conv_r) = cl_abap_conv_in_ce=>create( input = lv_xstr encoding = 'UTF-8' ).
o_conv_r->read( IMPORTING data = lv_str ).

WRITE: / lv_str.

Variante 2 (/ui2/cl_abap2json)

DATA: lv_xstr TYPE xstring VALUE '54657374737472696E672066C3BC7220646965204B6F6D7072657373696F6E206D697420475A49502E'.

* xstring -> string (UTF-8)
DATA(lv_str) = /ui2/cl_abap2json=>conv_xstring_to_string( lv_xstr ).

WRITE: / lv_str.

Variante 3 (cl_proxy_service)

DATA: lv_xstr TYPE xstring VALUE '54657374737472696E672066C3BC7220646965204B6F6D7072657373696F6E206D697420475A49502E'.

* xstring (binary) -> string (4110)
DATA(lv_str_res) = cl_proxy_service=>xstring2cstring( lv_xstr ).

WRITE: / lv_str_res.

Variante 4 (ICT_DISPATCH)

DATA: lv_xstr TYPE xstring VALUE '54657374737472696E672066C3BC7220646965204B6F6D7072657373696F6E206D697420475A49502E'.
DATA: lv_string TYPE string.

* xstring (binary) -> string
CALL 'ICT_DISPATCH' ID 'did'    FIELD 'append_xstring_to_string'
                    ID 'source' FIELD lv_xstr
                    ID 'dest'   FIELD lv_string.

WRITE: / lv_string.

Variante 5 (xco_cp, xco_cp_character)

* https://software-heroes.com/blog/abap-xco-strings
DATA: lv_xstr TYPE xstring VALUE '54657374737472696E672066C3BC7220646965204B6F6D7072657373696F6E206D697420475A49502E'.
* xstring (binary) -> string (UTF-8)
DATA(lv_string) = xco_cp=>xstring( lv_xstr )->as_string( xco_cp_character=>code_page->utf_8 )->value.
WRITE: / lv_string.

Variante 6 (cl_abap_codepage)

DATA: lv_xstr TYPE xstring VALUE '54657374737472696E672066C3BC7220646965204B6F6D7072657373696F6E206D697420475A49502E'.
DATA(lv_string) = cl_abap_codepage=>convert_from( source = lv_xstr ).
WRITE: / lv_string.