Show TOC Anfang des Inhaltsbereichs

Grundformen der ASSIGN-Anweisung   Dokument im Navigationsbaum lokalisieren

Folgende Grundformen sind unterscheidbar:

Statisches ASSIGN

Wenn der Namen des Datenobjekts, das einem Feldsymbol zugewiesen werden soll, schon bei der Programmerstellung bekannt ist, verwendet man die statische ASSIGN-Anweisung:

ASSIGN dobj TO <fs>.

Bei der Zuweisung wird geprüft, ob die technischen Eigenschaften des Datenobjekts dobj mit der Typisierung des Feldsymbols <fs> übereinstimmen. Das Feldsymbol übernimmt die generischen Attribute, die nicht durch eine Typisierung festgelegt wurden von dobj und zeigt nach der Zuweisung auf dieses Feld im Speicher.

Beispiel

REPORT demo_field_symbols_stat_ASSIGN .

FIELD-SYMBOLS: <f1> TYPE ANY, <f2> TYPE i.

DATA: text(20)  TYPE c VALUE 'Hello, how are you?',
      num       TYPE i VALUE 5,
      BEGIN OF line1,
        col1 TYPE f VALUE '1.1e+10',
        col2 TYPE i VALUE '1234',
      END OF line1,
      line2 LIKE line1.

ASSIGN text TO <f1>.
ASSIGN num TO  <f2>.
DESCRIBE FIELD <f1> LENGTH <f2>.
WRITE: / <f1>, 'has length', num.

ASSIGN line1 TO <f1>.
ASSIGN line2-col2 TO <f2>.
MOVE <f1> TO line2.
ASSIGN 'LINE2-COL2 =' TO <f1>.
WRITE: / <f1>, <f2>.

Die Listenausgabe ist:

Hello, how are you?  has length         20

LINE-COL2 =      1,234

Es werden zwei Feldsymbole <f1> und <f2> deklariert. <f2> können nur Felder vom Typ I zugewiesen werden, da es entsprechend typisiert ist. Im Verlauf des Programms zeigen <f1> und <f2> auf verschiedene Felder.

Statisches ASSIGN mit Offset-Angaben

Beim statischen ASSIGN können einem Feldsymbol Teilfelder durch positive Offset- und Längenangaben zugewiesen werden:

ASSIGN dobj[+off][(len)] TO <fs>.

Bei der Zuweisung von Teilfeldern an Feldsymbole gelten folgende Besonderheiten:

·        das System prüft nicht, ob das Teilfeld innerhalb des Felds dobj liegt. Sowohl Offset off als auch Länge len können größer als die Länge von dobj sein. Es können Speicherbereiche außerhalb der Grenzen von dobj angesprochen werden, jedoch nicht außerhalb der Datenbereiche für Feldsymbole.

·        Falls keine Länge len angegeben wird, wird automatisch die Länge des Felds dobj eingesetzt. Ist dann off größer als Null, zeigt <fs> immer auf einen Bereich außerhalb der Grenzen von dobj.

·        Ist off kleiner als die Länge von dobj, kann ein Stern (*) für len angegeben werden, um zu verhindern, dass <fs> über die Grenze von dobj hinaus zeigt.

Beispiel

REPORT demo_field_symbols_stat_as_off .

FIELD-SYMBOLS <fs> TYPE ANY.

DATA: BEGIN OF line,
        string1(10) VALUE '0123456789',
        string2(10) VALUE 'abcdefghij',
      END OF line.

WRITE / line-string1+5.

ASSIGN line-string1+5 TO <fs>.
WRITE / <fs>.

ASSIGN line-string1+5(*) TO <fs>.
WRITE / <fs>.

Die Listenausgabe ist:

56789

56789abcde

56789

Das Beispiel zeigt den Unterschied zwischen einer Offset-Angabe in einer WRITE-Anweisung und in einer ASSIGN-Anweisung. Bei WRITE wird die Ausgabe am Rand von line-string1 abgeschnitten. Eine Offset-Angabe von größer als 9 würde zu einem Fehler bei der Syntaxprüfung führen. In der ersten ASSIGN-Anweisung wird der Speicherbereich der Länge 10, der mit Offset 5 in line-string1 beginnt, dem Feldsymbol <fs> zugewiesen. Dies ergibt eine sinnvolle Ausgabe, da der Speicherbereich hinter line-string1 zu line-string2 gehört. In der zweiten ASSIGN-Anweisung wird die Zuweisung von Speicher hinter line-string1 durch die Angabe der Länge * verhindert.

