Tabellenzeilen ändern 

Die Open SQL-Anweisung zum Ändern von Zeilen in Datenbanktabellen ist:

UPDATE <target> <lines>.

Diese Anweisung ermöglicht es, einzelne oder mehrere Zeilen <lines> in eine Datenbanktabelle <target> zu ändern. In einen View aus dem ABAP Dictionary können nur dann Zeilen geändert werden, wenn sich der View auf eine einzige Tabelle bezieht und der Pflegestatus des Views im Dictionary ohne Einschränkung ist. Die Datenbanktabelle <target> kann statisch und dynamisch angegeben werden.

Datenbanktabelle angeben

Um die Datenbanktabelle statisch anzugeben, schreibt man für <target>:

UPDATE <dbtab> [CLIENT SPECIFIED] <lines>.

Dabei ist <dbtab> der Name einer im ABAP-Dictionary bekannten Datenbanktabelle.

Um die Datenbanktabelle dynamisch anzugeben, schreibt man <target>:

UPDATE (<name>) [CLIENT SPECIFIED] <lines>.

Dabei enthält das Feld <name> den Namen einer im ABAP-Dictionary bekannten Datenbanktabelle.

Mit dem Zusatz CLIENT SPECIFIED kann die automatische Mandantenbehandlung abgeschaltet werden.

Zeilen spaltenweise ändern

Um bestimmte Spalten in der Datenbanktabelle zu ändern, schreibt man für <lines>:

UPDATE <target> SET <set 1> <set 2> ... [WHERE <cond>].

Die WHERE-Klausel bestimmt die zu ändernden Zeilen. Ohne WHERE-Klausel werden alle Zeilen geändert. Die Ausdrücke <set i > sind drei verschiedene SET-Anweisungen, die bestimmen welche Spalten wie geändert werden sollen:

Der Wert in Spalte <si> wird für alle selektierten Zeilen auf den Wert von <f> gesetzt.

Der Wert in Spalte <si> wird für alle selektierten Zeilen um den Wert von <f> erhöht.

Der Wert in Spalte <si> wird für alle selektierten Zeilen um den Wert von <f> vermindert.

Dabei kann <f> ein Datenobjekt oder selbst eine Spalte der Datenbanktabelle sein. Die Spalten werden direkt über ihren Namen benannt.

Falls mindestens eine Zeile geändert wurde, wird SY-SUBRC auf 0,ansonsten auf 4 gesetzt. SY-DBCNT wird auf die Anzahl der geänderten Zeilen gesetzt.

Bei der Verwendung von SET-Anweisungen ist die dynamische Angabe der Datenbanktabelle nicht möglich.

Einzelne Zeilen mit Arbeitsbereichen überschreiben

Um eine einzelne Zeile in einer Datenbanktabelle mit dem Inhalt eines Arbeitsbereichs zu überschreiben, schreibt man für <lines>:

UPDATE <target> FROM <wa> .

Der Inhalt des Arbeitsbereichs <wa> überschreibt in der Datenbanktabelle <dbtab> die Zeile mit dem gleichen Primärschlüssel. Der Arbeitsbereich <wa> muß ein Datenobjekt sein, das mindestens die gleiche Länge und die gleiche Ausrichtung wie die Zeilen der Datenbanktabelle hat. Die Daten werden entsprechend der Struktur der Tabellenzeile und unabhängig von der Struktur des Arbeitsbereichs in die Datenbanktabelle gestellt. Es empfiehlt sich den Arbeitsbereich mit Bezug auf die Struktur der Datenbanktabelle zu deklarieren.

Falls die Datenbanktabelle eine Zeile mit dem gleichen Primärschlüssel wie im Arbeitsbereich angegeben enthält, wird die Operation durchgeführt und SY-SUBRC auf 0 gesetzt. Ansonsten wird keine Zeile geändert und SY-SUBRC wird auf 4 gesetzt.

Ein Kurzform obiger Anweisung ist:

UPDATE <dbtab>.

