Ansicht
Dokumentation

ABENDYN_ACCESS_DATA_OBJ_GUIDL - DYN ACCESS DATA OBJ GUIDL

ABENDYN_ACCESS_DATA_OBJ_GUIDL - DYN ACCESS DATA OBJ GUIDL

General Material Data   TXBHW - Original Tax Base Amount in Local Currency  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

Dynamischer Zugriff auf Datenobjekte

Zum Zugriff auf Datenobjekte, deren Namen und Eigenschaften erst zur Laufzeit bekannt sind, dienen Feldsymbole und Datenreferenzen.

  • Feldsymbole
Ein Feldsymbol ist ein mit FIELD-SYMBOLS deklarierter symbolischer Name für ein Datenobjekt, dem mit der Anweisung ASSIGN oder bei der Verarbeitung interner Tabellen mit dem Zusatz ASSIGNING Speicherbereiche zugewiesen werden können. Ein Feldsymbol ist entweder generisch oder vollständig typisiert und kann an allen passenden Operandenpositionen wie ein Datenobjekt verwendet werden. Für die Typisierung gelten die gleichen Regeln wie für Formalparameter von Prozeduren. Beim Zugriff auf Feldsymbole gilt die Wertesemantik, bei der direkt der zugeordnete Speicherinhalt adressiert wird. Feldsymbole werden damit immer wie dereferenzierte Zeiger behandelt.
  • Datenreferenzen
Eine Datenreferenz ist der Inhalt einer mit REF TO deklarierten Datenreferenzvariablen, die auf beliebige Datenobjekte oder Teile von Datenobjekten zeigen kann. Datenreferenzen werden zum einen für die Erzeugung anonymer Datenobjekte mit CREATE DATA bzw. NEW benötigt; zum anderen können sie über die Anweisung GET REFERENCE, dem Referenzierungsoperator REF oder bei der Verarbeitung interner Tabellen mit dem Zusatz REFERENCE INTO für existierende Datenobjekte erzeugt werden. Eine Datenreferenzvariable ist entweder vollständig generisch oder vollständig typisiert. Beim Zugriff auf Datenreferenzvariablen gilt die Referenzsemantik, bei der die Datenreferenz selbst adressiert wird. Um auf den referenzierten Speicherinhalt zuzugreifen, muss eine Datenreferenzvariable explizit mit dem Dereferenzierungsoperator (->*) dereferenziert werden.

Feldsymbole und Datenreferenzen hängen dadurch eng zusammen, dass nur vollständig typisierte Datenreferenzvariablen an beliebigen Operandenpositionen dereferenziert werden können. Für vollständig generische Datenreferenzvariablen (REF TO data) ist die Dereferenzierung nur in der Anweisung ASSIGN möglich.

Datenreferenzvariablen können in den gleichen Kontexten deklariert werden wie alle Datenobjekte, insbesondere auch als Attribute von Klassen. Feldsymbole können hingegen nur innerhalb von Prozeduren (Methoden) oder im globalen Deklarationsteil deklariert werden, wobei Letzteres aber nicht mehr erlaubt ist.

Feldsymbole und Datenreferenzen geeignet einsetzen

Setzen Sie Feldsymbole und Datenreferenzen für den Verwendungszweck ein, der am besten zu ihrer Semantik passt:

  • Feldsymbole für Wertezugriffe (Wertesemantik)
  • Datenreferenzen für Referenzübergaben (Referenzsemantik)

Feldsymbole und Datenreferenzen sind beide als Zeiger auf Speicherbereiche zu verstehen. Der hauptsächliche Unterschied besteht in der unterschiedlichen Semantik beim Zugriff.

  • Feldsymbole sind aufgrund ihrer Wertesemantik immer dann zu verwenden, wenn das Hauptaugenmerk auf dem Zugriff auf die referenzierten Daten liegt. Hierfür bieten Feldsymbole folgende besondere Funktionalitäten, die für Datenreferenzen nicht zur Verfügung stehen:
  • dynamischer Zugriff auf Attribute von Klassen und Objekten

ASSIGN (class_name)=>(attr_name) ...
ASSIGN oref->(attr_name) ...
  • dynamischer Zugriff auf Strukturkomponenten

ASSIGN ... COMPONENT ...
  • explizites Casting

ASSIGN ... CASTING ...
  • Dereferenzierung von generischen Datenreferenzvariablen

ASSIGN dref->* ...
  • Datenreferenzen sind aufgrund ihrer Referenzsemantik immer dann zu verwenden, wenn das Hauptaugenmerk auf dem expliziten Umgang mit Referenzen auf Datenobjekte liegt. Für die Erzeugung anonymer Datenobjekte oder komplexer dynamischer Datenstrukturen, wie beispielsweise Bäume oder verkettete Listen in der internen Sitzung oder auch im Shared Objects Memory, sind Datenreferenzen unerlässlich. Darüber hinaus sind Datenreferenzen das Mittel der Wahl, um ein explizites Sharing zwischen beliebigen Datenobjekten zu verwirklichen und um Zeiger auf Datenobjekte an Prozeduren zu übergeben.

Hinweis

Eigentlich fügt sich der Gebrauch von Datenreferenzvariablen besser in Programme ein, die auf ABAP Objects basieren, da sie die gleiche Semantik aufweisen wie Objektreferenzvariablen und so gesehen das modernere Programmierkonzept repräsentieren. Feldsymbole weisen dagegen immer noch einen größeren Funktionsumfang als Datenreferenzen auf und können daher nicht in jedem Fall durch eine solche ersetzt werden. Aus diesem Grund wird der Gebrauch von Feldsymbolen für dynamische Zugriffe auf Datenobjekte weiterhin empfohlen, obwohl aus Gründen der Einheitlichkeit und der Einfachheit eigentlich der alleinige Gebrauch von Datenreferenzen wünschenswert wäre.

Folgender Quelltext zeigt eine Schleife über eine interne Tabelle, in direkt auf die aktuelle Zeile zugegriffen werden soll. Wird dafür eine generische Datenreferenzvariable verwendet, ist zusätzlich ein Feldsymbol für deren Dereferenzierung nötig.

METHOD some_method.
  "IMPORTING i_itab TYPE INDEX TABLE
  DATA dref TYPE REF TO data.
  FIELD-SYMBOLS <fs> TYPE data.
  ...
  LOOP AT i_itab REFERENCE INTO dref.
    ASSIGN dref->* TO <fs>.
    <fs> = ...
  ENDLOOP.
  ...
ENDMETHOD.

Folgender Quelltext vereinfacht obiges Beispiel dahin gehend, dass das zum Zugriff auf eine Tabellenzeile ohnehin notwendige Feldsymbol direkt und ohne Umweg über eine Datenreferenz verwendet wird. Die direkte Verwendung des Feldsymbols verwirklicht damit auch das KISS-Prinzip.

METHOD some_method.
  "IMPORTING i_itab TYPE INDEX TABLE
  FIELD-SYMBOLS <fs> TYPE data.
  ...
  LOOP AT i_itab ASSIGNING <fs>.
    <fs> = ...
  ENDLOOP.
...
ENDMETHOD.






Addresses (Business Address Services)   CL_GUI_FRONTEND_SERVICES - Frontend Services  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 8007 Date: 20240523 Time: 183437     sap01-206 ( 119 ms )