Beispiel

REPORT demo_field_symbols_stat_as_of2 .

FIELD-SYMBOLS <fs> TYPE ANY.

DATA: BEGIN OF line,
        a TYPE c VALUE '1', b TYPE c VALUE '2',
        c TYPE c VALUE '3', d TYPE c VALUE '4',
        e TYPE c VALUE '5', f TYPE c VALUE '6',
        g TYPE c VALUE '7', h TYPE c VALUE '8',
      END OF line,
      off TYPE i,
      len TYPE i VALUE 2.

DO 2 TIMES.
  off = sy-index * 3.
  ASSIGN line-a+off(len) TO <fs>.
  <fs> = 'XX'.
ENDDO.

DO 8 TIMES.
  off = sy-index - 1.
  ASSIGN line-a+off(1) TO <fs>.
  
WRITE <fs>.
ENDDO.

Die Listenausgabe ist:

1 2 3 X X 6 X X

Das Beispiel zeigt wie Feldsymbole Zugriff auf und Manipulation von regelmäßigen Strukturen erleichtern können. Es ist aber zu beachten, dass diese flexible Methode um Speicherinhalte über Feldgrenzen hinweg anzusprechen und zu manipulieren, auch Gefahren birgt und zu Laufzeitfehlern führen kann.

Dynamisches ASSIGN

Wenn der Namen des Datenobjekts, das einem Feldsymbol zugewiesen werden soll, erst zur Laufzeit bekannt ist, kann man die dynamische ASSIGN-Anweisung verwenden:

ASSIGN (dobj) TO <fs>.

Die Anweisung weist das Datenobjekt, dessen Name in Feld dobj steht, dem Feldsymbol <fs> zu. Beim dynamischen ASSIGN ist keine Angabe von Teilfeldern möglich.

Zur Laufzeit wird in der folgenden Reihenfolge nach dem angegebenen Datenobjekt gesucht:

...

       1.      Erfolgt die Zuweisung in einer Prozedur, wird zuerst unter den lokalen Daten der Prozedur gesucht.

       2.      Erfolgt die Zuweisung außerhalb einer Prozedur oder das Feld wird dort nicht gefunden, wird unter den globalen Daten des Programms gesucht.

       3.      Wird das Feld unter den globalen Daten nicht gefunden, wird unter den im Hauptprogramm der aktuellen Programmgruppe mit TABLES deklarierten Tabellenarbeitsbereichen. Eine Programmgruppe besteht aus einem Hauptprogramm und allen Programmen, die durch Programmaufrufe in den internen Modus dieses Programms geladen werden.

Ist die Suche erfolgreich und ein Feld kann dem Feldsymbol zugewiesen werden, wird sy-subrc auf 0 gesetzt. Ansonsten bekommt sy-subrc den Wert 4 und das Feldsymbol bleibt unverändert. Aus Sicherheitsgründen sollte sy-subrc nach einem dynamischen ASSIGN immer geprüft werden, um zu verhindern, dass das Feldsymbol auf ungewollte Bereiche zeigt.

Obige Suche nach Feldern geht zu Lasten der Antwortzeit. Das dynamische ASSIGN sollte nur wenn unbedingt erforderlich verwendet werden. Wenn bereits bei der Programmerstellung bekannt ist, dass ein Tabellenarbeitsbereich zugewiesen werden soll, kann auch folgende Variante des dynamischen ASSIGN verwendet werden:

ASSIGN TABLE FIELD (dobj) TO <fs>.

Das zuzuweisende Datenobjekt wird dann ausschließlich unter den Tabellenarbeitsbereichen, die mit TABLES im Hauptprogramm der aktuellen Programmgruppe deklariert wurden, gesucht. Da Im Umfeld von ABAP Objects keine Tabellenarbeitsbereiche verwendet werden, ist dieser Zusatz dort verboten.

Beispiel

Wir betrachten drei Programme, ein Hauptprogramm:

REPORT demo_field_symbols_dynami_as_1.
TABLES sbook.
sbook-fldate = sy-datum.
PERFORM form1 IN PROGRAM demo_form1.

Zwei weitere Programme:

REPORT demo_form1.
FORM form1.
  PERFORM form2 IN PROGRAM demo_form2.
ENDFORM.

und

