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_string enthält den lw_name_as_string als String.
  • Wenn der Typ nicht gefunden wurde, wird eine Ausnahme vom Typ CX_SY_CREATE_DATA_ERROR ausgelö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

  • obj kann mit dem R un T ime T yp S ervice erstellt werden
  • da dref noch 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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow