Sap-abap-populating-internal-tables

提供:Dev Guides
移動先:案内検索

SAP ABAP-内部テーブルの生成

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

INSERTステートメント

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

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

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

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

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

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

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.

上記のコードは、次のoutpを生成します-

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

APPEND <record_for_itab> TO <internal_tab>.

この構文では、<record_for_itab>式を<work_area_itab>作業領域で表すことができます。この作業領域は、行タイプまたはINITIAL LINE句に変換できます。 ユーザーが<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