[ABAP] String (Char) nach Datum konvertieren

* Datum wandeln, siehe auch cl_abap_datfm=>conv_date_ext_to_int
DATA: lv_value_in TYPE string VALUE '01.01.2016'. " Eingabetyp und Wert
DATA: lv_value_out TYPE sy-datum.                 " Ausgabetyp

DATA(lv_tabfield) = VALUE tabfield( tabname   = 'SYST'
                                    fieldname = 'DATUM' ).
                                    
CALL FUNCTION 'RS_CONV_EX_2_IN'
  EXPORTING
    input_external               = CONV char30( condense( val = lv_value_in ) )
    table_field                  = lv_tabfield
  IMPORTING
    output_internal              = lv_value_out
  EXCEPTIONS
    input_not_numerical          = 1
    too_many_decimals            = 2
    more_than_one_sign           = 3
    ill_thousand_separator_dist  = 4
    too_many_digits              = 5
    sign_for_unsigned            = 6
    too_large                    = 7
    too_small                    = 8
    invalid_date_format          = 9
    invalid_date                 = 10
    invalid_time_format          = 11
    invalid_time                 = 12
    invalid_hex_digit            = 13
    unexpected_error             = 14
    invalid_fieldname            = 15
    field_and_descr_incompatible = 16
    input_too_long               = 17
    no_decimals                  = 18
    invalid_float                = 19
    conversion_exit_error        = 20
    OTHERS                       = 21.

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

[ABAP] String (Char) nach Float konvertieren

Variante 1 (CL_ABAP_CONTAINER_UTILITIES mit Float)

* String
DATA(lv_str_val) = |123.45|.
* Float
DATA: lv_float TYPE f.

* String -> Float
cl_abap_container_utilities=>read_container_c( EXPORTING
                                                 im_container = lv_str_val
                                               IMPORTING
                                                 ex_value     = lv_float ).

WRITE: / lv_float.

Variante 2 (CL_ABAP_CONTAINER_UTILITIES mit decfloat34)

* String
DATA(lv_str_val) = |123.45|.
* Float
DATA: lv_float TYPE decfloat34.

* String -> Float
cl_abap_container_utilities=>read_container_c( EXPORTING
                                                 im_container = lv_str_val
                                               IMPORTING
                                                 ex_value     = lv_float ).

WRITE: / lv_float.

Variante 3 (RS_CONV_EX_2_IN)

* Währungsbetrag wandeln
DATA: lv_value_in TYPE string VALUE '31,60'. " Eingabetyp und Wert
DATA: lv_value_out TYPE konp-kbetr.          " Ausgabetyp

DATA(lv_tabfield) = VALUE tabfield( tabname   = 'KONP'
                                    fieldname = 'KBETR' ).

CALL FUNCTION 'RS_CONV_EX_2_IN'
  EXPORTING
    input_external               = CONV char30( condense( val = lv_value_in ) )
    table_field                  = lv_tabfield
  IMPORTING
    output_internal              = lv_value_out
  EXCEPTIONS
    input_not_numerical          = 1
    too_many_decimals            = 2
    more_than_one_sign           = 3
    ill_thousand_separator_dist  = 4
    too_many_digits              = 5
    sign_for_unsigned            = 6
    too_large                    = 7
    too_small                    = 8
    invalid_date_format          = 9
    invalid_date                 = 10
    invalid_time_format          = 11
    invalid_time                 = 12
    invalid_hex_digit            = 13
    unexpected_error             = 14
    invalid_fieldname            = 15
    field_and_descr_incompatible = 16
    input_too_long               = 17
    no_decimals                  = 18
    invalid_float                = 19
    conversion_exit_error        = 20
    OTHERS                       = 21.

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

[ABAP] Führende Nullen zu einer Materialnummer (MATNR), Vertriebsbeleg (VBELN) hinzufügen (zero-padding)

Variante 1 (FuBa)

DATA: lv_matnr TYPE char18 VALUE '1234567890'.

* Prüft Länge, Datentyp, fügt führende Nullen ein
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  EXPORTING
    input  = lv_matnr
  IMPORTING
    output = lv_matnr.

WRITE: / |{ lv_matnr }|.

Variante 2 (UNPACK)

DATA: lv_c_matnr TYPE char10 VALUE '1234567890'. " 10-stellige MatNr
DATA: lv_matnr TYPE mara-matnr.                  " 18-stellige MatNr

UNPACK lv_c_matnr TO lv_matnr.

WRITE: / |{ lv_matnr }|.

Variante 3 (SHIFT/OVERLAY)

DATA: lv_c_matnr TYPE char18 VALUE '1234567890'. " 10-stellige MatNr als Input

SHIFT lv_c_matnr RIGHT DELETING TRAILING space.
* 18-stellig mit Nullen überlagern
OVERLAY lv_c_matnr WITH '000000000000000000'.

WRITE: / |{ lv_c_matnr }|.

Variante 4 (String-Template)

DATA: lv_matnr TYPE string VALUE '12345'

