Show TOC Anfang des Inhaltsbereichs

Tabellenzeilen ändern  Dokument im Navigationsbaum lokalisieren

Um einzelne Zeilen einer beliebigen internen Tabelle zu ändern, verwendet man die Anweisung MODIFY. Dabei kann man entweder eine einzige Zeile über den Tabellenschlüssel suchen und ändern oder mehrere Zeilen über eine Bedingung suchen und ändern. Wird bei nicht eindeutigen Schlüsseln ein doppelter Eintrag gefunden, wird der erste Eintrag geändert.

Eine Zeile über den Tabellenschlüssel ändern

Um eine einzige Zeile zu ändern, verwendet man folgende Anweisung:

MODIFY TABLE itab FROM wa [TRANSPORTING f1 f2 ...].

Der Arbeitsbereich wa, der zum Zeilentyp der internen Tabelle kompatibel sein muss, spielt in dieser Anweisung eine Doppelrolle. Zum einen dient er dem Auffinden der zu ändernden Zeile, zum anderen enthält er die neuen Inhalte. Die interne Tabelle wird nach der Zeile durchsucht, in welcher der Inhalt des Tabellenschlüssels mit den entsprechenden Feldern in wa übereinstimmt.

Die Suche erfolgt für die einzelnen Tabellenarten wie folgt:

·        Standard-Tabellen

Der Eintrag wird linear gesucht, wobei die Laufzeit linear von der Anzahl der Tabellenzeilen abhängt. Der erste gefundene Eintrag wird geändert.

·        Sortierte Tabellen

Der Eintrag wird binär gesucht, wobei die Laufzeit logarithmisch von der Anzahl der Tabellenzeilen abhängt. Der erste gefundene Eintrag wird geändert.

·        Hash-Tabellen

Der Eintrag wird über den Hash-Algorithmus der internen Tabelle bestimmt, wobei die Laufzeit nicht von der Anzahl der Tabellenzeilen abhängt.

Wenn eine Zeile gefunden wird, werden die Inhalte der Nicht-Schlüsselfelder des Arbeitsbereichs an die entsprechenden Felder der gefundenen Zeile zugewiesen und sy-subrc auf 0 gesetzt. Ansonsten ist sy-subrc gleich 4. Wird bei nicht eindeutigen Schlüsseln ein doppelter Eintrag gefunden, wird der erste Eintrag geändert.

Mit dem Zusatz TRANSPORTING können die zuzuweisenden Nicht-Schlüsselfelder explizit in einer Liste angegeben werden. Die Felder f1 f2 … können dabei auch dynamisch über (n1) (n2) … als Inhalt eines Felds n1 n2  angegeben werden. Ist <ni> bei der Ausführung der Anweisung leer, wird es ignoriert. Alle Felder f1 f2  können durch die Angabe von Offset und Länge weiter auf Teilfelder eingegrenzt werden.

Bei Tabellen mit komplexer Zeilenstruktur führt die Verwendung des TRANSPORTING-Zusatzes zu Performancegewinnen, wenn das System dadurch keine unnötigen Transporte tabellenförmiger Komponenten durchführen muss.

Mehrere Zeilen über eine Bedingung ändern

Um eine oder mehrere Zeilen über eine Bedingung zu ändern, verwendet man folgende Anweisung:

MODIFY itab FROM wa TRANSPORTING f1 f2 ... WHERE cond.

Es werden alle Zeilen geändert, die den logischen Ausdruck conderfüllen. Der logische Ausdruck cond kann aus verschiedenen Vergleichen zusammengesetzt sein. In jedem einzelnen Vergleich muss der erste Operand eine Komponente der Zeilenstruktur sein. Falls die Tabellenzeilen nicht strukturiert sind, kann der erste Operand der Vergleiche auch die Pseudokomponente TABLE_LINE sein. Ein Vergleich bezieht sich dann auf die gesamte Zeile. Falls der Zeilentyp der internen Tabelle Objektreferenzvariablen als Komponenten comp enthält oder der gesamte Zeilentyp eine Referenzvariable ist, können die Attribute attr des Objekts, auf welches die jeweilige Referenz einer Zeile zeigt, über comp->attr bzw. table_line->attrals Vergleichswerte angegeben werden.

Der Arbeitsbereich wa, der zum Zeilentyp der internen Tabelle kompatibel sein muss, enthält die neuen Inhalte, die mit dem TRANSPORTING-Zusatz an die zu ändernden Zeilen zugewiesen werden müssen. Im Gegensatz zur obigen MODIFY-Anweisung ist der TRANSPORTING-Zusatz hier nicht optional. Weiterhin dürfen nur bei Standard-Tabellen die Schlüsselfelder der Tabelle modifiziert werden. Falls mindestens eine Tabellenzeile geändert wurde, wird sy-subrc auf 0, ansonsten auf 4 gesetzt.

Beispiel

REPORT demo_int_tables_modify .

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

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

DO 4 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  INSERT line INTO TABLE itab.
ENDDO.

line-col1 = 2.
line-col2 = 100.

MODIFY TABLE itab FROM line.

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

Die Listenausgabe ist:

         1        1
         2      100
         3        9
         4       16

Eine Hash-Tabelle wird mit einer Liste von Quadratzahlen gefüllt. In der MODIFY-Anweisung wird die Zeile der Tabelle geändert, in der das Schlüsselfeld col1 den Wert 2 hat.

Beispiel

REPORT demo_int_tables_modify_transp.

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

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

DO 4 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 2.
  INSERT line INTO TABLE itab.
ENDDO.

line-col2 = 100.

MODIFY itab FROM line TRANSPORTING col2
            WHERE ( col2 > 1 ) AND ( col1 < 4 ).

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

Die Listenausgabe ist:

         1        1
         2      100
         3      100
         4       16

Eine Hash-Tabelle wird mit einer Liste von Quadratzahlen gefüllt. In der MODIFY-Anweisung werden die Zeilen der Tabelle geändert, in der die Inhalte von Feld col2 größer als 1 und von Feld col1 kleiner als 4 sind.

Tabellenzeilen über den Index ändern

Die Anweisung MODIFY, die auch zum Ändern von Zeilen beliebiger Tabellen dient, erlaubt auch das Ändern über den Zeilenindex. Weiterhin gibt es eine obsolete 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 f2... ].

Der im Zusatz FROM angegebene Arbeitsbereich wa ersetzt die adressierte Zeile in der Tabelle itab. Der Arbeitsbereich muss 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, dass 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 bei beliebigen Tabellen explizit in einer Liste angegeben werden. Bei sortierten Tabellen dürfen dabei nur Nicht-Schlüsselfelder angegeben werden.

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.

 

Ende des Inhaltsbereichs