Ansicht
Dokumentation

ABAPASSIGN_MEM_AREA_DYNAMIC_DOBJ - ASSIGN MEM AREA DYNAMIC DOBJ

ABAPASSIGN_MEM_AREA_DYNAMIC_DOBJ - ASSIGN MEM AREA DYNAMIC DOBJ

BAL Application Log Documentation   General Material Data  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

ASSIGN, dynamic_dobj

Kurzreferenz



... ${ (name) $}
  $| ${ dref->* $}
  $| ${ dobj INCREMENT inc $} ...

Alternativen:

1. ... (name)

2. ... dref->*

3. ... dobj INCREMENT inc

Wirkung

Diese Alternativen der dynamischen Angabe des Speicherbereichs mem_area der Anweisung ASSIGN dienen dem dynamischen Zugriff auf Datenobjekte.

Bei einer Inline-Deklaration des Feldsymbols mit FIELD-SYMBOL(<fs>) erfolgt dessen Typisierung mit dem generischen Typ data.

Bei diesen Varianten setzt die Anweisung ASSIGN den Rückgabewert sy-subrc. Wenn die Zuweisung erfolgreich ist, wird sy-subrc auf 0, ansonsten auf 4 gesetzt. Bei nicht erfolgreicher Zuweisung behält das Feldsymbol den vorhergehenden Zustand. Die Auswertung des Prädikatausdrucks <fs> IS ASSIGNED ist beim dynamischen ASSIGN also nicht ausreichend, sondern es muss sy-subrc überprüft werden.

Alternative 1

... (name)


Wirkung

Bei dieser dynamischen Variante von mem_area, wird der Speicherbereich nicht direkt, sondern als Inhalt eines eingeklammerten zeichenartigen Datenobjekts (name) angegeben. Es können folgende Angaben für name unterschieden werden:

  • Literal oder Konstante
Wenn das Datenobjekt name als Zeichenliteral oder als Konstante angegeben ist, kann es statisch ausgewertet werden und das angegebene Datenobjekt wird als verwendetes Objekt erkannt.
  • Variable
Wenn das Datenobjekt name als Variable angegeben ist, ist dies eine rein dynamische Angabe und es findet keine statische Auswertung des Inhalts statt.

Bei Ausführung der Anweisung wird name in beiden Fällen erst zur Laufzeit ausgewertet. Der Bezeichner in name wird genauso wie die direkte Angabe aufgebaut: Bei Ausführung der Anweisung muss der Inhalt von name der Bezeichner eines Datenobjekts sein, der Offset-/Längenangaben, Strukturkomponenten-Selektoren und andere Komponentenselektoren für die Zuweisung von Attributen in Klassen bzw. Objekten sowie von Strukturkomponenten enthalten kann. Der Inhalt von name muss nicht in Großbuchstaben angegeben werden.

In name kann eine aus Komponentenselektoren zusammengesetzte Verkettung aus Bezeichnern angegeben sein. Bei einem einzelnen Bezeichner oder wenn auf den ersten Bezeichner ein Objektkomponenten-Selektor (->) folgt, wird das angegebene Datenobjekt nach folgender Hierarchie gesucht:

  1. Falls die Anweisung in einer Prozedur steht, wird in den lokalen Datenobjekten der Prozedur gesucht.
  2. Falls die Anweisung in einer Methode steht, wird in den in der Methode sichtbaren Attribute der eigenen Klasse gesucht. In Instanzmethoden bedeutet das eine Suche im statischen Typ von me (Spezialfall von cref->(attr_name) in dynamic_access).
  3. Es wird in den globalen Daten des aktuellen Programms gesucht.
  4. Es wird in den mit TABLES deklarierten Schnittstellen-Arbeitsbereichen des Hauptprogramms der aktuellen Programmgruppe gesucht.
  5. Falls die Anweisung in einer Instanzmethode steht, wird im dynamischen Typ von me gesucht (Spezialfall von cref->(attr_name) in dynamic_access).

Falls das Datenobjekt gefunden wird und auf den Bezeichner ein Objektkomponenten-Selektor (->) folgt, wird die Suche nach den folgenden Bezeichnern von links nach rechts wie unter dynamic_access beschrieben fortgesetzt.

Wenn auf den ersten Bezeichner ein Klassenkomponenten-Selektor (=>) folgt wird die angegebene Klasse ebenfalls wie unter dynamic_access beschrieben gesucht und die Suche dann entsprechend von links nach. rechts fortgesetzt.