* 18-stellige Ausgabe mit führende Nullen
lv_matnr = |{ lv_matnr WIDTH = 18 ALPHA = IN }|.

WRITE: / |{ lv_matnr }|.

[ABAP] Führende Nullen von einer Materialnummer (MATNR), Vertriebsbeleg (VBELN) entfernen (remove preceeding zeros)

Variante 1 (FuBa)

DATA: lv_matnr_18 TYPE char18 VALUE '000000001234567890'.
DATA: lv_matnr_10 TYPE char10.

* Prüft Länge, Datentyp, entfernt führende Nullen
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
  EXPORTING
    input  = lv_matnr_18
  IMPORTING
    output = lv_matnr_10.

WRITE: / |{ lv_matnr_10 }|.

Variante 2 (SHIFT)

DATA: lv_matnr TYPE char18 VALUE '000000001234567890'.

* Führende Nullen nach links schieben
SHIFT lv_matnr LEFT DELETING LEADING '0'.

WRITE: / |{ lv_matnr }|.

Variante 3 (String-Template)

DATA: lv_matnr TYPE string VALUE '000000001234567890'.

* Führende Nullen aus dem String entfernen
lv_matnr = |{ lv_matnr ALPHA = OUT }|.

WRITE: / |{ lv_matnr }|.

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

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

Variante 1 (cl_abap_conv_out_ce)

DATA: lv_str TYPE string VALUE 'Teststring.'.
DATA: lv_xstr TYPE xstring.

* string (UTF-8) -> xstring (binary)
DATA(o_conv_w) = cl_abap_conv_out_ce=>create( encoding = 'UTF-8' ).
o_conv_w->write( data = lv_str ).
lv_xstr = o_conv_w->get_buffer( ).

WRITE: / lv_xstr.

Variante 2 (SCMS_STRING_TO_XSTRING)

DATA: lv_str TYPE string VALUE 'Teststring.'.
DATA: lv_xstr TYPE xstring.
  
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
  EXPORTING
    text   = lv_str
  IMPORTING
    buffer = lv_xstr.

WRITE: / lv_xstr.

Variante 3 (cl_proxy_service)

DATA: lv_str TYPE string VALUE 'Teststring.'.
* string (4110 / UTF-8) -> xstring (binary)
DATA(lv_xstr_res) = cl_proxy_service=>cstring2xstring( lv_str ).
WRITE: / lv_xstr_res.

Variante 4 (cl_abap_codepage)

DATA: lv_str TYPE string VALUE 'Teststring.'.
* string -> xstring (binary) (UTF-8)
DATA(xstr) = cl_abap_codepage=>convert_to( source   = lv_str
                                           codepage = 'UTF-8' ).
WRITE: / xstr.

Variante 5 (cl_abap_message_digest)

DATA: lv_str TYPE string VALUE 'Teststring.'.
* string (4110 / UTF-8) -> xstring (binary)
DATA(lv_xstr) = cl_abap_message_digest=>string_to_xstring( lv_str ).

WRITE: / lv_xstr.

Variante 6 (cl_abap_hmac)

DATA: lv_str TYPE string VALUE 'Teststring.'.
* string (4110 / UTF-8) -> xstring (binary)
DATA(lv_xstr) = cl_abap_hmac=>string_to_xstring( lv_str ).

WRITE: / lv_xstr.

Variante 7 (cl_clb_tools)

DATA: lv_str TYPE string VALUE 'Teststring.'.
* string -> xstring (binary) (UTF-8)
DATA(lv_xstr) = cl_clb_tools=>string_to_xstring( lv_str ).

WRITE: / lv_xstr.

[ABAP] Interne Tabelle mit Strings definieren

* Variante 1: unsortiert, ohne Schlüssel
DATA(it_names) = VALUE stringtab( ( |Horst| )
                                  ( |Udo| )
                                  ( |Heinz| ) ).

* Variante 2: sortiert, mit Schlüssel
TYPES: ty_sorted TYPE SORTED TABLE OF string WITH UNIQUE KEY table_line.

* strings dürfen nicht doppelt auftreten, sonst Duplicate-Key-Exception.
DATA(it_sorted) = VALUE ty_sorted( ( |Horst| )
                                   ( |Udo| )
                                   ( |Heinz| ) ).

[ABAP] Stringarray (interne Tabelle) zu einem String mit Separator verbinden (analog zu PHP implode)

Variante 1 (stringtab, Separator “;”)

DATA(it_strings) = VALUE stringtab( ( |Horst| )
                                    ( |Udo| )
                                    ( |Heinz| ) ).

DATA(ret) = concat_lines_of( table = it_strings sep = ';' ).

WRITE: / ret.

Variante 2 (stringtab, Separator ” “)

DATA(it_strings) = VALUE stringtab( ( |Horst| )
                                    ( |Udo| )
                                    ( |Heinz| ) ).

* Leerzeichen als Separator --> ' ' funktioniert nicht!
DATA(ret) = concat_lines_of( table = it_strings sep = | | ).

WRITE: / ret.

Variante 3 (TYPES)

TYPES: ty_names TYPE STANDARD TABLE OF string WITH EMPTY KEY.

