内部テーブルの種類
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.
実行結果