!--a11y-->

データベーステーブルのデータを変更するためのオープン SQL 命令は UPDATE < 対象> < 行> です。
この命令によって、データベーステーブル < 対象> の 1 行または複数行を変更することができます。ABAP ディクショナリビューの行の変更は、ビューに 1 つのテーブルからの項目が含まれ、更新ステータスが読込と変更に定義されている場合にかぎり実行することができます。データベーステーブル < 対象> を静的または動的に指定します。
データベーステーブルを静的に指定するには、< 対象> に以下を入力します。
UPDATE <dbtab> [CLIENT SPECIFIED] < 行>.
ここで<dbtab> は、ABAP ディクショナリで定義されたデータベーステーブルの名称です。
データベーステーブルを動的に指定するには、< 対象> に以下を入力します。
UPDATE (< 名称>) [CLIENT SPECIFIED] < 行>.
ここで項目 < 名称> は、ABAP ディクショナリで定義されたデータベーステーブルの名称です。
CLIENT SPECIFIED オプションを使用して、自動クライアント処理を無効にすることができます。
データベーステーブルの特定の列を変更するには、以下を使用します。
UPDATE < 対象 > SET <set1> <set2> ...[WHERE <cond>].
WHERE 句 によって変更される行が設定されます。WHERE 句を指定しない場合は、すべての行が変更されます。データ型 <set i> は、変更対象の列とその変更方法を設定する、3 つの異なる SET 命令です。
キ <si> = <f>
列 <si> の値は、選択されたすべての行に対して値 <f> に設定されます。
キ <si> = <si> + <f>
列 <si> の値は、選択されたすべての行に対して値 <f> だけ増加します。
キ <si> = <si> - <f>
列 <si> の値は、選択されたすべての行に対して値 <f> だけ減少します。
<f> はデータベーステーブルのデータベースオブジェクトまたは列です。列は直接名を使用して指定します。
1 行でも変更されるとSY-SUBRC は 0 に設定され、変更されない場合は 4 に設定されます。SY-DBCNT には変更された行数が含まれます。
SET 命令を使用する場合は、データベーステーブルを動的に指定することはできません。
データベーステーブルの単一行を作業領域の内容で上書きする場合、以下を使用します。
UPDATE < 対象> FROM <wa>.
作業領域<wa> の内容によって、同じ一次キーを持つデータベーステーブル <dbtab> の行が上書きされます。作業領域 <wa> は、データベーステーブルの行構造と少なくとも同じ桁数および整列のデータオブジェクトでなければなりません。データは、作業領域の構造にかかわらず、テーブルの行構造にもとづいてデータベーステーブルに配置されます。データベーステーブルの構造を参照して作業領域を定義することが賢明です。
データベーステーブルに、作業領域で指定されたものと同じ一次キーを持つ行がある場合、作業は正常に終了し、SY-SUBRC は 0 に設定されます。それ以外の場合、行は挿入されず、SY-SUBRC は 4 に設定されます。
上記の命令の短縮形は UPDATE <dbtab> です。
この場合、テーブル作業領域<dbtab> の内容は同じ名称のデータベーステーブルを更新するために使用されます。このテーブル作業領域は TABLES 命令を使って宣言しなければなりません。この場合、データベーステーブルの名称を動的に指定することはできません。データベーステーブルと同じ名称のテーブル作業領域 ( リリース 4.0 以前では必須) を明確化のために使用する必要はなくなりました。
データベーステーブルの複数行を内部テーブルの内容で上書きする場合、以下を使用します。
UPDATE < 対象> FROM TABLE <itab>.
内部テーブル<itab> の内容によって、同じ一次キーを持つデータベーステーブル <dbtab> の行が上書きされます。前述の作業領域 <wa> と同じ原則が <itab> の行データ型にも適用されます。
指定されたキーを持つ行がないために行を変更できない場合は、操作全体を終了することなく内部テーブルの次の行が続いて処理されます。
内部テーブルのすべての行が処理されると、SY-SUBRC が 0 に設定されます。それ以外の場合は 4 に設定されます。すべての行が使用されない場合、内部テーブルの行の総数から SY-DBCNT で処理された行数を引くことによって未使用行の数を計算することができます。内部テーブルが空白の場合、SY-SUBRC および SY-DBCNT は 0 に設定されます。
データベーステーブルの複数行を上書きする場合は、1 行ずつ変更するよりも内部テーブルを利用した方が効率的です。

UPDATE SFLIGHT SET
PLANETYPE = 'A310'
PRICE = PRICE - '100.00'
WHERE CARRID = 'LH' AND CONNID = '0402'.
この例では、PLANETYPE 列の内容を A310 で上書きし、CARRID に ‘LH’ および CONNID に ‘402’ とある SFLIGHT の各エントリで PRICE 列の値を 100 減少します。

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 および CONNID はテーブル SPFLI の一次キー項目です。一次キー項目が "AA" と "0064" または "LH" と "0017" である行のすべての項目は、作業領域 WA またはテーブル作業領域 SPFLI の対応項目の値で上書きされます。

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.
この例では、ハッシュテーブル ITAB に書き込んでから、内部テーブルの行と同じ一次キー (CARRID および CONNID) を持つ SPFLI の行が上書きされます。