PR

【ABAP】MODIFY命令:行の変更/挿入を3分で解説

ABAP

内部テーブルやデータベーステーブルへ行の変更 or 挿入処理を行うMODIFY命令についてABAP初心者向けにわかりやすく3分で解説します。

MODIFY命令は指定した値がテーブルに存在すればUPDATE命令と同じ処理を。指定した値がテーブルになければINSERT命令と同じ処理をする命令です。

UPDATE命令やINSERT命令、内部テーブルとDBテーブルによる処理の違いなどサンプルコード付きで1から解説します。

このページで学べる内容
  • MODIFY命令とは?
    • INSERT命令/UPDATE命令
  • MODIFY命令を利用したサンプルコード
  • MODIFY命令の注意点

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

スポンサーリンク

ABAP:MODIFY命令

MODIFY命令は内部テーブル/DBテーブルに対して行の変更 or 挿入を行う命令です。

DBテーブルの場合は指定したレコードが対象のテーブルに存在していれば行の変更を、指定したレコードが対象のテーブルに存在していなければ行の挿入を行います。

また内部テーブルに対しては項目を指定して対象の行を変更することができます。

構文ルール:MODIFY命令

MODIFY命令は変更/挿入したい行数に応じて書き方が異なります。また変更対象が内部テーブルかDBテーブルか?によっても書き方が異なります。

ここでは以下4パターンごとにコーディング方法を分けて記載します。

ABAP:MODIFY命令
  • パターン①:DBテーブルの単一行変更/挿入
  • パターン②:DBテーブルの複数行変更/挿入
  • パターン③:内部テーブルの単一行変更/挿入
  • パターン④:内部テーブルの複数行変更/挿入

MODIFY命令パターン①:DBテーブルの複数行変更/挿入

構文ルール①:MODIFY命令
MODIFY (DBテーブル) FROM (構造).

指定した (構造) の値で対象の (DBテーブル) の行を更新/挿入します。

構造のキーと一致する行は更新を、そうでない場合は新規挿入します。

MODIFY命令は処理の前に更新 or 挿入を判別するためパフォーマンスがよくありません。

したがって、もしINSERT命令かUPDATE命令で代替できる場面であればMODIFY命令の利用は控えたほうが良いでしょう。

MODIFY命令パターン②:DBテーブルの複数行変更/挿入

構文ルール②:MODIFY命令
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命令
MODIFY TABLE (内部テーブル) FROM (構造) (オプション).

指定した (構造) の値で (内部テーブル) の値を更新します。(構造) の値と合致する行が複数ある場合でも更新されるのは最初にマッチした1件だけ、というのがポイントです。

また、内部テーブルを更新する際のMODIFYはパフォーマンスはあまり落ちません。

またオプションで「TRANSPORTING」を指定することで更新対象の項目を指定することができます。

例えば以下のような内部テーブルがある場合にTRANSPORTINGを利用した場合は次のような処理が行われます。

NUMBERIDNAME
110001SATO
210002SUZUKI
変更前:TEST_ITAB
* 構造へ値を代入
TEST_WORK-NUMBER = 2.
TEST_WORK-ID     = '10002'.
TEST_WORK-NAME   = 'NAKAMURA'.

* NAME項目だけを変更
MODIFY TABLE TEST_ITAB FROM TEST_WORK TRANSPORTING NAME.
NUMBERIDNAME
110001SATO
210002NAKAMURA
変更後:TEST_ITAB

MODIFY命令パターン④:内部テーブルの複数行変更/挿入

構文ルール④:MODIFY命令
MODIFY (内部テーブル) FROM (構造) TRANSPORTING (項目名)...WHERE (条件式).

WHEREオプションで指定した条件を満たす全てのデータを (構造) の値で更新します。

条件を指定する場合は、TRANSPORTINGの指定が必須となる点に注意しましょう。

NUMBERIDNAMENAME2
110001SATOTARO
210002SUZUKIICHIRO
310003SUZUKIJIRO
変更前:TEST_ITAB
* 構造へ値を代入
TEST_WORK-NAME2 = 'SABURO'.

* 条件を満たすNAME2をすべて変更
MODIFY TTEST_ITAB FROM TEST_WORK TRANSPORTING NAME2 WHERE NAME = 'SUZUKI'.
NUMBERIDNAMENAME2
110001SATOTARO
210002SUZUKISABURO
310003SUZUKISABURO
変更前:TEST_ITAB

MODIFY命令:INDEXオプション

内部テーブルの変更を行う場合にはINDEXオプションを利用して変更対象の行を指定することができます。

INDEXオプション
MODIFY (内部テーブル) FROM (構造) INDEX (インデックス).

INDEXオプションを利用した場合の処理を見てみましょう。

NUMBERIDNAMENAME2
110001SATOTARO
210002SUZUKIICHIRO
310003SUZUKIJIRO
変更前:TEST_ITAB
* 構造へ値を代入
TEST_WORK-NAME2 = 'SABURO'.

* 条件を満たすNAME2をすべて変更
MODIFY TTEST_ITAB FROM TEST_WORK INDEX 2 TRANSPORTING NAME2.
NUMBERIDNAMENAME2
110001SATOTARO
210002SUZUKISABURO
310003SUZUKIJIRO
変更前:TEST_ITAB

"INDEX 2" と指定したので2行目が変更されています。

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

初めてABAPを勉強するのは結構難しいですよね。

でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。

ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?

あなたの技術、もっと価値ある場所で活かしませんか?
SAPエンジニアのキャリア支援はこちらから↓

No.1 > 外資系・IT業界などハイクラスの転職なら【アクシスコンサルティング】blank
4人に1人のコンサルタントが選ぶパートナー!
ビッグ4やアクセンチュアへの転職を実現し年収1000万へ。

No.2 > IT・Web転職特化エージェント【レバテックキャリアblank
blank
サービス利用者数20万人突破。

平均年収アップ率77%であなたの転職成功を保証します。

No.3 > blankリクルートエージェント
blank
\転職支援実績NO.1/

応募が殺到しすぎるが故に・・・非公開にせざるを得ない魅力的な求人が多数!

読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
ABAPSAP
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました