Show TOC

Tabellenzeilen ändernLocate this document in the navigation structure

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 f 1 f 2 ...].

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 wa in ü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 f 1 f 2 können dabei auch dynamisch über (n 1 )(n 2 ) … als Inhalt eines Felds n 1 n 2 …  angegeben werden. Ist <n i > bei der Ausführung der Anweisung leer, wird es ignoriert. Alle Felder f 1 f 2 …  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 f 1 f 2 ... WHERE cond.

Es werden alle Zeilen geändert, die den logischen Ausdruck cond erfü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->attr als 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.

Tipp
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

E 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.

Tipp
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 f 1 f 2 ... ].

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.

Tipp
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 itabline mit drei Zeilen gefüllt. Die zweite Zeile wird durch den Inhalt des Arbeitsbereichs ersetzt.

Tipp
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.