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)の形に似せた変数と宣言する という意味になります。


NEXT>> 15.3 MODIFY