内部テーブルやデータベーステーブルへ行の変更 or 挿入処理を行うMODIFY命令についてABAP初心者向けにわかりやすく3分で解説します。
UPDATE命令やINSERT命令、内部テーブルとDBテーブルによる処理の違いなどサンプルコード付きで1から解説します。
SAPエンジニア / ABAPエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識の1つです。是非最後までご覧ください。
ABAP:MODIFY命令
MODIFY命令は内部テーブル/DBテーブルに対して行の変更 or 挿入を行う命令です。
DBテーブルの場合は指定したレコードが対象のテーブルに存在していれば行の変更を、指定したレコードが対象のテーブルに存在していなければ行の挿入を行います。
また内部テーブルに対しては項目を指定して対象の行を変更することができます。
MODIFY命令は状況に応じてUPDATE命令とINSERT命令の処理を行ってくれる命令とも考えられます。

INSERT命令/UPDATE命令を合わせて学習したい方は以下の記事をご覧ください。
構文ルール:MODIFY命令
MODIFY命令は変更/挿入したい行数に応じて書き方が異なります。また変更対象が内部テーブルかDBテーブルか?によっても書き方が異なります。

ここでは以下4パターンごとにコーディング方法を分けて記載します。
MODIFY命令パターン①:DBテーブルの複数行変更/挿入
MODIFY (DBテーブル) FROM (構造).
指定した (構造) の値で対象の (DBテーブル) の行を更新/挿入します。
構造のキーと一致する行は更新を、そうでない場合は新規挿入します。

MODIFY命令は処理の前に更新 or 挿入を判別するためパフォーマンスがよくありません。
したがって、もしINSERT命令かUPDATE命令で代替できる場面であればMODIFY命令の利用は控えたほうが良いでしょう。
MODIFY命令パターン②:DBテーブルの複数行変更/挿入
MODIFY (DBテーブル) FROM TABLE (内部テーブル).
指定した (内部テーブル) の値で対象の (DBテーブル) の行を更新/挿入します。
内部テーブルの値をもとにDBテーブルを更新する際は、オペランドに「FROM TABLE」と指定することがポイントです。
* 構造の作成 DATA Z_TEST TYPE T100. *内部テーブルへ値を書き込み Z_TEST-SPRS1 = 'JA' . Z_TEST-ARBGB = 'Z100'. Z_TEST-RNSGNR = '100'. Z_TEST-TEXT = 'メッセージ内容~' * テーブル「T100」をMODIFY MODIFY T100 FROM Z_TEST.
テーブル「T100」に該当するキーが存在すればUPDATEを。存在しなければ新規に行を作成するサンプルコードです。

パターン①の構文よりは多少パフォーマンスが良くなるものの、それでも利用は控えたほうが良い構文です。したがって、DBテーブルを書き換える際には基本はINSERT命令かUPDATE命令を利用するようにしましょう。
関連記事→「構造」と「内部テーブル」の違いについてはこちらから
MODIFY命令パターン③:内部テーブルの単一行変更/挿入

ここからはMODIFY命令を利用して内部テーブルを書き換える方法を解説します。
MODIFY TABLE (内部テーブル) FROM (構造) (オプション).
指定した (構造) の値で (内部テーブル) の値を更新します。(構造) の値と合致する行が複数ある場合でも更新されるのは最初にマッチした1件だけ、というのがポイントです。
また、内部テーブルを更新する際のMODIFYはパフォーマンスはあまり落ちません。
またオプションで「TRANSPORTING」を指定することで更新対象の項目を指定することができます。

例えば以下のような内部テーブルがある場合にTRANSPORTINGを利用した場合は次のような処理が行われます。
NUMBER | ID | NAME |
---|---|---|
1 | 10001 | SATO |
2 | 10002 | SUZUKI |
* 構造へ値を代入 TEST_WORK-NUMBER = 2. TEST_WORK-ID = '10002'. TEST_WORK-NAME = 'NAKAMURA'. * NAME項目だけを変更 MODIFY TABLE TEST_ITAB FROM TEST_WORK TRANSPORTING NAME.
NUMBER | ID | NAME |
---|---|---|
1 | 10001 | SATO |
2 | 10002 | NAKAMURA |
MODIFY命令パターン④:内部テーブルの複数行変更/挿入
MODIFY (内部テーブル) FROM (構造) TRANSPORTING (項目名)...WHERE (条件式).
WHEREオプションで指定した条件を満たす全てのデータを (構造) の値で更新します。

条件を指定する場合は、TRANSPORTINGの指定が必須となる点に注意しましょう。
NUMBER | ID | NAME | NAME2 |
---|---|---|---|
1 | 10001 | SATO | TARO |
2 | 10002 | SUZUKI | ICHIRO |
3 | 10003 | SUZUKI | JIRO |
* 構造へ値を代入 TEST_WORK-NAME2 = 'SABURO'. * 条件を満たすNAME2をすべて変更 MODIFY TTEST_ITAB FROM TEST_WORK TRANSPORTING NAME2 WHERE NAME = 'SUZUKI'.
NUMBER | ID | NAME | NAME2 |
---|---|---|---|
1 | 10001 | SATO | TARO |
2 | 10002 | SUZUKI | SABURO |
3 | 10003 | SUZUKI | SABURO |
MODIFY命令:INDEXオプション
内部テーブルの変更を行う場合にはINDEXオプションを利用して変更対象の行を指定することができます。
MODIFY (内部テーブル) FROM (構造) INDEX (インデックス).
INDEXオプションを利用した場合の処理を見てみましょう。
NUMBER | ID | NAME | NAME2 |
---|---|---|---|
1 | 10001 | SATO | TARO |
2 | 10002 | SUZUKI | ICHIRO |
3 | 10003 | SUZUKI | JIRO |
* 構造へ値を代入 TEST_WORK-NAME2 = 'SABURO'. * 条件を満たすNAME2をすべて変更 MODIFY TTEST_ITAB FROM TEST_WORK INDEX 2 TRANSPORTING NAME2.
NUMBER | ID | NAME | NAME2 |
---|---|---|---|
1 | 10001 | SATO | TARO |
2 | 10002 | SUZUKI | SABURO |
3 | 10003 | SUZUKI | JIRO |

"INDEX 2" と指定したので2行目が変更されています。
SAP / ABAPを1から学習したい方は

初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!