内部テーブルの種類

14.2 内部テーブルの種類

2. 内部テーブルの種類

内部テーブルには、以下の3種類があります。

  • 標準テーブル
  • ソートテーブル
  • レンジテーブル

標準テーブル

標準テーブルは、ABAPで使用されているテーブルの中で最もメジャーな内部テーブルです。
内部テーブル宣言時に「TYPE STANDARD TABLE OF」と記述することで、標準テーブルが宣言されます。順序やキーに関係なく、抽出したデータがそのままの形で格納されています。
また単に、「TYPE TABLE OF」と記述した時は、標準テーブルの宣言とみなされます。
※ただし、可読性から標準テーブルは、略さず「TYPE STANDARD TABLE OF」と宣言することが通例となっています。(もちろん案件によって違います。)

内部テーブル:標準テーブル

※DBテーブルはデータ型ではないが、SAPシステム上ではDBテーブルの構造を参照するようにSAPシステムの仕様として構築されており、DBテーブルを型として指定すると内部テーブルを作成します。

※アクセス時間は、標準テーブル内のデータの数に比例します。

「サンプルコード」①

1REPORT ZFUJII_SAMPLE141.
2 
3*&---------------------------------------------------------------------*
4* 内部テーブル定義
5*&---------------------------------------------------------------------*
6DATA IT_ZFUJII01 TYPE STANDARD TABLE OF ZFUJII01.
7 
8*&---------------------------------------------------------------------*
9* 構造定義
10*&---------------------------------------------------------------------*
11DATA ST_ZFUJII01 TYPE ZFUJII01.
12 
13*&---------------------------------------------------------------------*
14* 主処理
15*&---------------------------------------------------------------------*
16START-OF-SELECTION.
17 
18*初期化
19  CLEAR: IT_ZFUJII01,
20             ST_ZFUJII01.
21 
22*データ抽出
23  SELECT * FROM ZFUJII_DB01
24    INTO TABLE IT_ZFUJII01.
25 
26*出力処理
27  LOOP AT IT_ZFUJII01 INTO ST_ZFUJII01.
28    WRITE ST_ZFUJII01-MANDT.
29    WRITE ST_ZFUJII01-KUNNR.
30    WRITE ST_ZFUJII01-NAME1.
31    WRITE ST_ZFUJII01-NAME2.
32    WRITE /.
33  ENDLOOP.
34 
35END-OF-SELECTION.

実行結果

ソートテーブル

ソートテーブルとは、格納されているデータがあるキーによって並び替えられている内部テーブルを指します。
データを格納する際に、指定したキーでソートをかけてから格納するため、標準テーブルと比べて時間がかかってしまいます。
その反面、ソートテーブル内のデータを条件を指定して読み込む場合は、処理効率は良くなります。

内部テーブル:ソートテーブル

キーを元に宣言しているため、ソートテーブル宣言時には、キーの設定をする必要があります。

「サンプルコード」①

1REPORT Z_SAMPLE142.
2 
3*&---------------------------------------------------------------------*
4* 内部テーブル定義
5*&---------------------------------------------------------------------*
6*得意先名称(NAME1)でソート
7DATA IT_ZFUJII01 TYPE SORTED TABLE OF ZFUJII01 WITH NON-UNIQUE KEY NAME1.
8 
9*&---------------------------------------------------------------------*
10* 構造定義
11*&---------------------------------------------------------------------*
12DATA ST_ZFUJII01 TYPE ZFUJII01.
13 
14*&---------------------------------------------------------------------*
15* 主処理
16*&---------------------------------------------------------------------*
17START-OF-SELECTION.
18 
19*初期化
20  CLEAR: IT_ZFUJII01,
21             ST_ZFUJII01.
22 
23*データ抽出
24  SELECT * FROM ZFUJII_DB01
25    INTO TABLE IT_ZFUJII01.
26 
27*出力処理
28  LOOP AT IT_ZFUJII01 INTO ST_ZFUJII01.
29    WRITE ST_ZFUJII01-MANDT.
30    WRITE ST_ZFUJII01-KUNNR.
31    WRITE ST_ZFUJII01-NAME1.
32    WRITE ST_ZFUJII01-NAME2.
33    WRITE /.
34  ENDLOOP.
35 
36END-OF-SELECTION.

実行結果

レンジテーブル

