Dynamische Programmierung (ABAP): Unterschied zwischen den Versionen
Aus MattWiki
Matt (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Matt (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
Zeile 126: | Zeile 126: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Dynamische Feldliste === | === Dynamische Feldliste / Dynamische Bedingung === | ||
{| class="wikitable" | {| class="wikitable" | ||
!Ausdruck | !Ausdruck | ||
Zeile 133: | Zeile 133: | ||
|SELECT (feldliste) FROM ... | |SELECT (feldliste) FROM ... | ||
|Liste von Spalten, die aus der Datenbanktabelle geholt werden sollen | |Liste von Spalten, die aus der Datenbanktabelle geholt werden sollen | ||
|- | |- | ||
|SELECT * FROM dbtab WHERE (Bedingungen-Liste)... | |SELECT * FROM dbtab WHERE (Bedingungen-Liste)... | ||
|Dynamische Liste von Bedingungen | |Dynamische Liste von Bedingungen | ||
|} | |} | ||
<syntaxhighlight lang="abap"> | |||
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 UP TO 10 ROWS. | |||
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. | |||
</syntaxhighlight> | |||
[[Category:ABAP]] | [[Category:ABAP]] |
Version vom 2. April 2018, 21:43 Uhr
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 UP TO 10 ROWS.
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.