内部テーブルの種類

14.2 内部テーブルの種類

2. 内部テーブルの種類

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

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

標準テーブル

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

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

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

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

「サンプルコード」①

REPORT ZFUJII_SAMPLE141.

*&---------------------------------------------------------------------*
* 内部テーブル定義
*&---------------------------------------------------------------------*
DATA IT_ZFUJII01 TYPE STANDARD TABLE OF ZFUJII01.

*&---------------------------------------------------------------------*
* 構造定義
*&---------------------------------------------------------------------*
DATA ST_ZFUJII01 TYPE ZFUJII01.

*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
START-OF-SELECTION.

*初期化
  CLEAR: IT_ZFUJII01,
             ST_ZFUJII01.

*データ抽出
  SELECT * FROM ZFUJII_DB01
    INTO TABLE IT_ZFUJII01.

*出力処理
  LOOP AT IT_ZFUJII01 INTO ST_ZFUJII01.
    WRITE ST_ZFUJII01-MANDT.
    WRITE ST_ZFUJII01-KUNNR.
    WRITE ST_ZFUJII01-NAME1.
    WRITE ST_ZFUJII01-NAME2.
    WRITE /.
  ENDLOOP.

END-OF-SELECTION.

実行結果

ソートテーブル

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

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

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

「サンプルコード」①

REPORT Z_SAMPLE142.

*&---------------------------------------------------------------------*
* 内部テーブル定義
*&---------------------------------------------------------------------*
*得意先名称(NAME1)でソート
DATA IT_ZFUJII01 TYPE SORTED TABLE OF ZFUJII01 WITH NON-UNIQUE KEY NAME1.

*&---------------------------------------------------------------------*
* 構造定義
*&---------------------------------------------------------------------*
DATA ST_ZFUJII01 TYPE ZFUJII01.

*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
START-OF-SELECTION.

*初期化
  CLEAR: IT_ZFUJII01,
             ST_ZFUJII01.

*データ抽出
  SELECT * FROM ZFUJII_DB01
    INTO TABLE IT_ZFUJII01.

*出力処理
  LOOP AT IT_ZFUJII01 INTO ST_ZFUJII01.
    WRITE ST_ZFUJII01-MANDT.
    WRITE ST_ZFUJII01-KUNNR.
    WRITE ST_ZFUJII01-NAME1.
    WRITE ST_ZFUJII01-NAME2.
    WRITE /.
  ENDLOOP.

END-OF-SELECTION.

実行結果

レンジテーブル

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

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

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

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

「サンプルコード」①

REPORT ZFUJII_SAMPLE143.

*&---------------------------------------------------------------------*
* レンジテーブル型定義
*&---------------------------------------------------------------------*
TYPES TYP_SAL TYPE RANGE OF ZFUJII_DB02-ZAMT_SAL.

*&---------------------------------------------------------------------*
* レンジテーブル定義
*&---------------------------------------------------------------------*
DATA R_SAL TYPE TYP_SAL.

*&---------------------------------------------------------------------*
* レンジテーブルの構造定義
*&---------------------------------------------------------------------*
DATA RH_SAL LIKE LINE OF R_SAL.

*&---------------------------------------------------------------------*
* 内部テーブル定義
*&---------------------------------------------------------------------*
DATA IT_ZFUJII02_TAB TYPE ZFUJII02_TAB. "データ抽出用
*&---------------------------------------------------------------------*
* 構造定義
*&---------------------------------------------------------------------*
DATA ST_ZFUJII02 TYPE ZFUJII02. "データ抽出用

*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*初期化
CLEAR: R_SAL, RH_SAL, IT_ZFUJII02_TAB, ST_ZFUJII02.
*値の代入
RH_SAL-SIGN = 'I'. "指定した範囲を含む
RH_SAL-OPTION = 'GE'. "LOWで指定する値以上
RH_SAL-LOW = 1000000.

*レンジテーブルへデータを格納
APPEND RH_SAL TO R_SAL.

*データ抽出
*売上金額が100万以上のデータを抽出
SELECT * FROM ZFUJII_DB02 INTO TABLE IT_ZFUJII02_TAB
  WHERE ZAMT_SAL IN R_SAL.
*出力処理
LOOP AT IT_ZFUJII02_TAB INTO ST_ZFUJII02.
    WRITE ST_ZFUJII02-MANDT.               "クライアント
    WRITE ST_ZFUJII02-GRAC_YYYYMM.     "年月
    WRITE ST_ZFUJII02-ZAMT_SAL.             "売上金額
    WRITE ST_ZFUJII02-CURRENCY.            "通貨
    WRITE /.
  ENDLOOP.

END-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>

上記となります。

「サンプルコード」②

REPORT ZFUJII_SAMPLE143_2.

*&---------------------------------------------------------------------*
* レンジテーブル定義
*&---------------------------------------------------------------------*
DATA R_SAL TYPE RANGE OF ZFUJII_DB02-ZAMT_SAL.

*&---------------------------------------------------------------------*
* レンジテーブルの構造定義
*&---------------------------------------------------------------------*
DATA RH_SAL LIKE LINE OF R_SAL.

*&---------------------------------------------------------------------*
* 内部テーブル定義
*&---------------------------------------------------------------------*
DATA IT_ZFUJII02_TAB TYPE ZFUJII02_TAB. "データ抽出用

*&---------------------------------------------------------------------*
* 構造定義
*&---------------------------------------------------------------------*
DATA ST_ZFUJII02 TYPE ZFUJII02. "データ抽出用

*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
START-OF-SELECTION.

*初期化
CLEAR: R_SAL, RH_SAL, IT_ZFUJII02_TAB, ST_ZFUJII02.

*&---------------------------------------------------------------------*
*1レコード目処理
*&---------------------------------------------------------------------*
*値の代入
RH_SAL-SIGN = 'I'. "指定した範囲を含む
RH_SAL-OPTION = 'BT'. "LOWからHIGHの間の範囲
RH_SAL-LOW = 500000.
RH_SAL-HIGH = 1000000.

*レンジテーブルへデータを格納
APPEND RH_SAL TO R_SAL.

*初期化
CLEAR RH_SAL.














*&---------------------------------------------------------------------*
*2レコード目処理
*&---------------------------------------------------------------------*
*値の代入
RH_SAL-SIGN = 'E'. "指定した範囲を含まない
RH_SAL-OPTION = 'EQ'. "LOWと同じ値
RH_SAL-LOW = 550000.

*レンジテーブルへデータを格納
APPEND RH_SAL TO R_SAL.

*データ抽出
*売上金額が50万~100万円の間で55万円を含まないデータを抽出
SELECT * FROM ZFUJII_DB02 INTO TABLE IT_ZFUJII02_TAB
  WHERE ZAMT_SAL IN R_SAL.

*出力処理
LOOP AT IT_ZFUJII02_TAB INTO ST_ZFUJII02.
    WRITE ST_ZFUJII02-MANDT.               "クライアント
    WRITE ST_ZFUJII02-GRAC_YYYYMM.     "年月
    WRITE ST_ZFUJII02-ZAMT_SAL.             "売上金額
    WRITE ST_ZFUJII02-CURRENCY.            "通貨
    WRITE /.
  ENDLOOP.

END-OF-SELECTION.

実行結果


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