内部テーブルの種類
14.2 内部テーブルの種類
2. 内部テーブルの種類
内部テーブルには、以下の3種類があります。
標準テーブル
標準テーブルは、ABAPで使用されているテーブルの中で最もメジャーな内部テーブルです。
内部テーブル宣言時に「TYPE STANDARD TABLE OF」と記述することで、標準テーブルが宣言されます。順序やキーに関係なく、抽出したデータがそのままの形で格納されています。
また単に、「TYPE TABLE OF」と記述した時は、標準テーブルの宣言とみなされます。
※ただし、可読性から標準テーブルは、略さず「TYPE STANDARD TABLE OF」と宣言することが通例となっています。(もちろん案件によって違います。)
内部テーブル:標準テーブル
※DBテーブルはデータ型ではないが、SAPシステム上ではDBテーブルの構造を参照するようにSAPシステムの仕様として構築されており、DBテーブルを型として指定すると内部テーブルを作成します。
※アクセス時間は、標準テーブル内のデータの数に比例します。
「サンプルコード」①
1 | REPORT ZFUJII_SAMPLE141. |
3 | *&---------------------------------------------------------------------* |
5 | *&---------------------------------------------------------------------* |
6 | DATA IT_ZFUJII01 TYPE STANDARD TABLE OF ZFUJII01. |
8 | *&---------------------------------------------------------------------* |
10 | *&---------------------------------------------------------------------* |
11 | DATA ST_ZFUJII01 TYPE ZFUJII01. |
13 | *&---------------------------------------------------------------------* |
15 | *&---------------------------------------------------------------------* |
23 | SELECT * FROM ZFUJII_DB01 |
24 | INTO TABLE IT_ZFUJII01. |
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. |
実行結果
ソートテーブル
ソートテーブルとは、格納されているデータがあるキーによって並び替えられている内部テーブルを指します。
データを格納する際に、指定したキーでソートをかけてから格納するため、標準テーブルと比べて時間がかかってしまいます。
その反面、ソートテーブル内のデータを条件を指定して読み込む場合は、処理効率は良くなります。
内部テーブル:ソートテーブル
キーを元に宣言しているため、ソートテーブル宣言時には、キーの設定をする必要があります。
「サンプルコード」①
3 | *&---------------------------------------------------------------------* |
5 | *&---------------------------------------------------------------------* |
7 | DATA IT_ZFUJII01 TYPE SORTED TABLE OF ZFUJII01 WITH NON-UNIQUE KEY NAME1. |
9 | *&---------------------------------------------------------------------* |
11 | *&---------------------------------------------------------------------* |
12 | DATA ST_ZFUJII01 TYPE ZFUJII01. |
14 | *&---------------------------------------------------------------------* |
16 | *&---------------------------------------------------------------------* |
24 | SELECT * FROM ZFUJII_DB01 |
25 | INTO TABLE IT_ZFUJII01. |
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. |
実行結果
レンジテーブル
レンジテーブルとは、内部テーブルの一種ですが、前述のテーブルとは格納方法が異なります。
ほかの内部テ-ブ ルとは違い、レンジテーブルはデータを格納するわけではなく、範囲を指定するのみになります。
つまり、テーブルの中にある情報は抽出条件のようなものです。
データの格納イメージは次の表となり、 値が1~5と7が対象となります。
レンジテーブルの各項目の説明は、次の表のとおりです。
内部テーブル:レンジテーブル
その他のテーブル宣言と同様に、定義したいテーブルの種類を含めて宣言をします。
レンジテーブルを宣言する時は、データ型を参照せずに項目名を参照します。
それにより、その項目の範囲を選択し、レンジテーブルに格納することができます。
レンジテーブルにおける構文はとなります。
「サンプルコード」①
1 | REPORT ZFUJII_SAMPLE143. |
3 | *&---------------------------------------------------------------------* |
5 | *&---------------------------------------------------------------------* |
6 | TYPES TYP_SAL TYPE RANGE OF ZFUJII_DB02-ZAMT_SAL. |
8 | *&---------------------------------------------------------------------* |
10 | *&---------------------------------------------------------------------* |
11 | DATA R_SAL TYPE TYP_SAL. |
13 | *&---------------------------------------------------------------------* |
15 | *&---------------------------------------------------------------------* |
16 | DATA RH_SAL LIKE LINE OF R_SAL. |
18 | *&---------------------------------------------------------------------* |
20 | *&---------------------------------------------------------------------* |
21 | DATA IT_ZFUJII02_TAB TYPE ZFUJII02_TAB. "データ抽出用 |
22 | *&---------------------------------------------------------------------* |
24 | *&---------------------------------------------------------------------* |
25 | DATA ST_ZFUJII02 TYPE ZFUJII02. "データ抽出用 |
27 | *&---------------------------------------------------------------------* |
29 | *&---------------------------------------------------------------------* |
32 | CLEAR: R_SAL, RH_SAL, IT_ZFUJII02_TAB, ST_ZFUJII02. |
34 | RH_SAL-SIGN = 'I'. "指定した範囲を含む |
35 | RH_SAL-OPTION = 'GE'. "LOWで指定する値以上 |
39 | APPEND RH_SAL TO R_SAL. |
43 | SELECT * FROM ZFUJII_DB02 INTO TABLE IT_ZFUJII02_TAB |
44 | WHERE ZAMT_SAL IN R_SAL. |
46 | LOOP 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. "通貨 |
実行結果
補足(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>
上記となります。
「サンプルコード」②
1 | REPORT ZFUJII_SAMPLE143_2. |
3 | *&---------------------------------------------------------------------* |
5 | *&---------------------------------------------------------------------* |
6 | DATA R_SAL TYPE RANGE OF ZFUJII_DB02-ZAMT_SAL. |
8 | *&---------------------------------------------------------------------* |
10 | *&---------------------------------------------------------------------* |
11 | DATA RH_SAL LIKE LINE OF R_SAL. |
13 | *&---------------------------------------------------------------------* |
15 | *&---------------------------------------------------------------------* |
16 | DATA IT_ZFUJII02_TAB TYPE ZFUJII02_TAB. "データ抽出用 |
18 | *&---------------------------------------------------------------------* |
20 | *&---------------------------------------------------------------------* |
21 | DATA ST_ZFUJII02 TYPE ZFUJII02. "データ抽出用 |
23 | *&---------------------------------------------------------------------* |
25 | *&---------------------------------------------------------------------* |
29 | CLEAR: R_SAL, RH_SAL, IT_ZFUJII02_TAB, ST_ZFUJII02. |
31 | *&---------------------------------------------------------------------* |
33 | *&---------------------------------------------------------------------* |
35 | RH_SAL-SIGN = 'I'. "指定した範囲を含む |
36 | RH_SAL-OPTION = 'BT'. "LOWからHIGHの間の範囲 |
41 | APPEND RH_SAL TO R_SAL. |
59 | *&---------------------------------------------------------------------* |
61 | *&---------------------------------------------------------------------* |
63 | RH_SAL-SIGN = 'E'. "指定した範囲を含まない |
64 | RH_SAL-OPTION = 'EQ'. "LOWと同じ値 |
68 | APPEND RH_SAL TO R_SAL. |
71 | *売上金額が50万~100万円の間で55万円を含まないデータを抽出 |
72 | SELECT * FROM ZFUJII_DB02 INTO TABLE IT_ZFUJII02_TAB |
73 | WHERE ZAMT_SAL IN R_SAL. |
76 | LOOP 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. "通貨 |
実行結果
NEXT>> 第15章 内部テーブル②