Dynamische Programmierung (ABAP): Unterschied zwischen den Versionen

Aus MattWiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 2: Zeile 2:


Für eine statische Definition von Field-Symbols siehe [[Field-Symbols (ABAP)]]
Für eine statische Definition von Field-Symbols siehe [[Field-Symbols (ABAP)]]
Lesen eines InfoProviders: [[InfoProvider lesen (ABAP)]]


== Feldsymbole und Datenrefs ==
== Feldsymbole und Datenrefs ==

Version vom 17. Juni 2019, 15:32 Uhr

Nachfolgend sind verschiedene Ausprägungen dynamischer Programmierung beschrieben.

Für eine statische Definition von Field-Symbols 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.


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.