[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] 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.

[ABAP] Eindeutige ID (GUID / UUID) generieren

Variante 1 (cl_system_uuid)

DATA: l_uuid_x16 TYPE sysuuid_x16.
DATA: l_uuid_c22 TYPE sysuuid_c22.
DATA: l_uuid_c26 TYPE sysuuid_c26.
DATA: l_uuid_c32 TYPE sysuuid_c32.

TRY.
    " verschiedene GUIDs / UUIDs erzeugen
    l_uuid_x16 = cl_system_uuid=>create_uuid_x16_static( ).
    l_uuid_c22 = cl_system_uuid=>create_uuid_c22_static( ).
    l_uuid_c26 = cl_system_uuid=>create_uuid_c26_static( ).
    l_uuid_c32 = cl_system_uuid=>create_uuid_c32_static( ).

  CATCH cx_uuid_error INTO DATA(e_text).
    MESSAGE e_text->get_text( ) TYPE 'I'.
ENDTRY.

WRITE: / | uuid_x16: { l_uuid_x16 } |.
WRITE: / | uuid_c22: { l_uuid_c22 } |.
WRITE: / | uuid_c26: { l_uuid_c26 } |.
WRITE: / | uuid_c32: { l_uuid_c32 } |.

Variante 2 (xco_cp, xco_cp_uuid)

* X16
WRITE: / xco_cp=>uuid( )->value.
* C22
WRITE: / xco_cp=>uuid( )->as( xco_cp_uuid=>format->c22 )->value.
* C32
WRITE: / xco_cp=>uuid( )->as( xco_cp_uuid=>format->c32 )->value.
* C36
WRITE: / xco_cp=>uuid( )->as( xco_cp_uuid=>format->c36 )->value.

Links

[ABAP] RegEx – String auf gültige Email-Adresse prüfen

Variante 1 (cl_abap_matcher)

*         Übersicht TLD: https://data.iana.org/TLD/tlds-alpha-by-domain.txt
* Format Email-Adressen: https://de.wikipedia.org/wiki/E-Mail-Adresse
*    einfaches Beispiel: ^[\w\.=-]+@[\w\.-]+\.[\w]{2,18}$
*    komplexes Beispiel: ^[a-zA-Z0-9][A-Za-z0-9\.!#$%&'*+\-\/=?^_`{|}~]{0,28}[a-zA-Z0-9]@[äöü\w\.\-]+\.[\w]{2,18}$
DATA(lv_email) = |my.email@email.com|.
DATA(lv_regex) = |^[a-zA-Z0-9][A-Za-z0-9.!#$%&'*+-/=?^_`\{\|\}~]\{0,28\}[a-zA-Z0-9]@[äöü\\w.-]+.[\\w]\{2,18\}$|.

IF abap_true = cl_abap_matcher=>create_pcre( pattern     = lv_regex
                                             text        = lv_email
                                             ignore_case = abap_true )->match( ).
  WRITE: / 'Gültige Email'.
ELSE.
  WRITE: / 'Ungültige Email'.
ENDIF.

Variante 2 (xco_cp, xco_cp_regular_expression)

DATA(lv_email) = |my.email@email.com|.
DATA(lv_regex) = |^[a-zA-Z0-9][A-Za-z0-9.!#$%&'*+-/=?^_`\{\|\}~]\{0,28\}[a-zA-Z0-9]@[äöü\\w.-]+.[\\w]\{2,18\}$|.

* Regex nach PCRE (Perl Compatible Regular Expressions)
DATA(lv_match) = xco_cp=>string( lv_email )->matches( iv_regular_expression = lv_regex
                                                      io_engine             = xco_cp_regular_expression=>engine->pcre( iv_ignore_case      = abap_true
                                                                                                                       iv_enable_multiline = abap_true ) ).

IF abap_true = lv_match.
  WRITE: / 'Gültige Email'.
ELSE.
  WRITE: / 'Ungültige Email'.
ENDIF.

Links