[ABAP] RTTS: Interne Tabelle dynamisch erzeugen

Variante 1 (aus DDIC-Struktur)

TRY.
* Strukturdeskriptor für Komponenten (Spalten) der Tabelle anhand einer vorhandenen Struktur erzeugen
    DATA(o_struct_desc) = cl_abap_structdescr=>describe_by_name( 'SFLIGHTS' ).

* Tabellendeskriptor
    DATA(o_table_desc) = cl_abap_tabledescr=>create(
                                                     p_line_type  = CAST #( o_struct_desc )           " Spalten
                                                     p_table_kind = cl_abap_tabledescr=>tablekind_std " Tabellentyp STANDARD TABLE
                                                     p_unique     = abap_false                        " NON-UNIQUE KEY
                                                   ).

* Tabellenobjekt anhand des Tabellendeskriptors erstellen
    DATA: o_table TYPE REF TO data.
    CREATE DATA o_table TYPE HANDLE o_table_desc.

* Feldsymbol auf das Tabellenobjekt
    FIELD-SYMBOLS <table> TYPE ANY TABLE.
    ASSIGN o_table->* TO <table>.

* Daten holen und in Feldsymbol schreiben
    SELECT carrid, connid, carrname, fldate FROM sflights INTO CORRESPONDING FIELDS OF TABLE @<table>.

* Datenausgabe
    cl_demo_output=>display( <table> ).

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

Variante 2 (eigene Strukturkomponenten)

TRY.
* Dummy für Datadescriptor
    DATA: lv_fldate TYPE sflights-fldate.

* Komponenten (Spalten) der Tabelle
    DATA(it_components) = VALUE cl_abap_structdescr=>component_table(
* Erzeugung über direkte Typangabe, abgeleitet aus dem Typ des eigentlichen Datenelements
* CHAR 3
                                                                      (
                                                                        name = 'CARRID'
                                                                        type = cl_abap_elemdescr=>get_c( 3 ) " S_CARR_ID
                                                                      )
* NUMC 4
                                                                      (
                                                                        name = 'CONNID'
                                                                        type = cl_abap_elemdescr=>get_n( 4 ) " S_CONN_ID
                                                                      )
* Erzeugung über Namen des Datenelements
                                                                      (
                                                                        name = 'CARRNAME'
                                                                        type = CAST #( cl_abap_elemdescr=>describe_by_name( 'S_CARRNAME' ) )
                                                                      )
* Erzeugung über Dummy-Datenobjekt
                                                                      (
                                                                        name = 'FLDATE'
                                                                        type = cast #( cl_abap_datadescr=>describe_by_data( lv_fldate ) )
                                                                      )
                                                                    ).

* Strukturdeskriptor für Komponententabelle
    DATA(o_struct_desc) = cl_abap_structdescr=>create( it_components ).

* Tabellendeskriptor
    DATA(o_table_desc) = cl_abap_tabledescr=>create(
                                                     p_line_type  = o_struct_desc                       " Spalten
                                                     p_table_kind = cl_abap_tabledescr=>tablekind_std   " Tabellentyp STANDARD TABLE
                                                     p_unique     = abap_false                          " NON-UNIQUE KEY
                                                     p_key        = VALUE #(                            " CARRID, CONNID als KEY
                                                                             ( name = 'CARRID' )
                                                                             ( name = 'CONNID' )
                                                                           )
                                                     p_key_kind   = cl_abap_tabledescr=>keydefkind_user " Benutzerdefinierter Schlüssel
                                                   ).

* Tabellenobjekt anhand des Tabellendeskriptors erstellen
    DATA: o_table TYPE REF TO data.
    CREATE DATA o_table TYPE HANDLE o_table_desc.

* Feldsymbol auf das Tabellenobjekt
    FIELD-SYMBOLS <table> TYPE ANY TABLE.
    ASSIGN o_table->* TO <table>.

* Daten holen und in Feldsymbol schreiben
    SELECT carrid, connid, carrname, fldate FROM sflights INTO CORRESPONDING FIELDS OF TABLE @<table>.

* Datenausgabe
    cl_demo_output=>display( <table> ).

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

[ABAP] RTTS / RTTI: Beispiele für dynamische Typ- und Objekterzeugung

* dynamisch einen Typ char40 erzeugen
DATA(o_type_char40) = cl_abap_elemdescr=>get_c( 40 ).
* dynamisch einen Typ string erzeugen
DATA(o_type_string) = cl_abap_elemdescr=>get_string( ).
* dynamisch einen Typ i erzeugen
DATA(o_type_int) = cl_abap_elemdescr=>get_i( ).
* dynamisch einen Typ decfloat34 erzeugen
DATA(o_type_d34) = cl_abap_elemdescr=>get_decfloat34( ).

* Referenz auf Objekt vom Typ char40 erzeugen
DATA: o_ref_char40 TYPE REF TO data.
CREATE DATA o_ref_char40 TYPE HANDLE o_type_char40.

* Referenz auf Objekt vom Typ string erzeugen
DATA: o_ref_string TYPE REF TO data.
CREATE DATA o_ref_string TYPE HANDLE o_type_string.

* Referenz auf Objekt vom Typ i erzeugen
DATA: o_ref_int TYPE REF TO data.
CREATE DATA o_ref_int TYPE HANDLE o_type_int.

* Referenz auf Objekt vom Typ i erzeugen
DATA: o_ref_d34 TYPE REF TO data.
CREATE DATA o_ref_d34 TYPE HANDLE o_type_d34.

* Referenz einem Feldsymbol zuweisen
ASSIGN o_ref_char40->* TO FIELD-SYMBOL(<char40>).
ASSIGN o_ref_string->* TO FIELD-SYMBOL(<string>).
ASSIGN o_ref_int->* TO FIELD-SYMBOL(<int>).
ASSIGN o_ref_d34->* TO FIELD-SYMBOL(<d34>).

* Wert auf Feldsymbol schreiben
<char40> = 'char40'.
<string> = 'string'.
<int> = 1.
<d34> = '3.1415926535'.

WRITE: / <char40>.
WRITE: / <string>.
WRITE: / <int>.
WRITE: / <d34>.