レンジテーブルとは、内部テーブルの一種ですが、前述のテーブルとは格納方法が異なります。
ほかの内部テ-ブ ルとは違い、レンジテーブルはデータを格納するわけではなく、範囲を指定するのみになります。
つまり、テーブルの中にある情報は抽出条件のようなものです。
データの格納イメージは次の表となり、 値が1~5と7が対象となります。

レンジテーブルの各項目の説明は、次の表のとおりです。

内部テーブル:レンジテーブル

その他のテーブル宣言と同様に、定義したいテーブルの種類を含めて宣言をします。
レンジテーブルを宣言する時は、データ型を参照せずに項目名を参照します。
それにより、その項目の範囲を選択し、レンジテーブルに格納することができます。
レンジテーブルにおける構文はとなります。

「サンプルコード」①

1REPORT ZFUJII_SAMPLE143.
2 
3*&---------------------------------------------------------------------*
4* レンジテーブル型定義
5*&---------------------------------------------------------------------*
6TYPES TYP_SAL TYPE RANGE OF ZFUJII_DB02-ZAMT_SAL.
7 
8*&---------------------------------------------------------------------*
9* レンジテーブル定義
10*&---------------------------------------------------------------------*
11DATA R_SAL TYPE TYP_SAL.
12 
13*&---------------------------------------------------------------------*
14* レンジテーブルの構造定義
15*&---------------------------------------------------------------------*
16DATA RH_SAL LIKE LINE OF R_SAL.
17 
18*&---------------------------------------------------------------------*
19* 内部テーブル定義
20*&---------------------------------------------------------------------*
21DATA IT_ZFUJII02_TAB TYPE ZFUJII02_TAB. "データ抽出用
22*&---------------------------------------------------------------------*
23* 構造定義
24*&---------------------------------------------------------------------*
25DATA ST_ZFUJII02 TYPE ZFUJII02. "データ抽出用
26 
27*&---------------------------------------------------------------------*
28* 主処理
29*&---------------------------------------------------------------------*
30START-OF-SELECTION.
31*初期化
32CLEAR: R_SAL, RH_SAL, IT_ZFUJII02_TAB, ST_ZFUJII02.
33*値の代入
34RH_SAL-SIGN = 'I'. "指定した範囲を含む
35RH_SAL-OPTION = 'GE'. "LOWで指定する値以上
36RH_SAL-LOW = 1000000.
37 
38*レンジテーブルへデータを格納
39APPEND RH_SAL TO R_SAL.
40 
41*データ抽出
42*売上金額が100万以上のデータを抽出
43SELECT * FROM ZFUJII_DB02 INTO TABLE IT_ZFUJII02_TAB
44  WHERE ZAMT_SAL IN R_SAL.
45*出力処理
46LOOP AT IT_ZFUJII02_TAB INTO ST_ZFUJII02.
47    WRITE ST_ZFUJII02-MANDT.               "クライアント
48    WRITE ST_ZFUJII02-GRAC_YYYYMM.     "年月
49    WRITE ST_ZFUJII02-ZAMT_SAL.             "売上金額
50    WRITE ST_ZFUJII02-CURRENCY.            "通貨
51    WRITE /.
52  ENDLOOP.
53 
54END-OF-SELECTION.

実行結果

補足(LIKEとLINE OFについて)

オプションのLIKEについて

サンプルで使用しているLIKEというキーワードは、<DATA命令/TYPES命令>におけるLIKEオプションになります。
LIKEオプションは、を使用することで、TYPES命令と同様にDATA命令で宣言した変数、構造、テーブルの内容と同じ形のものを作成することができます。
今回のサンプルの場合、

DATA R_SAL TYPE TYP_SAL.

DATA RH_SAL LIKE LINE OF R_SAL.

上記で構築されております。
LINE OF は別オプションの説明になりますので、少しシンプルにします。
 DATA R_SAL TYPE TYP_SAL.

 DATA RH_SAL LIKE R_SAL.

上記で考えます。

上記として宣言すると R_SAL と RH_SAL は同じ項目を持つテーブルになります。

上記となります。

オプションのLINE OFについて

LINE OF は <DATA命令/TYPES命令>のオプションとなります。

上記オプションを使用することで内部テーブルとして定義、宣言されているものを1行の構造として
使用することが可能になります。


