ABAPASSIGN_MEM_AREA_DYNAMIC_DOBJ - ASSIGN MEM AREA DYNAMIC DOBJ

ABAP Short Reference   General Data in Customer Master  
Diese Dokumentation steht unter dem Copyright der SAP AG.

ASSIGN - dynamic_dobj

Kurzreferenz



Syntax

... { (name) }
  | { dref->* }
  | { dobj INCREMENT inc }
  | { COMPONENT comp OF STRUCTURE struc } ...

Alternativen:

1. ... (name)

2. ... dref->*

3. ... dobj INCREMENT inc

4. ... COMPONENT comp OF STRUCTURE struc

Wirkung

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

Bei diesen Varianten setzt die Anweisung ASSIGN den Rückgabewert sy-subrc. Wenndie Zuweisung erfolgreich ist, wird sy-subrc auf 0, ansonsten auf 4 gesetzt. Bei nicht erfolgreicherZuweisung behält das Feldsymbol den vorhergehenden Zustand. Die Auswertung des logischen Ausdrucks<fs> ISASSIGNED 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.

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

Wenn der Bezeichner in name ein Feldsymbol oder ein Formalparameter mit unstrukturierterTypisierungist, können Komponenten über Strukturkomponenten-Selektoren adressiert werden. Die Komponenten müssen bei der Ausführung der Anweisung vorhanden sein.

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 imstatischen 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 desHauptprogramms der aktuellen Programmgruppe gesucht.

  5. Falls die Anweisung in einer Instanzmethode steht, wird imdynamischen 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_accessbeschrieben gesucht und die Suche dann entsprechend von links nach. rechts fortgesetzt.

Hinweise

  • Wenn in name über einen absoluten Typnamen ein Attribut einer Klasse eines anderen Programms angegeben wird, wird dieses je nach Programmtyp in eine neueZusatzprogrammgruppe oder in die aktuelleProgrammgruppe hinzugeladen, falls es noch nicht geladen war. Ein eventuell vorhandenerProgrammkonstruktorwird anders als beim echten dynamic_access aber nicht ausgeführt.

  • 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. Wenn das Programm "PROG" bei Ausführung der Anweisung ASSIGN im gleicheninternenModus 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 TABLEFIELD vor name angegeben werden, um die Suche auf Tabellenarbeitsbereiche einzuschränken.


Alternative 2

... dref->*


Wirkung

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

Im Gegensatz zu allen übrigen Operandenpositionen, bei denen die Datenreferenz dref füreine Dereferenzierung vollständig typisiert sein muss, kann dref in der Anweisung ASSIGNgenerisch mit TYPE REF TO data typisiert sein. Weiterhin führt die Dereferenzierung einerDatenreferenz, die auf kein Datenobjekt zeigt, nur in der Anweisung ASSIGN nicht zu einer unbehandelbaren Ausnahme.

Beispiel

Erzeugung einer lokalen Kopie eines globalen Datenobjekts g_dat in einer Prozedur mit Hilfe einerDatenreferenz dref und Zugriff über ein lokales Feldsymbol <l_dat> nach Dereferenzierung.

DATA g_dat TYPE string.

...

FORM subroutine.
  DATA dref TYPE REF TO data.
  FIELD-SYMBOLS <l_dat> TYPE ANY.
  CREATE DATA dref LIKE g_dat.
  ASSIGN dref->* TO <l_dat>.
  WRITE <l_dat> ...
ENDFORM.

Alternative 3

... dobj INCREMENT inc


Wirkung

Mit diesem Ausdruck für mem_area wird dem Feldsymbol ein Speicherbereich zugewiesen, dergenauso lang wie der Speicherbereich von dobj ist und um inc mal diese Länge vomSpeicherbereich von dobj versetzt ist. Für inc wird ein numerisches Datenobjekterwartet. Für dobj muss direkt ein Datenobjekt oder ein Feldsymbol angegeben werden. Offset-/Längenangaben oder die Dereferenzierung einer Datenreferenz sind nicht möglich.

Hinweise

Die dynamische ASSIGN-Variante mit INCREMENT ist für den sequenziellen Zugriffauf 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 ist zu beachten:

  • Der zugewiesene Speicherbereich wird mit dem Datentyp von dobj behandelt, wenn in casting_specder Zusatz CASTING nicht angegeben ist. Es findet also ein implizites Casting der zugewiesenen Speicherbereiche auf den Datentyp von dobj statt.

  • Die Überprüfungder Typisierung bezieht sich ebenfalls auf dobj, findet aber erst bei Ausführung der Anweisung statt.

  • Das Verhalten der Anweisung kann in Unicode-Systemen und Nicht-Unicode-Systemen unterschiedlich sein, wenn dobj unterschiedlich viele Bytes belegt.

  • Es kommt immer zu einem Laufzeitfehler, wenn die allgemeine Regel verletzt ist, dass im zugewiesenen Speicherbereich enthaltenetiefe Datenobjekte bezüglich Typ und Position nicht genau zur Typisierung passen.


