Ansicht
Dokumentation
ABAPASSIGN_MEM_AREA_DYNAMIC_DOBJ - ASSIGN MEM AREA DYNAMIC DOBJ
BAL Application Log Documentation General Material DataDiese Dokumentation steht unter dem Copyright der SAP AG.
ASSIGN, dynamic_dobj
... ${ (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:
- Falls die Anweisung in einer Prozedur steht, wird in den lokalen Datenobjekten der Prozedur gesucht.
- 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).
- Es wird in den globalen Daten des aktuellen Programms gesucht.
- Es wird in den mit TABLES deklarierten Schnittstellen-Arbeitsbereichen des Hauptprogramms der aktuellen Programmgruppe gesucht.
- 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.
- Wenn in name über einen absoluten Typnamen gefolgt vom Klassenkomponenten-Selektor (=>) ein Attribut einer Klasse eines anderen Programms angegeben wird, wird dieses je nach Programmtyp in eine neue Zusatzprogrammgruppe oder in die aktuelle Programmgruppe hinzugeladen, falls es noch nicht geladen war. Ein eventuell vorhandener Programmkonstruktor wird anders als beim echten dynamic_access aber nicht ausgeführt.
- 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.
- Die Überprüfung der Typisierung bezieht sich ebenfalls auf dobj, findet aber erst bei Ausführung der Anweisung 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.
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 )