コンテンツエリア開始

テーブル行のアペンド Locate the document in its SAP Library structure

索引テーブルに行を追加する方法はいくつかあります。以下の各命令と等価であり、すべての内部テーブルに適用される命令はありません。

単一行のアペンド

索引テーブルに 1 行を挿入するには、以下の命令を使用します。

APPEND line TO itab.

line は行データ型へと変換可能な作業領域wa であるか、式 INITIAL LINE です。wa を使用した場合は、内部テーブル itab に新規行が追加され、その行に作業領域の内容が入力されます。INITIAL LINE を使用すると、構造の各項目について正確な初期値を含む 1 つの空白行がアペンドされます。APPEND 命令を実行するたびにシステム項目 sy-tabix にはアペンドされた行の索引が設定されます。

非一意キーを使用した標準テーブルおよびソートテーブルの場合には、テーブル内に同一キーを持つ行がすでに存在するかどうかとは無関係に行をアペンドすることができます。重複エントリが発生する場合があります。一意キーを持つソートテーブルに重複エントリを追加しようとすると実行時エラーが発生します。同様に、ソートテーブルにアペンドすることによりソート順序に対する違反が生じると実行時エラーが発生します。

複数行のアペンド

以下の命令を使用すると、索引テーブルに内部テーブルをアペンドすることもできます。

APPEND LINES OF itab1 TO itab2.

この命令により、itab1 の全体が itab2 にアペンドされます。itab1 として任意のデータ型のテーブルを使用することができます。itab1 の行データ型は、itab2 の行データ型へと変換可能でなければなりません。

索引テーブルを別の索引テーブルにアペンドする場合は、以下のようにしてアペンドする行を指定することができます。

APPEND LINES OF itab1 [FROM n1] [TO n2] TO itab2.

n1 n2 により、itab2 にアペンドする itab1 の先頭行と最終行の索引を指定します。

この方法によりテーブルの行を別のテーブルにアペンドした場合は、loop 内で 1 行ずつアペンドする場合より約 3 倍から 4 倍高速になります。APPEND 命令の実行後にシステム項目 sy-tabix にはアペンドされた最終行の索引が設定されます。ソートテーブルに複数行をアペンドする場合は、(定義済の場合は) 一意キーに留意し、そのソート順序に違反してはなりません。違反すると実行時エラーが発生します。

ランク一覧

APPEND 命令を使用すると、標準テーブルの中にランク一覧を登録することができます。そうするには、空のテーブルを登録してから以下の命令を使用します。

APPEND wa TO itab SORTED BY f.

新規行は内部テーブル itab の末尾に追加されません。代わりに、テーブルは項目 f 降順でソートされます。作業領域 wa は、内部テーブルの行データ型と互換性を持たなければなりません。ソートテーブルについて SORTED BY オプションを使用することはできません。

この技法を使用した場合、テーブル宣言の INITIAL SIZE パラメータで指定した数のエントリのみを内部テーブルに含めることができます。これは一般的なルールの例外であり、一般には内部テーブルを動的に拡張することができます。指定した数を超えて行を追加すると、最終行は拒否されます。これは、長さが制限されたランク一覧を登録する場合に便利です (たとえば、"トップテン")APPEND 命令を使用すると、100 個までのエントリを含むランク一覧を生成することができます。100 個よりも大きな一覧を取り扱う場合は、通常はパフォーマンス上の理由からテーブルをソートするのが賢明です。

Example

DATA: BEGIN OF wa,
        col1(1) TYPE c,
        col2 TYPE i,
      END OF wa.

DATA itab LIKE TABLE OF wa.

DO 3 TIMES.
  APPEND INITIAL LINE TO itab.
  wa-col1 = sy-index. wa-col2 = sy-index ** 2.
  APPEND wa TO itab.
ENDDO.

LOOP AT itab INTO wa.
  WRITE: / wa-col1, wa-col2.
ENDLOOP.

一覧出力は以下のとおりです。

          0
1         1
          0
2         4
          0
3         9

