Dynamische Programmierung (ABAP)
Nachfolgend sind verschiedene Ausprägungen dynamischer Programmierung beschrieben.
Für eine statische Definition von Field-Symbols siehe Field-Symbols (ABAP)
Feldsymbole und Datenrefs
Dynamisch festgelegte Struktur
REPORT zmattdynprogwa.
DATA: gv_table_name TYPE string VALUE 'SCARR'.
" Datenreferenz erstellen. Diese kann auf einen typisierten oder
" untypisierten Datenspeicher zeigen. Hier: untypisiert.
DATA: gr_table_line TYPE REF TO data.
" Generisches Feldsymbol ohne Typisierung
FIELD-SYMBOLS: <gs_table_line> TYPE any.
" Reservieren von Hauptspeicher passend zum Typ der Datenreferenz.
CREATE DATA gr_table_line TYPE (gv_table_name).
" Da das Feldsymbol vom Type Any ist, muss im Assign der Zusatz
" Casting Type eingefügt werden, der das Feldsymbol typisiert.
ASSIGN gr_table_line->* TO <gs_table_line> CASTING TYPE (gv_table_name).
" SELECT SINGLE gibt genau eine Zeile für eine Struktur zurück
SELECT SINGLE * FROM (gv_table_name) INTO <gs_table_line>
WHERE mandt = '001' AND carrid = 'BA'.
WRITE <gs_table_line>.
Dynamisch festgelegte interne Tabelle
REPORT zmattdynprogitab.
PARAMETERS: pa_tab TYPE string.
" Untypisierte Datenreferenz
DATA: gr_table TYPE REF TO data.
" Generisches Feldsymbol für interne Tabelle
FIELD-SYMBOLS: <gt_table> TYPE table.
" Reservieren von Hauptspeicher für eine interne
" Tabelle passend zum Typ der Datenreferenz.
CREATE DATA gr_table TYPE TABLE OF (pa_tab).
ASSIGN gr_table->* TO <gt_table>.
SELECT * FROM (pa_tab) INTO TABLE <gt_table>.
Ausgabe der internen Tabelle z.B. mit einem ALV-Control.
RTTS / RTTI / RTTC
RTTS: Runtime Type Services → Bieten Services für RTTI und RTTC
RTTI: Runtime Type Identification → Typen von Variablen zur Laufzeit beschreiben
RTTC: Runtime Type Creation → Typen von Variablen zur Lautzeit erzeugen
Beispiel:
REPORT zmattdynprogitab2.
PARAMETERS: pa_tab TYPE string.
" Objektreferenz für Beschreibung des Zeilentyps per Strukturtyp
" Objektreferenz für Tabellenbeschreibung
" Untypisierte Datenreferenz ohne Speicherplatzreservierung
DATA: go_struct TYPE REF TO cl_abap_structdescr,
go_table TYPE REF TO cl_abap_tabledescr,
gr_table TYPE REF TO data.
" Generisches Feldsymbol für interne Tabelle
FIELD-SYMBOLS: <gt_table> TYPE table.
" RTTS: Erzeugung der Struktur des Zeilentypobjekts basierend
go_struct ?= cl_abap_structdescr=>describe_by_name( pa_tab ).
" RTTS: Erzeugung einer internen Tabelle / Tabellentypobjekt
" basierend auf dem Zeilentypobjekt
go_table = cl_abap_tabledescr=>create( go_struct ).
" Reservieren von Hauptspeicher passend zum Typ der Datenreferenz.
" TYPE HANDLE ermöglicht die Typisierung der Datenreferenz mit
" einem dynamisch erzeugten Typ.
CREATE DATA gr_table TYPE HANDLE go_table.
ASSIGN gr_table->* TO <gt_table>.
SELECT * FROM (pa_tab) INTO TABLE <gt_table>.
Ausgabe der internen Tabelle z.B. mit einem ALV-Control.
Dynamische Tokens
Dynamischer Typ
Ausdruck | Beschreibung |
---|---|
ASSIGN ... CASTING TYPE (typ) | Bei der Zuweisung einer Variable zu einem Feldsymbol kann der Typ mit einem Token angegeben werden. |
CREATE DATA ... TYPE (typ-token) | Typ der Datenreferenz angegeben als Token. |
Dynamische Komponente
REPORT zmattdynprogcomp.
DATA: gt_sflight TYPE TABLE OF sflight,
gs_sflight LIKE LINE OF gt_sflight,
gv_stru_comp TYPE string VALUE 'FLDATE'.
FIELD-SYMBOLS: <gs_stru_comp> TYPE any.
SELECT * FROM sflight INTO TABLE gt_sflight UP TO 10 ROWS.
LOOP AT gt_sflight INTO gs_sflight.
" Aus Struktur die Komponente lv_stru_comp lesen und Feldsymbol zuweisen.
ASSIGN COMPONENT gv_stru_comp OF STRUCTURE gs_sflight TO <gs_stru_comp>.
WRITE: <gs_stru_comp>.
ENDLOOP.
Dynamische Feldliste / Dynamische Bedingung
Ausdruck | Beschreibung |
---|---|
SELECT (feldliste) FROM ... | Liste von Spalten, die aus der Datenbanktabelle geholt werden sollen |
SELECT * FROM dbtab WHERE (Bedingungen-Liste)... | Dynamische Liste von Bedingungen |
REPORT zmattdynprogitabcol.
" Benutzereingabe: Ein oder mehrere Felder mit Leerzeichen getrennt.
PARAMETERS: pa_token TYPE c LENGTH 70.
DATA: gr_cx TYPE REF TO cx_root,
gt_fields TYPE stringtab,
gt_sbook TYPE TABLE OF sbook,
gv_message TYPE string.
" Liste mit Spaltennamen erstellen
APPEND pa_token TO gt_fields.
TRY.
SELECT (gt_fields)
FROM sbook
INTO CORRESPONDING FIELDS OF TABLE gt_sbook.
WRITE: / 'Insgesamt ', sy-dbcnt, ' Einträge gefunden'.
CATCH cx_sy_dynamic_osql_semantics cx_sy_open_sql_db
INTO gr_cx.
gv_message = gr_cx->get_text( ).
MESSAGE gv_message TYPE 'E'.
ENDTRY.
Werte aus Datenrefs abrufen
ASSIGN->* to <fieldref>
Sollte bei einzelnen Feldwerten klappen und auch bei Strukturen:
Abrufen aus einzelnen Variablen
REPORT z_reftodata_to_string.
field-symbols: <lv_low> type string.
DATA: lr_data TYPE REF TO data,
lv_low TYPE sstring,
lt_range TYPE rrrange.
START-OF-SELECTION.
create data lr_data type string.
assign lr_data->* to <lv_low>.
lv_low = <lv_low>.
write: 'Ergebnis ', lv_low.
Abrufen aus Feldern eine Tabelle
Der Wert lt_rangepsp-low soll gefüllt werden, aus der Tabelle it_change_log, die dynamisch typisiert ist und an die Methode übergeben wird. Ihr Typ ist also zum Zeitpunkt der Programmierung nicht bekannt.
FIELD-SYMBOLS: <it_change_log> TYPE fpmgb_s_changelog,
<lv_low> TYPE /bic/oizpspe.
DATA: lt_rangepsp TYPE TABLE OF rrrange,
lr_data TYPE REF TO data,
lv_string TYPE sstring.
LOOP AT it_change_log ASSIGNING <it_change_log> WHERE name = 'ZPSPE_K'.
CREATE DATA lr_data TYPE /bic/oizpspe.
lr_data = <it_change_log>-new_value.
ASSIGN lr_data->* TO <lv_low>.
lv_string = <lv_low>.
APPEND VALUE rrrange( sign = 'I'
opt = 'EQ'
low = lv_string ) TO lt_rangepsp.
ENDLOOP.