Dynamische Programmierung (ABAP): Unterschied zwischen den Versionen

Aus MattWiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(20 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
== Zur Laufzeit festgelegte Struktur ==
Nachfolgend sind verschiedene Ausprägungen dynamischer Programmierung beschrieben.


Für Definition von Field-Symbols zur Datenspeicherung und zum Abrufen von Daten aus untypisierten Variablen siehe [[Field-Symbols (ABAP)]]
Lesen eines InfoProviders: [[InfoProvider lesen (ABAP)]]
== Feldsymbole und Datenrefs ==
=== Dynamisch festgelegte Struktur ===
<syntaxhighlight lang="abap">
<syntaxhighlight lang="abap">
REPORT zmattdynprogwa.
REPORT zmattdynprogwa.


DATA: lv_table_name TYPE string VALUE 'SCARR'.
DATA: gv_table_name TYPE string VALUE 'SCARR'.


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


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


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


" Da das Feldsymbol vom Type Any ist, muss im Assign der Zusatz
" Da das Feldsymbol vom Type Any ist, muss im Assign der Zusatz
" Casting Type eingefügt werden, der das Feldsymbol typisiert.
" Casting Type eingefügt werden, der das Feldsymbol typisiert.
ASSIGN lr_table_line->* TO <ls_table_line> CASTING TYPE (lv_table_name).
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 gibt genau eine Zeile für eine Struktur zurück
SELECT SINGLE * FROM (lv_table_name) INTO <ls_table_line>
SELECT SINGLE * FROM (gv_table_name) INTO <gs_table_line>
   WHERE mandt = '001' AND carrid = 'BA'.
   WHERE mandt = '001' AND carrid = 'BA'.


WRITE <ls_table_line>.
WRITE <gs_table_line>.
</syntaxhighlight>
</syntaxhighlight>


== Zur Laufzeit festgelegte interner Tabelle ==
=== Dynamisch festgelegte interne Tabelle ===


<syntaxhighlight lang="abap">
<syntaxhighlight lang="abap">
Zeile 35: Zeile 41:


" Untypisierte Datenreferenz
" Untypisierte Datenreferenz
DATA: lr_table TYPE REF TO data.
DATA: gr_table TYPE REF TO data.


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


" Reservieren von Hauptspeicher für eine interne
" Reservieren von Hauptspeicher für eine interne
" Tabelle passend zum Typ der Datenreferenz.
" Tabelle passend zum Typ der Datenreferenz.
CREATE DATA lr_table TYPE TABLE OF (pa_tab).
CREATE DATA gr_table TYPE TABLE OF (pa_tab).
 
ASSIGN gr_table->* TO <gt_table>.
 
SELECT * FROM (pa_tab) INTO TABLE <gt_table>.
</syntaxhighlight>
Ausgabe der internen Tabelle z.B. mit einem [[ALV-Control_(ABAP)|ALV-Control]].
 
== RTTS / RTTI / RTTC ==
'''RTTS''': Runtime Type Services &rarr; Bieten Services für RTTI und RTTC
 
'''RTTI''': Runtime Type Identification &rarr; Typen von Variablen zur Laufzeit beschreiben
 
'''RTTC''': Runtime Type Creation &rarr; Typen von Variablen zur Lautzeit erzeugen
 
'''''Beispiel''''':
 
<syntaxhighlight lang="abap">
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>.
</syntaxhighlight>
Ausgabe der internen Tabelle z.B. mit einem [[ALV-Control_(ABAP)|ALV-Control]].
 
== Dynamische Tokens ==
=== Dynamischer Typ ===
{| class="wikitable"
!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 ===
<syntaxhighlight lang="abap">
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.
</syntaxhighlight>
 
=== Dynamische Feldliste / Dynamische Bedingung ===
{| class="wikitable"
!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
|}
 
<syntaxhighlight lang="abap">
REPORT zmattdynprogitabcol.


ASSIGN lr_table->* TO <lt_table>.
" Benutzereingabe: Ein oder mehrere Felder mit Leerzeichen getrennt.
PARAMETERS: pa_token TYPE c LENGTH 70.


SELECT * FROM (pa_tab) INTO TABLE <lt_table>.
DATA: gr_cx TYPE REF TO cx_root,
      gt_fields TYPE stringtab,
      gt_sbook TYPE TABLE OF sbook,
      gv_message TYPE string.


DATA: lr_alv TYPE REF TO cl_salv_table.
" Liste mit Spaltennamen erstellen
APPEND pa_token TO gt_fields.


cl_salv_table=>factory(
TRY.
  IMPORTING
    SELECT (gt_fields)
     r_salv_table = lr_alv
      FROM sbook
   CHANGING
      INTO CORRESPONDING FIELDS OF TABLE gt_sbook.
     t_table = <lt_table> ).
     WRITE: / 'Insgesamt ', sy-dbcnt, ' Einträge gefunden'.
   CATCH cx_sy_dynamic_osql_semantics cx_sy_open_sql_db
     INTO gr_cx.


lr_alv->display( ).
    gv_message = gr_cx->get_text( ).
    MESSAGE gv_message TYPE 'E'.
ENDTRY.
</syntaxhighlight>
</syntaxhighlight>


[[Category:ABAP]]
[[Category:ABAP]]

Aktuelle Version vom 24. Juli 2019, 13:12 Uhr

Nachfolgend sind verschiedene Ausprägungen dynamischer Programmierung beschrieben.

Für Definition von Field-Symbols zur Datenspeicherung und zum Abrufen von Daten aus untypisierten Variablen siehe Field-Symbols (ABAP)

Lesen eines InfoProviders: InfoProvider lesen (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.