REPORT demo_form2.
FORM form2.
  DATA name(20) TYPE c VALUE 'SBOOK-FLDATE'.
  FIELD-SYMBOLS <fs> TYPE ANY.
  ASSIGN (name) TO <fs>.
  IF sy-subrc EQ 0.
    
WRITE / <fs>.
  ENDIF.
ENDFORM.

Die Listenausgabe ist in etwa:

02.06.1998

Die Programmgruppe im internen Modus besteht aus DEMO, MYFORMS1 und MYFORMS2. Das Feldsymbol <fs> ist in MYFORMS2 definiert. Nach der dynamischen ASSIGN-Anweisung zeigt es auf die Komponente FLDATE des Tabellenarbeitsbereichs SBOOK, der im Hauptprogramm DEMO deklariert ist.

Beispiel

REPORT demo_field_symbols_dynami_as_2 .

TABLES sbook.

DATA: name1(20) TYPE c VALUE 'SBOOK-FLDATE',
      name2(20) TYPE c VALUE 'NAME1'.

FIELD-SYMBOLS <fs> TYPE ANY.

ASSIGN TABLE FIELD (name1) TO <fs>.
WRITE: / 'sy-subrc:', sy-subrc.

ASSIGN TABLE FIELD (name2) TO <fs>.
WRITE: / 'sy-subrc:', sy-subrc.

Die Listenausgabe ist:

sy-subrc:      0

sy-subrc:      4

In der ersten ASSIGN-Anweisung wird die Komponente FLDATE des Tabellenarbeitsbereichs SBOOK gefunden und sy-subrc wird auf 0 gesetzt. In der zweiten ASSIGN-Anweisung wird das Feld name1 nicht gefunden, weil es mit DATA und nicht mit TABLESdeklariert wurde. sy-subrc wird deshalb auf 4 gesetzt.

Feldsymbole zuweisen

Anstatt die Namen von Datenobjekten zu verwenden, können in allen Varianten von ASSIGN auch Feldsymbole anderen Feldsymbolen zugewiesen werden:

ASSIGN <fs1>[+off][(len)] TO <fs2>.

beim statischen ASSIGN und:

ASSIGN [TABLE FIELD] (dobj) TO <fs2>.

beim dynamischen ASSIGN, wobei dann das Feld dobj den Namen eines Feldsymbols <fs1> enthält. <fs1> und <fs2> können auch identisch sein.

Beispiel

Achtung unterschiedliche Semantik im Unicode-Fall:

REPORT demo_field_symbols_dynami_as_3 .

DATA: BEGIN OF s,
        a TYPE c VALUE '1',
        b TYPE c VALUE '2',
        c TYPE c VALUE '3',
        d TYPE c VALUE '4',
        e TYPE c VALUE '5',
        f TYPE c VALUE '6',
        g TYPE c VALUE '7',
        h TYPE c VALUE '8',
      END OF s.

DATA off TYPE i.

FIELD-SYMBOLS <fs> TYPE ANY.

ASSIGN s-a TO <fs>.

DO 4 TIMES.
  off = sy-index - 1.
  IF <fs> IS ASSIGNED.
    ASSIGN <fs>+off(1) TO <fs>.
   
IF <fs> IS ASSIGNED.
      WRITE <fs>.
    ENDIF.
  ENDIF.
ENDDO.

Die Listenausgabe im Nicht-Unicode-Fall ist:

1 2 4 7

Es wird eine Struktur S mit acht Komponenten s-a bis s-h deklariert und mit Zeichen 1 bis 8 gefüllt. Die Zeichen sind im Speicher regelmäßig abgelegt. Die Komponente s-a wird initial dem Feldsymbol <fs> zugewiesen. Die Anweisungen in der DO-Schleife haben folgende Wirkung:

Schleifendurchlauf 1:

<fs> zeigt auf s-a, off ist null, s-a wird <fs> zugewiesen

Schleifendurchlauf 2:

<fs> zeigt auf s-a, off ist eins, s-b wird <fs> zugewiesen

Schleifendurchlauf 3:

<fs> zeigt auf s-b, off ist zwei, s-d wird <fs> zugewiesen

Schleifendurchlauf 4:

<fs> zeigt auf s-d, off ist drei, s-g wird <fs> zugewiesen

Im Unicode-Fall (Unicode-Flag in den Editoreinstellungen ist gesetzt) ist einfach:

1

Ab dem zweiten Schleifendurchgang ist <fs> kein Datenobjekt mehr zugewiesen.

 

 

Ende des Inhaltsbereichs