!--a11y-->

INSERT 命令を使用すると、任意のデータ型の内部テーブルに行を挿入できるだけでなく、行索引を使用して行を変更することもできます。索引を使用して索引テーブルに単一の行または行グループを挿入することができます。
索引テーブルに単一の行を挿入するには、以下の命令を使用します。
INSERT <line> INTO <itab> [INDEX <idx>].
<line> は、行データ型と互換性のある作業領域か、INITIAL LINE 式です。<wa> を使用する場合は、内部テーブル <itab> に新しい行が追加され、その行に作業領域の内容が書き込まれ ます。INITIAL LINE によって、その構造の各項目の正しい初期値が含まれた空白行が挿入されます。
INDEX オプションを使用すると、索引 <idx> を持つ行の前に新しい行が挿入されます。挿入された新しいエントリには索引 <idx> が付き、後続の行の索引は 1 増えます。テーブルに <idx> - 1 行が含まれている場合、新しい行はテーブルの末尾に追加されます。テーブルの行数が<idx> - 1 より少ないと、新しい行を挿入できず、SY-SUBRC が 4 に設定されます。テーブルに行が正常に挿入された場合は、SY-SUBRC が 0 に設定されます。
INDEX オプションを使用しない場合は、上記の命令は LOOP 内でのみ使用することができます。この場合は、現在の行の前に新しい行が挿入されます (<idx> は暗黙的にSY-TABIX に設定されます) 。
標準テーブルや一意でないキーを持つソートテーブルへの行の追加は、同じキーを持つ行がすでにテーブル内にあるかどうかに関わらず実行されます。そのため、重複エントリが発生する可能性があります。一意のキーを持つソートテーブルに重複エントリを追加しようとすると、実行時エラーが発生します。同様に、ソートテーブルに行を追加して、そのテーブルのソート順序に違反した場合にも実行時エラーが発生します。
内部テーブルに複数の行を追加するには、以下の命令を使用します。
INSERT LINES OF <itab1> INTO <itab2> [INDEX <idx>].
単一の行の挿入の場合と同じルールでテーブル <itab1> の行が 1 行ずつ <itab2> に挿入されます。ITAB1 には任意のテーブルタイプを指定することができます。ITAB1 の行データ型はITAB2 の行データ型に変換できなければなりません。
索引テーブルを別の索引テーブルにアペンドする場合は、以下のようにアペンドする行を指定することができます。
INSERT LINES OF <itab1> [FROM <n1>] [TO
<n2>] INTO <itab2>
[INDEX
<idx>].
<n1> と <n2> には、ITAB2 に挿入する ITAB1 の最初の行と最後の行の索引を指定します。
テーブルの複数の行を別のテーブルに挿入するこの方法を使用すると、テーブルのサイズとテーブルを挿入する場所に応じて、ループで 1 行ずつ行を挿入するよりも最大で20 倍処理が速くなります。

DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF
LINE.
DATA ITAB LIKE TABLE OF LINE.
DO 2
TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
APPEND LINE TO ITAB.
ENDDO.
LINE-COL1 = 11. LINE-COL2
= 22.
INSERT LINE INTO ITAB INDEX 2.
INSERT INITIAL LINE INTO ITAB INDEX 1.
LOOP AT ITAB INTO
LINE.
WRITE: / SY-TABIX, LINE-COL1, LINE-COL2.
ENDLOOP.
出力は以下のようになります。
1 0 0
2 1 1
3
11 22
4 2 4
この例では、内部テーブル ITAB が作成され 2 行が書き込まれます。値が格納された新しい行が 2 番目の行の前に挿入されます。次に、初期化された行が最初の行の前に挿入されます。

DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF
LINE.
DATA ITAB LIKE TABLE OF LINE.
DO 2
TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
APPEND LINE TO ITAB.
ENDDO.
LOOP AT ITAB INTO
LINE.
LINE-COL1 = 3 * SY-TABIX.LINE-COL2 = 5 *
SY-TABIX.
INSERT LINE INTO ITAB.
ENDLOOP.
LOOP AT ITAB INTO
LINE.
WRITE: / SY-TABIX, LINE-COL1, LINE-COL2.
ENDLOOP.
出力は以下のようになります。
1
3 5
2
1 1
3
9 15
4
2 4
この例では、内部テーブル ITAB が作成され 2 行が書き込まれます。LOOP 構文を使用して、この既存の各行の前に新しい行が挿入されます。

DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF
LINE.
DATA: ITAB LIKE TABLE OF
LINE,
JTAB LIKE ITAB.
DO 3
TIMES.
LINE-COL1 = SY-INDEX.LINE-COL2 = SY-INDEX **
2.
APPEND LINE TO ITAB.
LINE-COL1 = SY-INDEX.LINE-COL2 = SY-INDEX **
3.
APPEND LINE TO JTAB.
ENDDO.
INSERT LINES OF ITAB INTO JTAB INDEX 1.
LOOP AT JTAB INTO
LINE.
WRITE: / SY-TABIX, LINE-COL1, LINE-COL2.
ENDLOOP.
出力は以下のようになります。
1
1 1
2
2 4
3
3 9
4
1 1
5
2 8
6
3 27
この例では、同じデータ型の 2 つの内部テーブルが作成されます。それぞれに、3 行が書き込まれます。次に、JTAB の最初の行の前にテーブル ITAB 全体が挿入されます。