サンプルのコードで言いますと。

 TYPES TYP_SAL TYPE RANGE OF ZFUJII_DB02-ZAMT_SAL
 DATA R_SAL TYPE TYP_SAL.
 DATA RH_SAL LIKE LINE OF R_SAL.

上記の部分になります。

上記を一部、LIKEオプションを外し、TYPEに変更しシンプルにします。

 TYPES TYP_SAL TYPE RANGE OF ZFUJII_DB02-ZAMT_SAL
 DATA RH_SAL TYPE LINE OF TYP_SAL.

上記のように変更すると

 TYP_SAL というテーブルデータ型 (複数行) を LINE OF というオプションを使用することで
 構造(一行) という形 で RH_SAL を宣言することが可能になります。

上記の組み合わせとして、LIKE LINE OF を使用すると
 ①TYPES TYP_SAL TYPE RANGE OF ZFUJII_DB02-ZAMT_SAL.
 ②DATA R_SAL TYPE TYP_SAL.
 ③DATA RH_SAL LIKE LINE OF R_SAL.
 上記の処理を構築でき、③の内容としては、
 ②で宣言した内部テーブル R_SAL と同じ項目を持つ(LIKE)
 一行(LINE)の構造と宣言しているものになります。

レンジテーブルの作成の場合は、
 DATA <A> TYPE RANGE OF <テーブル名>-<項目名>
 DATA <B> LIKE LINE OF <A>

上記となります。

「サンプルコード」②

1REPORT ZFUJII_SAMPLE143_2.
2 
3*&---------------------------------------------------------------------*
4* レンジテーブル定義
5*&---------------------------------------------------------------------*
6DATA R_SAL TYPE RANGE OF ZFUJII_DB02-ZAMT_SAL.
7 
8*&---------------------------------------------------------------------*
9* レンジテーブルの構造定義
10*&---------------------------------------------------------------------*
11DATA RH_SAL LIKE LINE OF R_SAL.
12 
13*&---------------------------------------------------------------------*
14* 内部テーブル定義
15*&---------------------------------------------------------------------*
16DATA IT_ZFUJII02_TAB TYPE ZFUJII02_TAB. "データ抽出用
17 
18*&---------------------------------------------------------------------*
19* 構造定義
20*&---------------------------------------------------------------------*
21DATA ST_ZFUJII02 TYPE ZFUJII02. "データ抽出用
22 
23*&---------------------------------------------------------------------*
24* 主処理
25*&---------------------------------------------------------------------*
26START-OF-SELECTION.
27 
28*初期化
29CLEAR: R_SAL, RH_SAL, IT_ZFUJII02_TAB, ST_ZFUJII02.
30 
31*&---------------------------------------------------------------------*
32*1レコード目処理
33*&---------------------------------------------------------------------*
34*値の代入
35RH_SAL-SIGN = 'I'. "指定した範囲を含む
36RH_SAL-OPTION = 'BT'. "LOWからHIGHの間の範囲
37RH_SAL-LOW = 500000.
38RH_SAL-HIGH = 1000000.
39 
40*レンジテーブルへデータを格納
41APPEND RH_SAL TO R_SAL.
42 
43*初期化
44CLEAR RH_SAL.
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59*&---------------------------------------------------------------------*
60*2レコード目処理
61*&---------------------------------------------------------------------*
62*値の代入
63RH_SAL-SIGN = 'E'. "指定した範囲を含まない
64RH_SAL-OPTION = 'EQ'. "LOWと同じ値
65RH_SAL-LOW = 550000.
66 
67*レンジテーブルへデータを格納
68APPEND RH_SAL TO R_SAL.
69 
70*データ抽出
71*売上金額が50万~100万円の間で55万円を含まないデータを抽出
72SELECT * FROM ZFUJII_DB02 INTO TABLE IT_ZFUJII02_TAB
73  WHERE ZAMT_SAL IN R_SAL.
74 
75*出力処理
76LOOP AT IT_ZFUJII02_TAB INTO ST_ZFUJII02.
77    WRITE ST_ZFUJII02-MANDT.               "クライアント
78    WRITE ST_ZFUJII02-GRAC_YYYYMM.     "年月
79    WRITE ST_ZFUJII02-ZAMT_SAL.             "売上金額
80    WRITE ST_ZFUJII02-CURRENCY.            "通貨
81    WRITE /.
82  ENDLOOP.
83 
84END-OF-SELECTION.

実行結果


NEXT>> 第15章 内部テーブル②

f