Hinweise

  • Die dynamische Angabe einer Strukturkomponente über einen Strukturkomponenten-Selektor ist weniger effektiv als die Verwendung des Zusatzes COMPONENT OF STRUCTURE, siehe ausführbares Beispiel.
  • Schreibbare Ausdrücke writable_exp können in name nicht dynamisch angegeben werden.
  • Nur für den internen Gebrauch kann der Bezeichner in name auch die Form "(PROG)DOBJ" haben, wobei "PROG" der Name eines ABAP-Programms und "DOBJ" der Name eines globalen Datenobjekts dieses Programms ist, wobei die Groß-/Kleinschreibung keine Rolle spielt. Wenn das Programm "PROG" bei Ausführung der Anweisung ASSIGN in der gleichen internen Sitzung wie das aktuelle Programm geladen ist, wird das Datenobjekt "DOBJ" in diesem Programm gesucht und das Feldsymbol zeigt nach erfolgreicher Zuweisung auf dieses Datenobjekt.
  • In einer obsoleten Variante kann ein Zusatz TABLE FIELD vor name angegeben werden, um die Suche auf Tabellenarbeitsbereiche einzuschränken.

Beispiel

Dynamische Ausgabe des Inhalts eines beliebigen Systemfelds. Die Gültigkeit der Eingabe wird vor der dynamischen Zuweisung mit (name) an das Feldsymbol syfield über eine Anwendung von Klassen der RTTI auf die Struktur SYST überprüft.

Alternative 2

... dref->*


Wirkung

Bei der Angabe einer mit dem Dereferenzierungsoperator ->* dereferenzierten Datenreferenz dref für mem_area wird dem Feldsymbol der Speicherbereich des Datenobjekts zugewiesen, auf das dref zeigt. Falls die Referenzvariable dref kein Datenobjekt referenziert, wird die Zuweisung nicht durchgeführt und sy-subrc auf 4 gesetzt.

Anders als in allen anderen Operandenpositionen, in denen eine nicht auf ein Datenobjekt zeigende Datenreferenz zu einer unbehandelbaren Ausnahme führt, kommt es in der Anweisung ASSIGN zu keiner Ausnahme und sy-subrc wird auf 4 gesetzt.

Zuweisung einer initialen dereferenzierten Datenreferenz. Hier kommt es zu keiner Ausnahme.

Alternative 3

... dobj INCREMENT inc


Wirkung

Mit diesem Ausdruck für mem_area wird dem Feldsymbol ein Speicherbereich zugewiesen, der genauso lang wie der Speicherbereich von dobj ist und um inc mal diese Länge vom Speicherbereich von dobj versetzt ist. Für inc wird ein numerisches Datenobjekt erwartet. Für dobj muss direkt ein Datenobjekt oder ein Feldsymbol angegeben werden. Offset-/Längenangaben oder die Dereferenzierung einer Datenreferenz sind nicht möglich. Das Feldsymbol kann nicht über eine Inline-Deklaration FIELD-SYMBOL(<fs>) deklariert werden.

Hinweise

  • Die dynamische ASSIGN-Variante mit INCREMENT ist für den sequenziellen Zugriff auf gleichartige Speicherbereiche vorgesehen, die in gleichen Abständen hintereinander liegen, wie beispielsweise aufeinanderfolgende Strukturkomponenten vom gleichen Datentyp. In allen anderen Fällen sollte ASSIGN ... INCREMENT nur mit Vorsicht verwendet werden. Insbesondere gilt:
  • In aller Regel muss mit dem Zusatz RANGE der Bereich definiert werden, innerhalb dessen mit INCREMENT gearbeitet werden kann.
  • Der zugewiesene Speicherbereich wird mit dem Datentyp von dobj behandelt, wenn in casting_spec der Zusatz CASTING nicht angegeben ist. Es findet also ein implizites Casting der zugewiesenen Speicherbereiche auf den Datentyp von dobj statt.
  • Es kommt immer zu einem Laufzeitfehler, wenn die allgemeine Regel verletzt ist, dass im zugewiesenen Speicherbereich enthaltene tiefe Datenobjekte bezüglich Typ und Position nicht genau zur Typisierung passen.

Beispiel

Das Feldsymbol zeigt nach der ASSIGN-Anweisung auf die vierte Komponente col4. Siehe auch das Beispiel für den Zusatz RANGE.

Feldsymbole, ASSIGN INCREMENT






PERFORM Short Reference   CL_GUI_FRONTEND_SERVICES - Frontend Services  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 13283 Date: 20240418 Time: 235927     sap01-206 ( 171 ms )