[ABAP] Transienter Code / Dynamisch ABAP-Code generieren und ausführen

DATA: progname TYPE program.
DATA: msg TYPE string.
DATA: lin TYPE i.
DATA: wrd TYPE string.
DATA: off TYPE i.
DATA: mid TYPE trmsg_key.
DATA: sid TYPE string.

DATA(it_code) = VALUE stringtab( ( |PROGRAM SUBPOOL.| )
                                 ( |CLASS main DEFINITION.| )
                                 ( |  PUBLIC SECTION.| )
                                 ( |    CLASS-METHODS show| )
                                 ( |      IMPORTING| )
                                 ( |        i_txt TYPE string| )
                                 ( |      RETURNING VALUE(ret_val) TYPE string.| )
                                 ( |ENDCLASS.| )
                                 ( |CLASS main IMPLEMENTATION.| )
                                 ( |  METHOD show.| )
                                 ( |    WRITE: / i_txt.| )
                                 ( |    ret_val = \|\{ i_txt \} - Return value.\|.| )
                                 ( |  ENDMETHOD.| )
                                 ( |ENDCLASS.| ) ).

* Subroutinen-Pool im ABAP-Speicher des akt. Programms erzeugen
* it_code wird übergeben, Programmname wird temporär vom System vergeben
GENERATE SUBROUTINE POOL it_code NAME progname MESSAGE msg LINE lin WORD wrd OFFSET off MESSAGE-ID mid SHORTDUMP-ID sid.

CASE sy-subrc.
  WHEN 0. " ok
    TRY.
* dynamischen Klassennamen ermitteln
        DATA(lv_class) = |\\PROGRAM={ progname }\\CLASS=MAIN|.
        DATA: ret TYPE string.

        WRITE: / 'Programm:', progname.
        WRITE: / 'Class:', lv_class.
        SKIP.

* statischer Methodenaufruf
        CALL METHOD (lv_class)=>show
          EXPORTING
            i_txt   = 'Static call'
          RECEIVING
            ret_val = ret.

        WRITE: / ret.

* dynamischer Methodenaufruf
        DATA o_ref TYPE REF TO object.
        CREATE OBJECT o_ref TYPE (lv_class).
        CALL METHOD o_ref->('SHOW')
          EXPORTING
            i_txt   = 'Dynamic call'
          RECEIVING
            ret_val = ret.

        WRITE: / ret.

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

  WHEN 4. " Syntaxfehler
    WRITE: / msg.
  WHEN 8. " Laufzeitfehler
    WRITE: / sid.
  WHEN OTHERS.
    MESSAGE 'Unbekannter Fehler.' TYPE 'I'.
ENDCASE.

Weiterführende Infos: Link

[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] Strings aufsplitten (analog zu PHP explode)

Variante 1 (beliebige Anzahl Splitelemente)

DATA: lv_satz TYPE string VALUE 'Horst;Udo;Heinz;Ede'.
DATA(it_elem) = VALUE stringtab( ).

SPLIT lv_satz AT ';' INTO TABLE it_elem.

Variante 2 (vordefinierte Anzahl Splitelemente)

DATA: lv_satz TYPE string VALUE 'abc,def,ghi'.
DATA: t11 TYPE string.
DATA: t22 TYPE string.
DATA: t33 TYPE string.
  
SPLIT satz AT ',' INTO t11 t22 t33.

WRITE: / t11, t22, t33.