APPEND

15.1 APPEND

1. APPEND

APPENDは、 内部テーブルにレコードを追加します。
APPENDは単に内部テーブルの最終行に値を追加していくため、行指定を行いたい場合は後述のINSERTを使用してください。
構造と内部テーブルは、同じ構造データ型でなければいけません。
また、ソートテーブルにAPPENDは使用できません。

APPEND

「サンプルコード」①

1REPORT ZR_KANDA_CUSLIST1_K.
2DATA: BEGIN OF LINV OCCURS 0,
3      NAME(20) TYPE C,
4      ID_NUMBER TYPE I,
5END OF LINV.
6 
7DATA NN TYPE I.
8DATA NNN TYPE C.
9 
10NNN = '1'.
11NN = NNN.
12 
13DATA TABLE1 LIKE STANDARD TABLE OF LINV.
14LINV-NAME = 'Melissa'.
15LINV-ID_NUMBER = 105467.
16 
17*&---------------------------------------------------------------------*
18*& APPEND
19*&---------------------------------------------------------------------*
20APPEND LINV TO TABLE1.
21 
22LOOP AT TABLE1 INTO LINV.
23 
24WRITE:
25  / LINV-NAME, LINV-ID_NUMBER.
26ENDLOOP.

実行結果

補足(OCCURSについて)

OCCURSをつけると構造と内部テーブルが同じ名前で同時に作成されます(エラーにはならない仕様)。

しかし、同名であるのでプログラム内での可読性が下がるため、現在では使用禁止なプロジェクトが多いです。
なお、OCCURSの後ろの数字は内部テーブルの行数を表していて、作成段階であらかじめ内部テーブルの行数が決まってしまいます。

その内部テーブルを取得先にしてSELECTを行った場合に、取得データ件数と用意されていた行数に対して過不足が発生する可能性があるため、使用が推奨されていません。

OCCURSに 0 を指定すると 16~100の間で自動的に割当がされるようになります。
ただし、上記でも述べましたが、現在では使用禁止なプロジェクトが多いです。
サンプルとしては、あまり適切ではないのですが、過去のプログラム等で見かけるかと思いますので、
参考にしていただければと思います。

補足(内部テーブルの表記についてについて)

” [] “は内部テーブルを表します。
古い書き方で「ヘッダ付き内部テーブル」というものがあり、これが宣言されると同名の構造と内部テーブルが作成されます(OCCURSにより宣言)。
同名のデータオブジェクトが作成されてしまうので、例えばCLEAR XXXX.という初期化を行った場合に、
構造/内部テーブルのどちらXXXXを初期化すればよいのかプログラム側から判別しづらくなります。
その混乱を避けるために、内部テーブルを指定する場合には[]を書くことで、
そのデータオブジェクトが内部テーブルを示しているということを明示させるために使用されていました。
ちなみに現在ではヘッダ付き内部テーブルが使用されないため、[]の記載は省略可能となっています。
使われるとすれば、内部テーブル間の代入時くらいとなります。

「サンプルコード」②

1REPORT ZCUSLIST1_K_STANDARD.
2TYPES:
3 BEGIN OF ST_LINV,
4  NAME(20)  TYPE C,
5  ID_NUMBER TYPE I,
6 END OF ST_LINV.
7 
8DATA LINV TYPE ST_LINV.
9DATA TABLE1 TYPE STANDARD TABLE OF ST_LINV.
10 
11DATA NN  TYPE I.
12DATA NNN TYPE C.
13 
14NNN = '1'.
15NN = NNN.
16 
17LINV-NAME = 'Melissa'.
18LINV-ID_NUMBER = 105467.
19 
20*&---------------------------------------------------------------------*
21*& APPEND
22*&---------------------------------------------------------------------*
23APPEND LINV TO TABLE1.
24 
25LOOP AT TABLE1 INTO LINV.
26 
27WRITE:
28  / LINV-NAME, LINV-ID_NUMBER.
29ENDLOOP.

実行結果

補足(カンマ区切りについて)

カンマ区切りを表示させないようにする方法としては、
WRITEのオプションで NO-GROUPING を使用すると、カンマ区切りが表示させないようにできます。

補足(NNN = \’1\’.
   NN = NNNの処理について)

意味合いとしては、Cの文字型 から Iの数値型への変換(キャスト)が可能であることを
表すための部分となります。


NEXT>> 15.2 INSERT

f