START-OF-SELECTION.

  DATA(it_strings) = VALUE ty_names( ( |Horst| )
                                     ( |Udo| )
                                     ( |Heinz| ) ).

  DATA(ret) = concat_lines_of( table = it_strings sep = ';' ).

  WRITE: / ret.

[ABAP] string-Formatierungen mit String-Templates

* ab V7.31
* http://zevolving.com/2013/07/abap-string-templates-new-feature-in-abap-731/

* Hinweis: String-Templates funktionieren nur Programmen bei denen die Unicodeprüfung aktiv ist!
* Z.B. kommt es in Modulpool-Programmen zu Fehlern beim kompilieren des Codes und der Compiler moniert die '|'-Symbole

DATA: text TYPE string VALUE 'Text'.
DATA: atext TYPE string VALUE '012345'.
DATA: num TYPE p DECIMALS 3 VALUE '-123.45'.

* Case
WRITE: / |RAW:   { text CASE = RAW }|.   " Text
WRITE: / |LOWER: { text CASE = LOWER }|. " text
WRITE: / |UPPER: { text CASE = UPPER }|. " TEXT

* Align
WRITE: / |LEFT:   ->{ text WIDTH = 20 ALIGN = LEFT }<--|.   " >Text                <
WRITE: / |RIGHT:  ->{ text WIDTH = 20 ALIGN = RIGHT }<--|.  " >                Text<
WRITE: / |CENTER: ->{ text WIDTH = 20 ALIGN = CENTER }<--|. " >        Text        <

* Padding, Auffüllen mit definiertem Zeichen
WRITE: / |PAD: { text ALIGN = LEFT WIDTH = 20 PAD = '_' }|.   " Text________________
WRITE: / |PAD: { text ALIGN = RIGHT WIDTH = 20 PAD = '_' }|.  " ________________Text
WRITE: / |PAD: { text ALIGN = CENTER WIDTH = 20 PAD = '_' }|. " ________Text________

* führende Nullen hinzufügen, ersetzt FUBA 'CONVERSION_EXIT_ALPHA_INPUT'
WRITE: / |ALPHA: { atext WIDTH = 20 ALPHA = IN }|. " 00000000000000012345
* führende Nullen entfernen, ersetzt FUBA 'CONVERSION_EXIT_ALPHA_OUTPUT'
WRITE: / |ALPHA: { atext ALPHA = OUT }|.           " 12345

* Zahlen 1
WRITE: / |RAW:         { num NUMBER = RAW }|.         " -123.45
WRITE: / |USER:        { num NUMBER = USER }|.        " -123,45
WRITE: / |ENVIRONMENT: { num NUMBER = ENVIRONMENT }|. " -123,45

* Zahlen 2
WRITE: / |SCIENTIFIC:                   { num STYLE = SCIENTIFIC }|.                   " -1.2345E+02
WRITE: / |SCIENTIFIC_WITH_LEADING_ZERO: { num STYLE = SCIENTIFIC_WITH_LEADING_ZERO }|. " -0.12345E+03
WRITE: / |SCALE_PRESERVING_SCIENTIFIC:  { num STYLE = SCALE_PRESERVING_SCIENTIFIC }|.  " -1.2345E+0002
WRITE: / |ENGINEERING:                  { num STYLE = ENGINEERING }|.                  " -123.45E+00

* Datumsformat
WRITE: / |RAW:         { sy-datum DATE = RAW }|.         " 20160705
WRITE: / |ISO:         { sy-datum DATE = ISO }|.         " 2016-07-05
WRITE: / |USER:        { sy-datum DATE = USER }|.        " 05.07.2016
WRITE: / |ENVIRONMENT: { sy-datum DATE = ENVIRONMENT }|. " 05.07.2016

* Uhrzeitformat
WRITE: / |RAW:         { sy-uzeit TIME = RAW }|.         " 102336
WRITE: / |ISO:         { sy-uzeit TIME = ISO }|.         " 10:23:36
WRITE: / |USER:        { sy-uzeit TIME = USER }|.        " 10:23:36
WRITE: / |ENVIRONMENT: { sy-uzeit TIME = ENVIRONMENT }|. " 10:23:36

* Timestampformat
DATA: lv_tsl TYPE timestampl.
* Zeitstempel lang
GET TIME STAMP FIELD lv_tsl.
WRITE: / |SPACE:       { lv_tsl TIMESTAMP = SPACE }|.       " 2016-07-05 08:23:36.0908600
WRITE: / |ISO:         { lv_tsl TIMESTAMP = ISO }|.         " 2016-07-05T08:23:36,0908600
WRITE: / |USER:        { lv_tsl TIMESTAMP = USER }|.        " 05.07.2016 08:23:36,0908600
WRITE: / |ENVIRONMENT: { lv_tsl TIMESTAMP = ENVIRONMENT }|. " 05.07.2016 08:23:36,0908600

* ABAP Serialization XML (axXML)
WRITE: / |XML: { lv_tsl XSD = YES }|. " 20160705082336.09086