【ABAP】UPDATE命令→レコード更新を3分で解説

ABAP

本ページでは、データベーステーブルのレコード更新を行うUPDATE命令の使い方を初心者向けに解説します。

UPDATE命令は文字通りレコードの更新を行う命令です。利用シーンに応じていくつかコーディングパターンがあるので、1つ1つ丁寧に理解しておきましょう。

このページで学べる内容
  • UPDATE命令の構文ルール
    • UPDATE (DBテーブル) SET ~ WHERE
    • UPDATE (DBテーブル) FROM
  • UPDATE命令の注意点・使い方

SAPエンジニア/ABAPerを目指す方であれば知らないと恥ずかしい超・基本知識の1つです!是非最後までご覧ください。

スポンサーリンク

ABAP:UPDATE命令

UPDATE命令は、データベーステーブルのレコードを更新する命令です。

注意点は内部テーブルに対する更新は行えない・・・という点です。

内部テーブルの更新を行うにはMODIFY命令を利用します。

UPDATE命令は更新したい項目を1つ1つ指定して更新する方法もあれば、構造や内部テーブルの値でDBテーブルを更新する方法もあります。

UPDATE文利用→2パターン
  • UPDATE (DBテーブル) SET ~ WHERE ~
  • UPDATE (DBテーブル) FROM ~

このページでは、両方のコーディング方法をサンプルコード付きで解説します。

UPDATE命令:SETオプション

はじめにSETオプションを利用して更新する項目を個別に指定するパターンのコーディング方法を解説します。

UPDATE命令:パターン①
UPDATE  (DBテーブル) 
  SET   (DBテーブル)-(項目名) = "書き換えたい値"
  WHERE (条件).

WHERE句で指定した条件に合致するレコードを、SET句に記述した内容で更新(UPDATE)します。

簡単なサンプルコードを見てみましょう。

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命令を知りたい方はこちら

"LOOP命令" は内部テーブルのレコードを1行1行処理していく命令です。レコード数が100個あれば、100回。10000個あれば、10000回処理を繰り返します。

詳しく学習したい方は以下の記事をご覧ください。

フィールドシンボル
LOOP AT LT_Y001 ASSIGNING <LT_Y001>.

<>に囲まれた文字列はフィールドシンボルと呼ばれる特殊なオブジェクトです。

本ページに記載したサンプルコードを完全に理解するためにはフィールドシンボルの知識も必要です。是非この機会に合わせて勉強しておきましょう!

詳しく学習したい方は以下の記事をご覧ください。

UPDATE命令の注意点:WHERE句での条件漏れ

SETオプションを利用する場合において気を付けなければならないのがWHERE句の条件漏れです。

例えば以下のようなテーブルが存在するとします。

ABAP UPDATE

ここで以下のような形でUPDATEをかけるとどうなるでしょうか。

UPDATE Z_STUDENT_LIST     " 生徒名簿テーブル
  SET  
    Z_JUSHO  = '北海道'   " 住所を「北海道」に更新
  WHERE
    Z_FM     = '男'.      " 条件→「男」

答えは「条件に合致するすべてのレコードが更新されてしまう」です。つまり、以下の「性別」項目が「男」となっているレコードが一変に更新されます。

ABAP UPDATE

例えば、WHERE条件にすべてのレコードが合致してしまうような条件を記載していると、そのデータベーステーブル内のすべてのレコードが更新されてしまう!ことも起きえますのでUPDATE命令を利用する際には細心の注意が必要です。

UPDATE命令:FROMオプション

続いて構造や内部テーブルの値をもとにレコード更新を行うコーディング方法の解説です。

UPDATE命令:パターン②
******単一レコードを更新する場合******
UPDATE (DBテーブル) FROM (構造).

******複数レコードを更新する場合******
UPDATE (DBテーブル) FROM TABLE (内部テーブル).

指定した構造/内部テーブルのキー項目と一致するレコードが更新対象となります。

分かりやすいように説明すると、例えば生徒名簿テーブルで出席番号がキー項目となっているとします。構造に格納されている出席番号が「2」の場合、テーブルのレコード更新されるのは、出席番号が「2」のレコードとなるということです。

ただし、ご覧のようにこの記述方法だと、更新する内容や更新条件がわかりづらくなってしまうというのがデメリットです。

UPDATE Y001 FROM LS_Y001.
変数/構造/内部テーブルの違いがよくわからない方は・・・

この章では「構造」「内部テーブル」といったABAP用語を用いました。

以下のページでは初心者向けにわかりやすくABAPの基本知識である構造と内部テーブルの違いを解説しています。合わせてご覧ください。

UPDATE命令:リターンコード(システム項目)

UPDATE命令の結果はシステム項目 "SY-SUBRC" に格納されます。

UPDATE命令の結果

またUPDATE命令によって更新されたレコード数はINSERT命令同様「SY-DBCNT」に格納されます。UPDATE命令の結果をいくつかのレコードずつに分けてコミットしたい場合などに使う場合もありますので合わせて覚えておきましょう。

ビューに対する更新も可能

ビューに対する行更新も可能です。が、INSERT文と同様、対象のビューが①単一のテーブルから構成されていることと、②ビューの設定として「変更可能」になっていることが条件となります。

※ビューについて詳しく知りたい方は以下の記事をご覧ください。

SAP / ABAPを1から学習したい方は

SAP / ABAPを1から学習したい初心者の方向けに、できるだけ網羅的にABAPが理解できるよう以下ページに知識体系を整理しています。

特に初心者のうちは、どこから学べばよいか?どう勉強すれば良いか?すらわからない状態になりがち。

ある程度の知識を持ったうえで、はじめて実践的な理解へとつながります。

タイトルとURLをコピーしました