Show TOC Anfang des Inhaltsbereichs

Zugriff über Feldsymbole  Dokument im Navigationsbaum lokalisieren

Beim Lesen von Tabellenzeilen mit READ und der Schleifenverarbeitung mit LOOP können die Zeilen interner Tabellen mit dem Zusatz

... ASSIGNING <fs>

einem Feldsymbol zugewiesen werden. Das Feldsymbol <fs> zeigt direkt auf die zugewiesene Zeile im Arbeitsspeicher. Während der Inhalt der Zeile bei der Zuweisung an einen Arbeitsbereich mit dem INTO-Zusatz nur indirekt zur Verfügung steht, kann er über das Feldsymbol direkt gelesen und verändert werden.

Beim ändernden Zugriff auf Tabellenzeilen über Feldsymbole muss beachtet werden, dass bei sortierten Tabellen und Hash-Tabellen der Inhalt von Schlüsselfeldern nicht geändert werden darf. Jede Wertzuweisung an ein Schlüsselfeld über ein Feldsymbol führt zu einem Laufzeitfehler. In Schleifen ist  zu beachten, dass die Anweisung SUM der Gruppenstufenverarbeitung nicht möglich ist, wenn mit Feldsymbolen gearbeitet wird, da diese Anweisung auf Arbeitsbereichen ausgeführt wird.

Vorteile von Feldsymbolen

Bei lesenden Zugriffen entfallen die Kopierkosten bei der Zuweisung der Tabellenzeilen an den Arbeitsbereich. Bei ändernden Zugriffen mit der Anweisung MODIFY muss nicht erst ein Arbeitsbereich mit Werten gefüllt und dann der Tabellenzeile zugewiesen werden, sondern es kann direkt mit dem Feldsymbol gearbeitet werden. Dies führt bei großen bzw. komplexen Tabellenzeilen zu Performancegewinnen und erleichtert die Verarbeitung geschachtelter interner Tabellen.

Verwaltungskosten beim READ

Es ist aber zu beachten, dass beim Zugriff über Feldsymbole interne Verwaltungskosten entstehen. Nach einer READ-Anweisung mit Feldsymbol, muss die Zuweisung der Zeile an das Feldsymbol in der Tabelle registriert werden. Falls eine an ein Feldsymbol zugewiesene Tabellenzeile gelöscht wird, muss die Zuweisung intern aufgehoben werden, damit das Feldsymbol nicht auf einen undefinierten Bereich zeigt.

Beim Zugriff auf einzelne Zeilen lohnt sich die Verwendung von Feldsymbolen bei rein lesenden Zugriffen mit der READ-Anweisung ab einer Zeilenbreite von ca. 1000 Bytes. Bei der Kombination mit ändernden Zugriffen über die MODIFY-Anweisung lohnen sich Feldsymbole schon ab einer Zeilenbreite von ca. 100 Bytes.

Verwaltungskosten beim LOOP

Um die Verwaltungskosten für die Verwendung von Feldsymbolen bei der Schleifenverarbeitung zu minimieren, wird intern nicht die Zuweisung jeder aktuellen Zeile an das Feldsymbol registriert, sondern nur die Zuweisung einer beliebigen Zeile der Tabelle an das Feldsymbol. Erst beim Verlassen der Schleife wird die Zuweisung der Zeile des letzten Schleifendurchgangs an das Feldsymbol registriert.

Als Konsequenz lohnt sich die Verwendung von Feldsymbolen bei der Schleifenverarbeitung schon ab ca. 10 Zeilen. Andererseits ist es dadurch nicht möglich, dem Feldsymbol innerhalb der Schleife ein anderes oder gar kein Feld zuzuweisen. Die Ausführung der Anweisungen ASSIGN, UNASSIGN oder die Verwendung des ASSIGNING-Zusatzes für das gleiche Feldsymbol im Anweisungsblock der Schleife führt zu Laufzeitfehlern.

Beispiel

DATA: BEGIN OF line,
         col1 TYPE i,
         col2 TYPE i,
      END OF line.

DATA itab LIKE SORTED TABLE OF line WITH UNIQUE KEY col1.

FIELD-SYMBOLS <fs> LIKE LINE OF itab.

DO 4 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  APPEND line TO itab.
ENDDO.

READ TABLE itab WITH TABLE KEY col1 = 2 ASSIGNING <fs>.
<fs>-col2 = 100.

READ TABLE itab WITH TABLE KEY col1 = 3 ASSIGNING <fs>.
DELETE itab INDEX 3.

IF <fs> IS ASSIGNED.
  WRITE '<fs> is assigned!'.
ENDIF.

LOOP AT itab ASSIGNING <fs>.
  WRITE: / <fs>-col1, <fs>-col2.
ENDLOOP.

Die Listenausgabe ist:

         1         1

         2       100

         4        16

Es wird eine sortierte Tabelle itab mit 4 Zeilen gefüllt. Die zweite Zeile wird dem entsprechend typisierten Feldsymbol <fs> zugewiesen und über <fs> modifiziert. Nach der Zuweisung der dritten Zeile an <fs> wird diese gelöscht. Dadurch ist der logische Ausdruck in der IF-Anweisung unwahr. In der LOOP-Schleife wird <fs> zur Ausgabe der Tabellenzeilen verwendet. Danach zeigt <fs> auf die dritte Zeile der Tabelle.

 

 

Ende des Inhaltsbereichs