ABAP
Dynamische Programmierung
Suche…
Feldsymbole
Feldsymbole sind ABAPs Äquivalent zu Zeigern, außer dass Feldsymbole immer dereferenziert werden (es ist nicht möglich, die tatsächliche Adresse im Speicher zu ändern).
Erklärung
Um ein FIELD-SYMBOLS zu FIELD-SYMBOLS muss das Schlüsselwort FIELD-SYMBOLS verwendet werden. Typen können generisch sein ( ANY [... TABLE] ), um eine Vielzahl von Variablen zu verarbeiten.
FIELD-SYMBOLS: <fs_line> TYPE any, "generic
<fs_struct> TYPE kna1. "non-generic
Zuweisung
Feldsymbole werden bei der Deklaration unassigned , unassigned sie zeigen auf nichts. Der Zugriff auf ein nicht zugewiesenes Feldsymbol führt zu einer Ausnahme und, falls nicht abgerufen, zu einem kurzen Speicherauszug. Daher sollte der Zustand mit IS ASSIGNED überprüft werden:
IF <fs> IS ASSIGNED.
*... symbol is assigned
ENDIF.
Da es sich nur um Referenzen handelt, können keine echten Daten darin gespeichert werden. Daher sind deklarierte DATA in jedem Anwendungsfall erforderlich.
DATA: w_name TYPE string VALUE `Max`,
w_index TYPE i VALUE 1.
FIELD-SYMBOLS <fs_name> TYPE any.
ASSIGN w_name TO <fs_name>. "<fs_name> now gets w_name
<fs_name> = 'Manni'. "Changes to <fs_name> now also affect w_name
* As <fs_name> is generic, it can also be used for numbers
ASSIGN w_index TO <fs_name>. "<fs_name> now refers to w_index.
ADD 1 TO <fs_name>. "w_index gets incremented by one
Zuordnung aufheben
Manchmal kann es nützlich sein, ein Feldsymbol zurückzusetzen. Dies kann mit UNASSIGN .
UNASSIGN <fs>.
* Access on <fs> now leads to an exception again
Verwenden Sie für interne Tabellen
Feldsymbole können verwendet werden, um interne Tabellen zu ändern.
LOOP AT itab INTO DATA(wa).
* Only modifies wa_line
wa-name1 = 'Max'.
ENDLOOP.
LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>).
* Directly refers to a line of itab and modifies its values
<fs>-name1 = 'Max'.
ENDLOOP.
Beachtung! Feldsymbole bleiben auch nach Verlassen der Schleife zugewiesen. Wenn Sie sie sicher wiederverwenden möchten, heben Sie die Zuweisung sofort auf.
Datenreferenzen
Für Datenreferenzen ist der Zusatz REF TO nach TYPE .
Dynamische Erstellung von Strukturen
Wenn der Typ einer Struktur zur Laufzeit festgelegt werden soll, können wir unsere Zielstruktur als Referenz auf die generischen data .
DATA wa TYPE REF TO data.
Um wa einen Typ zu geben, verwenden wir die Anweisung CREATE DATA . Der Zusatz TYPE kann angegeben werden durch:
Referenz:
CREATE DATA wa TYPE kna1
- Statische Prüfungen sind aktiv, daher ist es nicht möglich, einen unbekannten Typ zu erstellen
Name:
CREATE DATA wa TYPE (lw_name_as_string)
- Die Klammern werden benötigt und
lw_name_as_stringenthält denlw_name_as_stringals String.- Wenn der Typ nicht gefunden wurde, wird eine Ausnahme vom Typ
CX_SY_CREATE_DATA_ERRORausgelöst
Für das Instanziieren von dynamisch erstellten Typen kann der Zusatz HANDLE angegeben werden. HANDLE erhält ein Objekt, das von CL_ABAP_DATADESCR erbt.
CREATE DATA dref TYPE HANDLE obj
objkann mit dem R un T ime T yp S ervice erstellt werden- da
drefnoch eine Datenreferenz ist, muss es dereferenziert werden (->*), um als Datencontainer verwendet zu werden (normalerweise über Feldsymbole)
RunTime Type Services
RunTime Type Services ( kurz: RTTS ) werden verwendet für:
- Typen erstellen (RunTime Type Creation; kurz: RTTC )
- Typen analysieren (RunTime Type Identification; kurz: RTTI )
Klassen
CL_ABAP_TYPEDESCR
|
|--CL_ABAP_DATADESCR
| |
| |--CL_ABAP_ELEMDESCR
| |--CL_ABAP_REFDESCR
| |--CL_ABAP_COMPLEXDESCR
| |
| |--CL_ABAP_STRUCTDESCR
| |--CL_ABAP_TABLEDESCR
|
|--CL_ABAP_OBJECTDESCR
|
|--CL_ABAP_CLASSDESCR
|--CL_ABAP_INTFDESCR
CL_ABAP_TYPEDESCR ist die Basisklasse. Es implementiert die erforderlichen Methoden zur Beschreibung:
-
DESCRIBE_BY_DATA -
DESCRIBE_BY_NAME -
DESCRIBE_BY_OBJECT_REF -
DESCRIBE_BY_DATA_REF