In diesem Fall wird implizit der Inhalt des Tabellenarbeitsbereich <dbtab> zum Ändern der gleichnamigen Datenbanktabelle verwendet. Der Tabellenarbeitsbereich muß mit der Anweisung TABLES deklariert werden. Die dynamische Angabe der Datenbanktabelle ist dann nicht möglich. Die vor Release 4.0 notwendige Deklaration des Tabellenarbeitsbereichs sollte heute nicht mehr verwendet werden, um Doppeldeutigkeiten zu vermeiden.

Mehrere Zeilen mit internen Tabellen überschreiben

Um mehrere Zeilen einer Datenbanktabelle mit dem Inhalt einer internen Tabelle zu überschreiben, schreibt man für <lines>:

UPDATE <target> FROM TABLE <itab> .

Der Inhalt der Zeilen der internen Tabelle <itab> überschreibt in der Datenbanktabelle <dbtab> die Zeilen mit dem gleichen Primärschlüssel. Für den Zeilentyp von <itab> gilt das gleiche wie oben für den Arbeitsbereich <wa>.

Falls eine Zeile nicht geändert werden kann, da der entsprechende Primärschlüssel nicht in der Datenbanktabelle vorhanden ist, wird gesamte Anweisung nicht abgebrochen, sondern die Bearbeitung wird mit der nächsten Zeile der internen Tabelle fortgesetzt.

Falls alle Zeilen der internen Tabelle verwendet werden, wird SY-SUBRC auf 0, ansonsten auf 4 gesetzt. Falls nicht alle Zeilen verwendet werden, kann die Anzahl der nicht verwendeten Zeilen aus der Differenz der verarbeiteten Zeilen in SY-DBCNT und der Zeilenanzahl der internen Tabelle berechnet werden. Falls die interne Tabelle leer ist , werden SY-SUBRC und SY-DBCNT auf 0 gesetzt.

Wenn mehrere Zeilen überschrieben werden sollen, ist das Arbeiten mit internen Tabellen performanter als das zeilenweise Überschreiben einzelner Zeilen.

Beispiele

UPDATE sflight SET planetype = 'A310'
price = price - '100.00'
WHERE carrid = 'LH' AND connid = '0402'.

In allen Zeilen der Datenbanktabelle SFLIGHT, in denen die Spalten CARRID und CONNID LH 402 enthalten, wird der Inhalt der Spalte PLANETYPE auf A310 gesetzt und der Inhalt der Spalte PRICE wird um 100,00 vermindert.

TABLES spfli.

DATA wa TYPE spfli.

MOVE 'AA' TO wa-carrid.
MOVE '0064' TO wa-connid.
MOVE 'WASHINGTON' TO wa-cityfrom.
...
UPDATE spfli FROM wa.

MOVE 'LH' TO spfli-carrid.
MOVE '0017' TO spfli-connid.
MOVE 'BERLIN' TO spfli-cityfrom.
...
UPDATE spfli.

CARRID und CONNID sind die Felder des Primärschlüssels der Tabelle SPFLI. Alle Feldwerte in den Zeilen, in denen der Primärschlüssel AA 0064" oder LH 0017" ist, werden durch die Werte des Arbeitsbereichs WA bzw. des Tabellenarbeitsbereichs SPFLI ersetzt. Die Variante mit einem durch TABLES deklarierten Tabellenarbeitsbereich sollte nicht mehr verwendet werden.

 

DATA: itab TYPE HASHED TABLE OF spfli
WITH UNIQUE KEY carrid connid,
wa LIKE LINE OF itab.

wa-carrid = 'UA'. wa-connid = '0011'. wa-cityfrom = ...
INSERT wa INTO TABLE itab.

wa-carrid = 'LH'. wa-connid = '1245'. wa-cityfrom = ...
INSERT wa INTO TABLE itab.

wa-carrid = 'AA'. wa-connid = '4574'. wa-cityfrom = ...
INSERT wa INTO TABLE itab.

...

UPDATE spfli FROM TABLE itab.

Es wird eine Hash-Tabelle ITAB gefüllt und die Zeilen in SPFLI, die in den Feldern des Primärschlüssels (CARRID und CONNID) den gleichen Inhalt wie eine Zeile der interne Tabelle haben, werden von dieser überschrieben.