!--a11y-->

MODIFY 命令で、索引を使用してテーブル内の行を変更することができます。標準テーブルを変更する場合に使用できる WRITE TO 命令の特殊なバリアントもあります。
索引を使用して単一の行を変更するには、以下の命令を使用します。
MODIFY <itab> FROM <wa> [INDEX <idx>] [TRANSPORTING <f1> <f2> ... ].
<itab> の既存の行が FROM オプションで指定した作業領域<wa> に置き換えられます。作業領域は、内部テーブルの行データ型に変換できなければなりません。
INDEX オプションを使用すると、作業領域の内容で索引 <idx> を持つ行の内容が上書きされます。操作が正常に実行されると、SY-SUBRC が 0 に設定されます。内部テーブルの行数が <idx> より少ない場合は、SY-SUBRC が 4 に設定されます。
INDEX オプションを使用しない場合は、上記の命令は LOOP 内でのみ使用することができます。この場合は、現在のループ行を変更します (<idx> は暗黙的に SY-TABIX に設定されます) 。
ソートテーブルの行を変更する場合は、キー項目の内容は変更できず、キー項目の内容を別の値に置き換えようとすると実行時エラーが発生することに注意してください。ただし、同じ値を割り当てることはできます。
TRANSPORTING オプションを使用すると、変更する項目を一覧で明示的に指定することができます。テーブルエントリの変更も参照してください。ソートテーブルを変更する場合は、キー以外の項目のみを指定してください。
以下の命令を使用して、標準テーブルの行を変更することができます。
WRITE <f> TO <itab> INDEX <idx>.
この WRITE TO 命令のバリアントでは、項目 <f> の内容が C 型に変換され、変換された文字列が索引<idx> を持つ行に転送されます。操作が正常に実行されると、SY-SUBRC が 0 に設定されます。内部テーブルの行数が <idx> より少ない場合は、SY-SUBRC が 4 に設定されます。
<f> のデータ型は、文字項目に変換できなければなりません。変換できない場合は、構文エラーまたは実行時エラーが発生します。行は、実際の行データ型に関係なく、常に文字列として解釈されます。通常の WRITE TO 命令の場合と同様の方法で、コンポーネントを処理することができます。この命令は、正確な位置がすでにわかっている単一の文字を変更する場合に、構造化された行データ型に対してのみ使用してください。また、構造が単一の文字項目で構成されている内部テーブルを使用することもできます。この種のテーブルは、通常は動的プログラミングで使用されます。

DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF
LINE.
DATA ITAB LIKE TABLE OF LINE.
DO 3
TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
APPEND LINE TO ITAB.
ENDDO.
LOOP AT ITAB INTO
LINE.
IF SY-TABIX = 2.
LINE-COL1 = SY-TABIX * 10.
LINE-COL2 = ( SY-TABIX * 10 ) ** 2.
MODIFY ITAB FROM LINE.
ENDIF.
ENDLOOP.
LOOP AT ITAB INTO
LINE.
WRITE: / SY-TABIX, LINE-COL1, LINE-COL2.
ENDLOOP.
出力は以下のようになります。
1
1 1
2 20 400
3
3 9
ここでは、ソートテーブル ITAB が作成され 3 行が書き込まれます。2 番目の行が作業領域 LINE の内容に置き換えられます。

DATA NAME(4) VALUE 'COL2'.
DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
DATA ITAB LIKE SORTED TABLE OF LINE WITH UNIQUE KEY COL1.
DO 4
TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
APPEND LINE TO ITAB.
ENDDO.
LINE-COL2 = 222.
MODIFY ITAB FROM LINE INDEX 2 TRANSPORTING (NAME).
LINE-COL1 = 3.
LINE-COL2 = 333.
MODIFY ITAB FROM LINE INDEX 3.
LOOP AT ITAB INTO
LINE.
WRITE: / SY-TABIX, LINE-COL1, LINE-COL2.
ENDLOOP.
出力は以下のようになります。
1
1 1
2
2 222
3
3 333
4
4 16
この例では、ソートテーブルに 4 行が書き込まれます。2 番目と 3 番目の行のコンポーネント COL2 が変更されます。3 番目の行が変更されて LINE-COL1 の値が 3 でなくなると、ソートテーブルのキー項目は変更できないので、実行時エラーが発生します。

DATA TEXT(72).
DATA CODE LIKE TABLE OF TEXT.
TEXT = 'This is the first line.'.
APPEND TEXT TO CODE.
TEXT = 'This is the second line.It is ugly.'.
APPEND TEXT TO CODE.
TEXT = 'This is the third and final line.'.
APPEND TEXT TO CODE.
WRITE 'nice.'TO CODE+31 INDEX 2.
LOOP AT CODE INTO TEXT.
WRITE / TEXT.
ENDLOOP.
出力は以下のようになります。
This is the first line.
This is the second line.It is nice.
This is the third and final line.
ここでは、72 文字の長さの基本データ型 C を持つ内部テーブル CODE が定義されます。テーブルに 3 行が書き込まれたあと、WRITE TO 命令を使用して 2 番目の行が変更されます。単語 "ugly" が単語 "nice" に置き換えられます。