本ページでは、データベーステーブルのレコード更新を行うUPDATE命令の使い方を初心者向けに解説します。
UPDATE命令は文字通りレコードの更新を行う命令です。利用シーンに応じていくつかコーディングパターンがあるので、1つ1つ丁寧に理解しておきましょう。
SAPエンジニア/ABAPerを目指す方であれば知らないと恥ずかしい超・基本知識の1つです!是非最後までご覧ください。
ABAP:UPDATE命令
UPDATE命令は、データベーステーブルのレコードを更新する命令です。
注意点は内部テーブルに対する更新は行えない・・・という点です。
内部テーブルの更新を行うにはMODIFY命令を利用します。
UPDATE命令は更新したい項目を1つ1つ指定して更新する方法もあれば、構造や内部テーブルの値でDBテーブルを更新する方法もあります。
このページでは、両方のコーディング方法をサンプルコード付きで解説します。
UPDATE命令:SETオプション
はじめにSETオプションを利用して更新する項目を個別に指定するパターンのコーディング方法を解説します。
簡単なサンプルコードを見てみましょう。
UPDATE Y001 SET ZZ_NAME1 = 'UPDATE_TEST' "文字列「UPDATE_TEST」" ZZ_NAME2 = SPACE "ブランク" WHERE ZZ_NAME1 = 'SUZUKI'.
上記のサンプルコードでは、WHEREオプションで「ZZ_NAME1」が「SUZUKI」となっているすべてのレコードに対して「ZZ_NAME1」を "UPDATE_TEST" に、「ZZ_NAME2」をブランクに置き換えています。
決して難しい命令ではありませんね。
SETオプションを利用するコーディング方法だと、更新される項目と条件が分かりやすくなるというメリットがあります。
LOOP命令と組み合わせたUPDATE命令
UPDATE命令はLOOP命令と組み合わせて利用するパターンが多く存在します。
LOOP AT LT_Y001 ASSIGNING <LT_Y001>. CNT = CNT + 1. UPDATE Y001 SET NAME1 = <LT_Y001>-ZZCD NAME2 = SPACE WHERE ZZCD = <LT_Y001>-ZZCD. IF SY-SUBRC <> 0. FLG_ERR = 'X'. EXIT. ELSE. * 1000件ずつコミット IF CNT = 1000. COMMIT WORK. CLEAR CNT. ENDIF. ENDIF. ENDLOOP.
"LOOP命令" は内部テーブルのレコードを1行1行処理していく命令です。レコード数が100個あれば、100回。10000個あれば、10000回処理を繰り返します。
詳しく学習したい方は以下の記事をご覧ください。
LOOP AT LT_Y001 ASSIGNING <LT_Y001>.
<>に囲まれた文字列はフィールドシンボルと呼ばれる特殊なオブジェクトです。
本ページに記載したサンプルコードを完全に理解するためにはフィールドシンボルの知識も必要です。是非この機会に合わせて勉強しておきましょう!
詳しく学習したい方は以下の記事をご覧ください。
UPDATE命令の注意点:WHERE句での条件漏れ
SETオプションを利用する場合において気を付けなければならないのがWHERE句の条件漏れです。
例えば以下のようなテーブルが存在するとします。
ここで以下のような形でUPDATEをかけるとどうなるでしょうか。
UPDATE Z_STUDENT_LIST " 生徒名簿テーブル SET Z_JUSHO = '北海道' " 住所を「北海道」に更新 WHERE Z_FM = '男'. " 条件→「男」
答えは「条件に合致するすべてのレコードが更新されてしまう」です。つまり、以下の「性別」項目が「男」となっているレコードが一変に更新されます。
例えば、WHERE条件にすべてのレコードが合致してしまうような条件を記載していると、そのデータベーステーブル内のすべてのレコードが更新されてしまう!ことも起きえますのでUPDATE命令を利用する際には細心の注意が必要です。
UPDATE命令:FROMオプション
続いて構造や内部テーブルの値をもとにレコード更新を行うコーディング方法の解説です。
分かりやすいように説明すると、例えば生徒名簿テーブルで出席番号がキー項目となっているとします。構造に格納されている出席番号が「2」の場合、テーブルのレコード更新されるのは、出席番号が「2」のレコードとなるということです。
ただし、ご覧のようにこの記述方法だと、更新する内容や更新条件がわかりづらくなってしまうというのがデメリットです。
UPDATE Y001 FROM LS_Y001.
UPDATE命令:リターンコード(システム項目)
UPDATE命令の結果はシステム項目 "SY-SUBRC" に格納されます。
条件 | SY-SUBRCの値 |
---|---|
レコードが(少なくとも1行以上)更新された場合 | 0 |
何らかの理由で1行も更新されなかった場合 | 4 |
SY-SUBRC(システム項目)の意味が不明な方はこちらの記事をご覧ください。
またUPDATE命令によって更新されたレコード数はINSERT命令同様「SY-DBCNT」に格納されます。UPDATE命令の結果をいくつかのレコードずつに分けてコミットしたい場合などに使う場合もありますので合わせて覚えておきましょう。
ビューに対する更新も可能
ビューに対する行更新も可能です。が、INSERT文と同様、対象のビューが①単一のテーブルから構成されていることと、②ビューの設定として「変更可能」になっていることが条件となります。
※ビューについて詳しく知りたい方は以下の記事をご覧ください。
SAP / ABAPを1から学習したい方は
初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!