Anfang des InhaltsbereichsTabellenzeilen über den Index ändern Dokument im Navigationsbaum lokalisieren

Die Anweisung MODIFY, die auch zum Ändern von Zeilen beliebiger Tabellen dient, erlaubt auch das Ändern über den Zeilenindex. Weiterhin gibt es eine spezielle Variante der Anweisung WRITE TO, mit der Zeilen in Standard-Tabellen modifiziert werden können.

Einzelne Zeilen mit MODIFY ändern

Um eine Zeile über den Index zu ändern, verwendet man folgende Anweisung:

MODIFY <itab> FROM <wa> [INDEX <idx>] [TRANSPORTING <f1> <f 2>... ].

Der im Zusatz FROM angegebene Arbeitsbereich <wa> ersetzt die adressierte Zeile in der Tabelle <itab>. Der Arbeitsbereich muß in den Zeilentyp der internen Tabelle konvertierbar sein.

Bei Verwendung der Option INDEX wird der Inhalt des Arbeitsbereichs der Zeile mit dem Index <idx> zugewiesen. Bei erfolgreichem Ersetzen wird SY-SUBRC auf 0 gesetzt. Enthält die interne Tabelle weniger Zeilen als <idx>, wird keine Zeile geändert und SY-SUBRC wird auf 4 gesetzt.

Ohne den Zusatz INDEX kann obige Anweisung nur innerhalb einer LOOP-Schleife verwendet werden. Dann wird die aktuelle Zeile geändert. <idx> wird also implizit auf SY-TABIX gesetzt.

Beim Ändern von Zeilen in sortierten Tabellen ist zu beachten, daß der Inhalt der Schlüsselfelder nicht geändert werden darf und ein Laufzeitfehler auftritt, wenn im Programm versucht wird den Inhalt eines Schlüsselfelds durch einen anderen Wert zu ersetzen. Eine Zuweisung des gleichen Werts ist aber möglich.

Mit dem Zusatz TRANSPORTING können die zu ändernden Felder wie beim Tabellenzeilen ändern in beliebigen Tabellen explizit in einer Liste angegeben werden. Bei sortierten Tabellen dürfen dabei nur Nicht-Schlüsselfelder angegeben werden.

Zeilen mit WRITE TO ändern

In Standard-Tabellen können Zeilen auch mit der folgenden Anweisung geändert werden:

WRITE <f> TO <itab> INDEX <idx>.

Diese Variante der Anweisung WRITE TO konvertiert den Inhalt des Felds <f> nach Typ C und überträgt die resultierende Zeichenkette in die Zeile mit dem Index <idx>. Bei erfolgreichem Ersetzen wird SY-SUBRC auf 0 gesetzt. Enthält die interne Tabelle weniger Zeilen als <idx>, wird keine Zeile geändert und SY-SUBRC wird auf 4 gesetzt.

Der Datentyp von <f> muß in ein Characterfeld konvertierbar sein, ansonsten tritt ein Syntax- oder Laufzeitfehler auf. Die Zeile wird unabhängig von ihrem tatsächlichen Zeilentyp immer als Zeichenkette interpretiert. Die Bearbeitung von Teilfeldern ist wie beim normalen WRITE TO möglich. Diese Anweisung sollte bei strukturierten Zeilentypen nur verwendet werden, wenn ein Zeichen, dessen Position genau bekannt ist, umgesetzt werden soll. Eine andere Anwendungsmöglichkeit sind interne Tabellen, deren gesamter Zeilentyp zeichenartig ist. Tabellen mit solchem Typ werden beispielsweise bei der dynamischen Programmierung oft verwendet.

Beispiel

REPORT demo_int_tables_modify_ind.

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

DATA itab LIKE TABLE OF line.

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

LOOP AT itab INTO line.
  IF sy-tabix = 2.
    line-col1 = sy-tabix * 10.
    line-col2 = ( sy-tabix * 10 ) ** 2.
    MODIFY itab FROM line.
  ENDIF.
ENDLOOP.

LOOP AT itab INTO line.
  WRITE: / sy-tabix, line-col1, line-col2.
ENDLOOP.

Die Ausgabe sieht so aus:

         1         1          1
         2        20        400
         3         3          9

In diesem Beispiel wird eine sortierte ITAB mit drei Zeilen gefüllt. Die zweite Zeile wird durch den Inhalt des Arbeitsbereichs LINE ersetzt.

Beispiel

REPORT demo_int_tables_modify_ind_ind.

DATA name(4) TYPE c VALUE 'COL2'.

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

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

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

line-col2 = 222.
MODIFY itab FROM line INDEX 2 TRANSPORTING (name).

line-col1 = 3.
line-col2 = 333.
MODIFY itab FROM line INDEX 3.

LOOP AT itab INTO line.
  WRITE: / sy-tabix, line-col1, line-col2.
ENDLOOP.

Die Listenausgabe ist:

         1         1          1
         2         2        222
         3         3        333
         4         4         16

Es wird eine sortierte Tabelle mit vier Zeilen gefüllt. In der zweiten Zeile und dritten Zeile wird die Komponente COL2 modifiziert. Falls bei der Modifikation der dritten Zeile der Wert von LINE-COL1 ungleich 3 wäre, käme es zu einem Laufzeitfehler, da ein Schlüsselfeld einer sortierten Tabelle nicht geändert werden darf.

Beispiel

REPORT demo_int_tables_write_ind.

DATA text(72) TYPE c.

DATA code LIKE TABLE OF text.

text = 'This is the first line.'.

APPEND text TO code.

text = 'This is the second line. It is ugly.'.

APPEND text TO code.

text = 'This is the third and final line.'.

APPEND text TO code.

WRITE 'nice.' TO code+31 INDEX 2.

LOOP AT code INTO text.
  WRITE / text.
ENDLOOP.

Die Ausgabe sieht so aus:

This is the first line.
This is the second line. It is nice.
This is the third and final line.

In diesem Beispiel wird eine interne Tabelle CODE mit einem elementaren Feld vom Typ C definiert, das 72 Zeichen lang ist. Nachdem die Tabelle mit drei Zeilen gefüllt wurde, wird die zweite Zeile mit der Anweisung WRITE TO geändert. Das Wort "ugly" wird durch das Wort "nice" ersetzt.

 

 

Ende des Inhaltsbereichs