Dynamische Programmierung (ABAP)

Aus MattWiki

Nachfolgend sind verschiedene Ausprägungen dynamischer Programmierung beschrieben.

Feldsymbole und Datenrefs

Dynamisch festgelegte Struktur

REPORT zmattdynprogwa.

DATA: lv_table_name TYPE string VALUE 'SCARR'.

" Datenreferenz erstellen. Diese kann auf einen typisierten oder
" untypisierten Datenspeicher zeigen. Hier: untypisiert.
DATA: lr_table_line TYPE REF TO data.

" Generisches Feldsymbol ohne initiale Typisierung
FIELD-SYMBOLS: <ls_table_line> TYPE any.

" Reservieren von Hauptspeicher passend zum Typ der Datenreferenz.
CREATE DATA lr_table_line TYPE (lv_table_name).

" Da das Feldsymbol vom Type Any ist, muss im Assign der Zusatz
" Casting Type eingefügt werden, der das Feldsymbol typisiert.
ASSIGN lr_table_line->* TO <ls_table_line> CASTING TYPE (lv_table_name).

" SELECT SINGLE gibt genau eine Zeile für eine Struktur zurück
SELECT SINGLE * FROM (lv_table_name) INTO <ls_table_line>
  WHERE mandt = '001' AND carrid = 'BA'.

WRITE <ls_table_line>.

Dynamisch festgelegte interne Tabelle

REPORT zmattdynprogitab.

PARAMETERS: pa_tab TYPE string.

" Untypisierte Datenreferenz
DATA: lr_table TYPE REF TO data.

" Generisches Feldsymbol für interne Tabelle
FIELD-SYMBOLS: <lt_table> TYPE table.

" Reservieren von Hauptspeicher für eine interne
" Tabelle passend zum Typ der Datenreferenz.
CREATE DATA lr_table TYPE TABLE OF (pa_tab).

ASSIGN lr_table->* TO <lt_table>.

SELECT * FROM (pa_tab) INTO TABLE <lt_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: lo_struct TYPE REF TO cl_abap_structdescr,
      lo_table TYPE REF TO cl_abap_tabledescr,
      lr_table TYPE REF TO data.

" Generisches Feldsymbol für interne Tabelle
FIELD-SYMBOLS: <lt_table> TYPE table.

" RTTS: Erzeugung der Struktur des Zeilentypobjekts basierend
lo_struct ?= cl_abap_structdescr=>describe_by_name( pa_tab ).

" RTTS: Erzeugung einer internen Tabelle / Tabellentypobjekt
" basierend auf dem Zeilentypobjekt
lo_table = cl_abap_tabledescr=>create( lo_struct ).

" Reservieren von Hauptspeicher passend zum Typ der Datenreferenz.
" TYPE HANDLE ermöglicht die Typisierung der Datenreferenz mit
" einem dynamisch erzeugten Typ.
CREATE DATA lr_table TYPE HANDLE lo_table.

ASSIGN lr_table->* TO <lt_table>.

SELECT * FROM (pa_tab) INTO TABLE <lt_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: lt_sflight TYPE TABLE OF sflight,
      ls_sflight LIKE LINE OF lt_sflight,
      lv_stru_comp TYPE string VALUE 'FLDATE'.

FIELD-SYMBOLS: <ls_stru_comp> TYPE any.

SELECT * FROM sflight INTO TABLE lt_sflight UP TO 10 ROWS.

LOOP AT lt_sflight INTO ls_sflight.
  " Aus Struktur die Komponente lv_stru_comp lesen und Feldsymbol zuweisen.
  ASSIGN COMPONENT lv_stru_comp OF STRUCTURE ls_sflight TO <ls_stru_comp>.
  WRITE: <ls_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: lr_cx TYPE REF TO cx_root,
      lt_fields TYPE stringtab,
      lt_sbook TYPE TABLE OF sbook,
      lv_message TYPE string.

" Liste mit Spaltennamen erstellen
APPEND pa_token TO lt_fields.

TRY.
    SELECT (lt_fields)
      FROM sbook
      INTO CORRESPONDING FIELDS OF TABLE lt_sbook.
    WRITE: / 'Insgesamt ', sy-dbcnt, ' Einträge gefunden'.
  CATCH cx_sy_dynamic_osql_semantics cx_sy_open_sql_db
    INTO lr_cx.

    lv_message = lr_cx->get_text( ).
    MESSAGE lv_message TYPE 'E'.
ENDTRY.