!--a11y-->

内部テーブルの単一の行を変更するには、MODIFY 命令を使用します。テーブルキーを使用してそのキーを使用する単一の行を検索して変更するか、特定の条件を満たす複数の行を検索して変更することができます。テーブルのキーが一意でなく、重複エントリがある場合は、最初のエントリが変更されます。
単一の行を変更するには、以下の命令を使用します。
MODIFY TABLE <itab> FROM <wa> [TRANSPORTING <f1> <f2> ...].
作業領域 <wa> ( 内部テーブルの行データ型と互換性がなければなりません) は、この命令では 2 つの役目を果たします。つまり、変更する行を検索するために使用されるだけでなく、新しい内容が格納されます。内部テーブルで、テーブルキーが<wa> のキー項目と一致する行が検索されます。
以下のように関連する行が検索されます。
キ 標準テーブル
ライナー検索。この検索では実行時間がテーブルエントリ数と正比例します。最初に検出されたエントリが変更されます。
キ ソートテーブル
バイナリ検索。この検索では、実行時間がテーブルエントリ数と対数比例します。最初に検出されたエントリが変更されます。
キ ハッシュテーブル
内部テーブルのハッシュアルゴリズムを使用してエントリが検索されます。実行時間はテーブルエントリ数とは無関係です。
行が検出されると、作業領域の非キー項目の内容が対応する行の項目にコピーされ、SY-SUBRC は 0 に設定されます。行が検出されない場合は、SY-SUBRC が 4 に設定されます。テーブルのキーが一意でない場合に、重複エントリが検出されると、最初のエントリが変更されます。
TRANSPORTING オプションで、テーブル行に割り当てる非キー項目を指定することができます。また、(<n i>) の書式で項目 <n i> の内容として項目 <f i> を動的に指定することもできます。命令の実行時に <n i> が空である場合は、その項目は無視されます。オフセットと長さを指定して、検索を一部の項目に制限することができます。
複雑な行構造を持つテーブルの場合、不要なテーブル類似のコンポーネントが転送されてはならないときに、転送オプションを使用することによってパフォーマンスが向上します。
条件を使用して行を変更するには、以下の命令を使用します。
MODIFY <itab> FROM <wa> TRANSPORTING <f1> <f2> ...WHERE <cond>.
この命令によって、論理条件 <cond> を満たすすべての行が処理されます。論理条件は、複数の比較で構成することができます。各比較では、最初のオペランドが行構造のコンポーネントでなければなりません。テーブルの行が構造化されていない場合、最初のオペランドを式 TABLE LINE にすることもできます。このようにすると、比較が行全体に適用されます。
作業領域 <wa> ( 内部テーブルの行データ型と互換性がなければなりません) には新しい内容が格納されます。この内容は、TRANSPORTING オプションを使用して関連するテーブル行に割り当てられます。前述の MODIFY 命令とは異なり、ここではTRANSPORTING オプションは任意指定ではありません。さらに、内部テーブルが標準テーブルである場合は、その内部テーブルのキー項目しか変更することができません。SY-SUBRC は、1 行でも変更された場合は 0 に設定され、行が変更されなかった場合は 4 に設定されます。

DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF
LINE.
DATA ITAB LIKE HASHED TABLE OF LINE WITH UNIQUE KEY COL1.
DO 4
TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
INSERT LINE INTO TABLE
ITAB.
ENDDO.
LINE-COL1 = 2. LINE-COL2 = 100.
MODIFY TABLE ITAB FROM LINE.
LOOP AT ITAB INTO
LINE.
WRITE: / LINE-COL1, LINE-COL2.
ENDLOOP.
出力は以下のようになります。
1 1
2 100
3 9
4 16
ハッシュテーブルに平方数の一覧が書き込まれます。MODIFY 命令によって、キー項目 COL1 の値が 2 のテーブルの行が変更されます。

DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF
LINE.
DATA ITAB LIKE HASHED TABLE OF LINE WITH UNIQUE KEY COL1.
DO 4
TIMES.
LINE-COL1 =
SY-INDEX.
LINE-COL2 = SY-INDEX **
2.
INSERT LINE INTO TABLE
ITAB.
ENDDO.
LINE-COL2 = 100.
MODIFY ITAB FROM LINE
TRANSPORTING COL2
WHERE ( COL2 > 1 ) AND ( COL1 < 4 ).
LOOP AT ITAB INTO
LINE.
WRITE: / LINE-COL1,
LINE-COL2.
ENDLOOP.
出力は以下のようになります。
1 1
2 100
3 100
4 16
ハッシュテーブルに平方数の一覧が書き込まれます。MODIFY 命令によって、項目 COL2 の内容が 1 より大きく、項目 COL1 の内容が 4 より小さいテーブルの行が変更されます。