Tabellenzeilen ändern 

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

Der Arbeitsbereich <wa>, der zum Zeilentyp der internen Tabelle kompatibel sein muß, 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:

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

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

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

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> <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 muß 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 muß, 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.

Beispiele

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.

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.