Beispiel

Zum Verhalten der Anweisung ASSIGN mit dem Zusatz INCREMENT siehe das zugehörigeABAP-Beispiel.Für ein Beispiel zur Verwendung, siehe das zweite Beispiel für range_spec.

Alternative 4

... COMPONENT comp OF STRUCTURE struc


Wirkung

Mit diesem Ausdruck für mem_area wird dem Feldsymbol der Speicherbereich einer Komponentecomp einer Struktur struc zugewiesen. Während die Struktur struc direktangegeben wird, muss für comp ein Datenobjekt angegeben werden. Die Auswertung richtet sich nach dem Datentyp von comp:

  • Hat das Feld comp einen textartigen Typ (c oder string) oder den einerflachenStruktur, wird sein Inhalt als Name der Komponente interpretiert. Der Name muss in Großbuchstaben angegeben sein.

  • Hat das Feld comp einen nicht textartigen elementaren Typ, wird der Inhalt in den Typ ikonvertiert und als Position der Komponente in der Struktur interpretiert. Falls der Wert von comp 0 ist, wird dem Feldsymbol der Speicherbereich der gesamten Struktur zugewiesen.


Falls struc keine Struktur ist, wird die Zuweisung nicht durchgeführt und sy-subrc auf 4 gesetzt.

Hinweise

  • Die Identifikation einer Komponente über ihren Namen ist deutlich weniger performant als über ihre Position, da damit ein höherer interner Aufwand verbunden ist.

  • Um auf statisch bekannte Komponenten unstrukturiert typisierter Formalparameter oder Feldsymbole zuzugreifen,kann statt der hier gezeigten Zuweisung von dynamischen Strukturkomponenten auch direkt der Strukturkomponenten-Selektorhinter der eingeklammerten dynamischen Angabe des Formalparameters bzw. des Feldsymbols verwendet werden.


Beispiele

Die folgenden beiden Quelltextabschnitte zeigen die dynamische Zuweisung der Komponenten einer Struktur,die an den Parameter para einer Methode meth übergeben wird, an ein Feldsymbol <comp>.

In der ersten Implementierung wird kein Gebrauch vonRTTIgemacht. Über die Anweisung DESCRIBEFIELD wird kontrolliert, ob das übergebene Datenobjekt eine Struktur ist. In einer DO-Schleife werden dann die Komponenten dem Feldsymbol zugewiesen.

METHOD meth.
  "IMPORTING para TYPE data.
  DATA dtype TYPE c LENGTH 1.
  FIELD-SYMBOLS <comp> TYPE any.
  DESCRIBE FIELD para TYPE dtype.
  IF dtype <> 'u' AND dtype <> 'v'.
    RETURN.
  ENDIF.
  DO.
    ASSIGN COMPONENT sy-index OF STRUCTURE para TO <comp>.
    IF sy-subrc <> 0.
      EXIT.
    ENDIF.
    ...
  ENDDO.
ENDMETHOD.

In der zweiten Implementierung wird Gebrauch von RTTI gemacht. Durch denDown Cast des Typbeschreibungsobjekts für das übergebene Datenobjekt auf die KlasseCL_ABAP_STRUCTDESCR wird sichergestellt, dasses sich um eine Struktur handelt. In einer Schleife über die Komponententabelle COMPONENTS werden die Komponenten dem Feldsymbol zugewiesen.

METHOD meth.
  "IMPORTING para TYPE data.
  DATA struct_descr TYPE REF TO cl_abap_structdescr.
  FIELD-SYMBOLS:
    <comp_descr> LIKE LINE OF cl_abap_structdescr=>components,
    <comp> TYPE any.
  TRY.
      struct_descr ?= cl_abap_typedescr=>describe_by_data( para ).
    CATCH cx_sy_move_cast_error.
      RETURN.
  ENDTRY.
  LOOP AT struct_descr->components ASSIGNING <comp_descr>.
    ASSIGN COMPONENT <comp_descr>-name
           OF STRUCTURE para TO <comp>.
  ENDLOOP.
ENDMETHOD.







Addresses (Business Address Services)   ABAP Short Reference  
Diese Dokumentation steht unter dem Copyright der SAP AG.


Length: 16928 Date: 20120526 Time: 231812     triton ( 374 ms )