SAPABAP-内部テーブルへの入力

内部テーブルでは、入力には、選択、挿入、追加などの機能が含まれます。この章では、INSERTステートメントとAPPENDステートメントに焦点を当てます。

INSERTステートメント

INSERTステートメントは、1行または1行のグループを内部テーブルに挿入するために使用されます。

以下は、内部テーブルに1行を追加するための構文です。

INSERT <work_area_itab> INTO <internal_tab> INDEX <index_num>.

この構文では、INSERTステートメントはinternal_tab内部テーブルに新しい行を挿入します。internal_tabパラメーターの前にwork_area_itabINTO式を使用すると、新しい行を挿入できます。work_area_itab INTO式を使用すると、work_area_itab作業領域から新しい行が取得され、internal_tabテーブルに挿入されます。ただし、work_area_itab INTO式を使用して行を挿入しない場合、その行はinternal_tabテーブルのヘッダー行から取得されます。

INDEX句を使用して内部テーブルに改行を挿入すると、挿入された行の後の行のインデックス番号が1ずつ増加します。内部テーブルに<index_num> -1行が含まれている場合、新しい行はテーブルの終わり。SAPシステムが内部テーブルに行を正常に追加すると、SY-SUBRC変数が0に設定されます。

以下は、insertステートメントを使用するサンプルプログラムです。

REPORT  ZCUSLIST1. 
DATA: BEGIN OF itable1 OCCURS 4,
      F1 LIKE SY-INDEX,
      END OF itable1.
	
   DO 4 TIMES.
      itable1-F1 = sy-index.
      APPEND itable1.
   ENDDO.
	
itable1-F1 = -96.  
INSERT itable1 INDEX 2.  

LOOP AT itable1.
   Write / itable1-F1.  
ENDLOOP.  

LOOP AT itable1 Where F1 ≥ 3.
   itable1-F1 = -78.
   INSERT itable1.
ENDLOOP.

Skip.
LOOP AT itable1.
   Write / itable1-F1.
ENDLOOP.

上記のコードは次の出力を生成します-

1 
96- 
		2 
		3 
 4  
		1 
96- 
		2 
78- 
 3 
78- 
 4

上記の例では、DOループは1から4までの数字を含む4行を追加します。ヘッダー行コンポーネントitable1-F1には、-96の値が割り当てられています。Insertステートメントは、ヘッダー行を新しい行として行3の前の本文に挿入します。既存の行3は、挿入後に行4になります。LOOP ATステートメントは、F1値が3以上の行を内部テーブルから取得します。各行の前に、Insertステートメントはそのヘッダー行から新しい行を挿入します。挿入前に、F1コンポーネントは-78を含むように変更されました。

各挿入ステートメントが実行された後、システムは挿入された行の下にあるすべての行のインデックスを再作成します。これにより、大きな内部テーブルの上部近くに行を挿入するときにオーバーヘッドが発生します。行のブロックを大きな内部テーブルに挿入する必要がある場合は、挿入する行を含む別のテーブルを準備し、代わりに挿入行を使用します。

itable1のループ内のitable1内に新しい行を挿入しても、内部テーブルにはすぐには影響しません。実際には、次のループパスで有効になります。現在の行の後に行を挿入している間、テーブルはENDLOOPで再インデックス付けされます。sy-tabixがインクリメントされ、次のループがsy-tabixが指す行を処理します。たとえば、2番目のループパスにいて、行3の前にレコードを挿入した場合、endloopが実行されると、新しい行は行3になり、古い行3は行4になります。Sy-tabixは1ずつインクリメントされ、次のループパスは新しく挿入されたレコードを処理します。

APPENDステートメント

APPENDステートメントは、既存の内部テーブルに単一の行または行を追加するために使用されます。このステートメントは、作業領域から1行をコピーし、内部テーブルの最後の既存の行の後に挿入します。作業領域は、ヘッダー行、または内部テーブルの行と同じ構造を持つその他のフィールド文字列のいずれかです。以下は、内部テーブルに1行を追加するために使用されるAPPENDステートメントの構文です。

APPEND <record_for_itab> TO <internal_tab>.

この構文では、<record_for_itab>式は、線種に変換可能な<work_area_itab>作業領域またはINITIALLINE句で表すことができます。ユーザーが<work_area_itab>作業領域を使用する場合、SAPシステムは<internal_tab>内部テーブルに新しい行を追加し、作業領域の内容を入力します。INITIAL LINE句は、テーブル構造の各フィールドの初期値を含む空白行を追加します。各APPENDステートメントの後に、SY-TABIX変数には追加された行のインデックス番号が含まれます。

一意でないキーを使用して標準テーブルとソート済みテーブルに行を追加すると、同じキーの行がテーブルにすでに存在するかどうかに関係なく機能します。つまり、エントリが重複する可能性があります。ただし、ユーザーが一意のキーを使用して並べ替えられたテーブルに重複エントリを追加しようとした場合、またはユーザーが並べ替えられたテーブルに行を追加して並べ替え順序に違反した場合、ランタイムエラーが発生します。

REPORT  ZCUSLIST1. 
DATA: BEGIN OF linv Occurs 0,
      Name(20) TYPE C,
      ID_Number TYPE I,
END OF linv. 

DATA table1 LIKE TABLE OF linv. 
linv-Name = 'Melissa'. 
linv-ID_Number = 105467. 
APPEND linv TO table1. 
LOOP AT table1 INTO linv. 

Write: / linv-name, linv-ID_Number. 
ENDLOOP.

上記のコードは次の出力を生成します-

Melissa		105467