この例では、DO ループの中で入力される 2 つの列を含む内部テーブル itab を登録しています。ループが処理されるたびに、初期化された 1 つの行がアペンドされ、テーブル作業領域にループ索引とループ索引の平方根が入力され、アペンドされます。

Example

DATA: BEGIN OF line1,
        col1(3) TYPE c,
        col2(2) TYPE n,
        col3    TYPE i,
      END OF line1,
      tab1 LIKE TABLE OF line1.

DATA: BEGIN OF line2,
        field1(1)  TYPE c,
        field2     LIKE tab1,
      END OF line2,
      tab2 LIKE TABLE OF line2.

line1-col1 = 'abc'. line1-col2 = '12'. line1-col3 = 3.
APPEND line1 TO tab1.

line1-col1 = 'def'. line1-col2 = '34'. line1-col3 = 5.
APPEND line1 TO tab1.

line2-field1 = 'A'. line2-field2 = tab1.
APPEND line2 TO tab2.

REFRESH tab1.

line1-col1 = 'ghi'. line1-col2 = '56'. line1-col3 = 7.
APPEND line1 TO tab1.

line1-col1 = 'jkl'. line1-col2 = '78'. line1-col3 = 9.
APPEND line1 TO tab1.

line2-field1 = 'B'. line2-field2 = tab1.
APPEND line2 TO tab2.

LOOP AT tab2 INTO line2.
  WRITE: / line2-field1.
  LOOP AT line2-field2 INTO line1.
    WRITE: / line1-col1, line1-col2, line1-col3.
  ENDLOOP.
ENDLOOP.

一覧出力は以下のとおりです。

A
abc 12          3
def 34          5
B
ghi 56          7
jkl 78          9

この例では、2 つの内部テーブル tab1 tab2 を登録しています。tab2 はディープ構造を持ちます。line2 2 番目のコンポーネントは内部テーブル tab1 のデータ型を持つためです。line1 に値を入力して tab1 にアペンドしています。次に、line2 に入力して tab2 にアペンドします。REFRESH 命令によって tab1 をクリアした後で、同じ手順を繰り返しています。

Example

DATA: BEGIN OF line,
        col1(1) TYPE c,
        col2 TYPE i,
      END OF line.

DATA: itab1 LIKE TABLE OF line,
      jtab LIKE itab.

DO 3 TIMES.
  line-col1 = sy-index. line-col2 = sy-index ** 2.
  APPEND line TO itab1.
  line-col1 = sy-index. line-col2 = sy-index ** 3.
  APPEND line TO jtab.
ENDDO.

APPEND LINES OF jtab FROM 2 TO 3 TO itab1.

LOOP AT itab1 INTO line.
  WRITE: / line-col1, line-col2.
ENDLOOP.

一覧出力は以下のとおりです。

1         1
2         4
3         9
2         8
3        27

この例では、同一データ型の 2 つの内部テーブル、itab および jtab を登録しています。DO ループの中で、itab には 2 乗の数を含む一覧を入力し、jtab には 3 乗の数を含む一覧を入力しています。次に、jtab の最後の 2 行を itab にアペンドしています。

Example

DATA: BEGIN OF line3,
        col1 TYPE i,
        col2 TYPE i,
        col3 TYPE i,
       END OF line3.

DATA itab2 LIKE TABLE OF line3 INITIAL SIZE 2.

line3-col1 = 1. line3-col2 = 2. line3-col3 = 3.
APPEND line3 TO itab2 SORTED BY col2.

line3-col1 = 4. line3-col2 = 5. line3-col3 = 6.
APPEND line3 TO itab2 SORTED BY col2.

line3-col1 = 7. line3-col2 = 8. line3-col3 = 9.
APPEND line3 TO itab2 SORTED BY col2.

LOOP AT itab2 INTO line3.
  WRITE: / line3-col2.
ENDLOOP.

一覧出力は以下のとおりです。

         8
         5

このプログラムでは、APPEND 命令と SORTED BY オプションを使用して内部テーブル itab 3 行を挿入しています。項目 COL2 に関して最も小さな値を持つ行がテーブルから削除されます。アペンド可能な行数は INITIAL SIZE オプションにより 2 に固定されているためです。

 

 

 

 

コンテンツエリア終了