INSERT
15.2 INSERT
2. INSERT
INSERTを使用することで、内部テーブルに値を挿入することができます。
また、追加する行指定ができるため、内部テーブルの一番先頭にレコードを挿入することも可能です。この時、内部テーブルと挿入したい構造は同じ構造データ型でなければいけません。
INSERT
「サンプルコード」①
REPORT ZCUSLIST1_K_INSERT. DATA: BEGIN OF itable1 OCCURS 4, F1 LIKE SY-INDEX, END OF itable1. DO 4 TIMES. itable1-F1 = sy-index. APPEND itable1. ENDDO. *&---------------------------------------------------------------------* *& INSERT① *&---------------------------------------------------------------------* itable1-F1 = -96. INSERT itable1 INDEX 2. LOOP AT itable1. WRITE: / itable1-F1. ENDLOOP. *&---------------------------------------------------------------------* *& INSERT② *&---------------------------------------------------------------------* LOOP AT itable1 Where F1 => 3. itable1-F1 = -78. INSERT itable1. ENDLOOP. *6Skip. LOOP AT itable1. WRITE: itable1-F1. ENDLOOP.
実行結果
補足(構文の省略について)
DATA: BEGIN OF ITABLE1 OCCURS 4,
F1 LIKE SY-INDEX,
END OF ITABLE1.
該当ソースコードについて説明いたします。
上記は、OCCURSを使用したことによって、内部テーブルと構造を宣言しております。
特殊なやり方で同じ名前で、形は違う(内部テーブル、構造)という状態となり、
同じ名前を使用するため通常の構文にある”INTO <内部テーブル>” 省略して書くことが出来ます。
(※推奨ではありません。)
DO 4 TIMES.
ITABLE1-F1 = SY-INDEX.
APPEND ITALBE1.
ENDDO.
該当ソースコードについて説明いたします。
①DO 4 TIMES で4回 ループを繰り返します。
②ループに入ると SY-INDEX(現在ループの件数がカウントされます。)が1になります。
③構造ITABLE の F1 という項目に SY-INDEXの値「1」が格納されます。
④APPEND 命令 により 構造 ITABLE1 を 内部テーブル ITABLE1 に 追加します。
こちらの通常通りの書き方は以下の通りになります。
APPEND ITABLE1 TO ITABLE1.
再度、説明になりますが、今回は、OCCURSを使用したことによって、内部テーブルも構造も同じ名前で、
形は違う(内部テーブル、構造)が同じ名前に格納するため ” TO <内部テーブル>” 省略して書くことが出来ます。
(※推奨ではありません。)
⑤2回目のループに入り、SY-INDEX(現在ループの件数がカウントされます。)が2になります。
⑥構造ITABLE の F1 という項目に SY-INDEXの値「2」が格納されます。
(元々入っていた「1」という値は上書きされます。)
⑦APPEND 命令 により 構造 ITABLE1 を 内部テーブル ITABLE1 に 追加します。
⑧ ⑤~⑦ を 3回目 4回目と繰り返します。
⑨ 4回繰り返すと 内部テーブル ITABLE1 の中身が
内部テーブルITABLE1
項目名
「F1」
1
2
3
4
上記となります。
itable1-F1 = -96.
INSERT itable1 INDEX 2.
LOOP AT itable1.
WRITE:
/ itable1-F1.
ENDLOOP.
上記ソースコードの説明になります。
構造ITABLE1 の項目F1に -96 を格納
INSERT itable1 INDEX 2.
上記は通常の構文では以下になります。
INSERT ITABLE1 INTO ITABLE1 INDEX 2.
同じ説明が続きますが、OCCURSを使用したことによって、内部テーブルも構造も同じ名前で、
形は違う(内部テーブル、構造)が同じ名前に格納するため “INTO <内部テーブル>” 省略して書くことが出来ます。
(※推奨ではありません。)
INDEXオプション を使用することで、内部テーブル ITABLE1 の2行目に 構造 ITABLE1(F1に-96 が入っている行) を挿入するという意味になります。
内部テーブル ITABLE
行 値(F1)
1 1
2 2
3 3
4 4
だったものが、
INSERT ITABLE1 INTO ITABLE1 INDEX 2.
とすることで
内部テーブル ITABLE
行 値(F1)
1 1
2 -94
3 2
4 3
5 4
上記のように 値が入ります。
LOOP AT ITABLE1 WHERE F1 => 3.
ITABLE1-F1 = -78.
INSERT ITABLE1.
ENDLOOP.
上記ソースコードについて説明します。
上記は、テーブルのITABLE1 の中に格納されているデータでF1が3以上の場合は
構造ITABLE1 のF1 に-78 を格納し、
該当の行の前に-78のデータを挿入するという繰り返し構文になっています。
内部テーブル ITABLE
行 値(F1)
1 1
2 -94
3 2
4 3
5 4
上記のように 値が入っていますので、
該当は値(F1)が3以上が対象なので 3、4 で2行該当します。
結果
内部テーブル ITABLE
行 値(F1)
1 1
2 -94
3 2
4 -78
5 3
6 -78
7 4
上記のようになります。
サンプルでは、テーブルに挿入して終わっていますので、
サンプルに
LOOP AT itable1.
WRITE:
/ itable1-F1.
ENDLOOP.
上記後ろに追記したものを作成して頂くと、
上記のような結果が表示されます。
「サンプルコード」②
REPORT ZCUSLIST1_K_INSERT_KANDA. TYPES: BEGIN OF TYP_INDEX, F1 LIKE SY-INDEX, END OF TYP_INDEX. DATA:ST_INDEX TYPE TYP_INDEX. DATA:IT_INDEX TYPE STANDARD TABLE OF TYP_INDEX. DO 4 TIMES. ST_INDEX-F1 = SY-INDEX. APPEND ST_INDEX TO IT_INDEX. ENDDO. *&---------------------------------------------------------------------* *& INSERT① *&---------------------------------------------------------------------* ST_INDEX-F1 = -96. INSERT ST_INDEX INTO IT_INDEX INDEX 2. LOOP AT IT_INDEX INTO ST_INDEX. WRITE: / ST_INDEX-F1. ENDLOOP. *&---------------------------------------------------------------------* *& INSERT② *&---------------------------------------------------------------------* LOOP AT IT_INDEX INTO ST_INDEX WHERE F1 => 3. ST_INDEX-F1 = -78. INSERT ST_INDEX INTO IT_INDEX. ENDLOOP.
サンプル①のややこしさを解消するとサンプル②のようになります。
実行結果
補足(SY-INDEXについて)
サンプルの
F1 LIKE SY-INDEX
上記については、 ”SY-INDEX” というものに似せて “F1” を作成するという意味になります。
SY-INDEX についてですが、
ABAP プログラムでは、常にABAP システム項目を使用することができ、
SY-INDEX はそのシステム項目の1つになります。
SY-INDEX は 現在のループパス件数 が格納されるシステム項目です。
上記のシステム項目は、 SE11 → データ型 → SYST と入力 → 実行
で一覧を見ることが出来ます(SYを省いた形で表示されます)
その中の INDEX を確認すると データ型が “INT4” ですので
F1 LIKE SY-INDEX
上記を見返しますと
F1 を システム項目 SY-INDEX(INT4)の形に似せた変数と宣言する という意味になります。