MODIFY
15.3 MODIFY
MODIFYは、内部テーブルの既存行を更新する命令です。
ここで扱うのは「内部テーブルのMODIFY」であり、DB更新(Open SQLのMODIFY)とは話が別です。Open SQLのMODIFYはパフォーマンス低下が懸念されるため推奨されにくい一方、内部テーブル操作なら問題ありません。
また、近年ではMODIFYは使用せずにフィールドシンボルを使い、値を変更する書き方が主流となっています。詳しくは24章で学習するため、当章では従来の書き方を学習しましょう。
行の内部テーブルキーの内容と<構造>の内容のキーが一致する場合、その行は変更されるものと判定されます。一意でないキーがあるテーブルの場合、最初に見つかったエントリが変更されます。
構文①-2>>、更新する行数を指定することができます。
更新したい行数 と 内部テーブルの更新する項目名を<項目名>に設定します。
条件式による変更は、次のような構文になります。
この構文では、条件式に当てはまるレコードのく項目名>のみを変更することが可能です。
内部テ一ブルに条件式に当てはまるレコードが複数存在した場合、そのすべてを更新します。
「サンプルコード」①:キー一致で更新
REPORT Z_SAMPLE153.
"------------------------------------------------------------
" 目的:
" SORTED TABLE(キー col1)に 1~4 を作り、
" col1 = 2 の行だけ col2 を100 に更新する(MODIFY)
"------------------------------------------------------------
TYPES: BEGIN OF TY_LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF TY_LINE.
DATA: LT_ITAB TYPE SORTED TABLE OF TY_LINE WITH NON-UNIQUE KEY COL1,
LS_LINE TYPE TY_LINE.
START-OF-SELECTION.
DO 4 TIMES.
LS_LINE-COL1 = SY-INDEX.
LS_LINE-COL2 = SY-INDEX ** 2.
INSERT LS_LINE INTO TABLE LT_ITAB. "SORTEDなのでAPPENDよりINSERT
ENDDO.
"更新(キー col1 が一致する行を更新)
CLEAR LS_LINE.
LS_LINE-COL1 = 2.
LS_LINE-COL2 = 100.
MODIFY TABLE LT_ITAB FROM LS_LINE.
LOOP AT LT_ITAB INTO LS_LINE.
WRITE: / LS_LINE-COL1, LS_LINE-COL2.
ENDLOOP.
「サンプルコード」②:INDEX + TRANSPORTING差し替え
REPORT Z_SAMPLE153.
"------------------------------------------------------------
" 目的:
" SORTED TABLE(キー col1)に 1~4 を作り、
" col1 = 2 の行だけ col2 を100 に更新する(MODIFY)
"------------------------------------------------------------
TYPES: BEGIN OF TY_LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF TY_LINE.
DATA: LT_ITAB TYPE STANDARD TABLE OF TY_LINE WITH EMPTY KEY,
LS_LINE TYPE TY_LINE.
START-OF-SELECTION.
DO 4 TIMES.
LS_LINE-COL1 = SY-INDEX.
LS_LINE-COL2 = SY-INDEX ** 2.
APPEND LS_LINE TO LT_ITAB. "SORTEDなのでAPPENDよりINSERT
ENDDO.
"更新(キー col1 が一致する行を更新)
CLEAR LS_LINE.
LS_LINE-COL1 = 2.
LS_LINE-COL2 = 100.
MODIFY TABLE LT_ITAB FROM LS_LINE.
LOOP AT LT_ITAB INTO LS_LINE.
WRITE: / LS_LINE-COL1, LS_LINE-COL2.
ENDLOOP.
実行結果(どっちのサンプルコードも実行結果は同じです。)