!--a11y-->

内部テーブルにデータを格納する際は、通常、読み込むデータベースごとに 1 つの内部テーブルを使用します。各内部テーブルには、該当するデータベーステーブルの一部または全部の列が含まれます。データベーステーブルごとにフラット構造を持つ内部テーブルを作成するか、または、たとえばネスト構造を持つ内部テーブルを作成するかを任意に設定することができます。複数のテーブルがあり、各テーブルがフラット構造を備えている場合は、重複しているキー項目を操作して各テーブルをリンクさせる必要があります。一方、ネスト内部テーブルを使用すると、データベーステーブルのデータを階層的に格納することができます。
内部テーブルは、非常に大量のデータの保存および処理には適しません。複数の異なる内部テーブルにデータを分割すると、テーブルを個々に処理しなければならないため、データ処理の実行時間が非常に長くなる可能性があります。さらに、内部テーブルは非圧縮形式で格納されるため、多くの記憶域が必要になります。場合によっては、システムでワークメモリの外部にデータセットを格納する必要もあります。これにより、データセットの処理時間はさらに長くなります。

以下のプログラムは、論理データベース F1S にリンクしているものと仮定します。
REPORT DEMO.
DATA: SUM TYPE I, CNT TYPE I.
NODES: SPFLI, SFLIGHT, SBOOK.
DATA:
TAB_SPFLI TYPE TABLE OF SPFLI,
TAB_SFLIGHT TYPE TABLE OF SFLIGHT,
TAB_SBOOK TYPE TABLE OF
SBOOK.
DATA:
WA_SPFLI LIKE LINE OF TAB_SPFLI,
WA_SFLIGHT LIKE LINE OF TAB_SFLIGHT,
WA_SBOOK LIKE LINE OF
TAB_SBOOK.
START-OF-SELECTION.
GET
SPFLI.
APPEND SPFLI TO TAB_SPFLI.
GET
SFLIGHT.
APPEND SFLIGHT TO TAB_SFLIGHT.
GET
SBOOK.
APPEND SBOOK TO TAB_SBOOK.
END-OF-SELECTION.
SORT: TAB_SPFLI BY CITYFROM CITYTO CONNID,
TAB_SFLIGHT BY FLDATE,
TAB_SBOOK BY CLASS
SMOKER BOOKID.
LOOP AT TAB_SPFLI INTO WA_SPFLI.
SKIP.
WRITE: /
WA_SPFLI-CARRID,
WA_SPFLI-CONNID,
'from', (15) WA_SPFLI-CITYFROM,
'to', (15) WA_SPFLI-CITYTO.
ULINE.
LOOP AT TAB_SFLIGHT INTO WA_SFLIGHT
WHERE
CARRID = WA_SPFLI-CARRID
AND CONNID = WA_SPFLI-CONNID.
SKIP.
WRITE: / 'Date:', WA_SFLIGHT-FLDATE.
WRITE: 20 'Book-ID', 40 'Smoker', 50 'Class'.
ULINE.
SUM = 0.
CNT = 0.
LOOP AT TAB_SBOOK INTO WA_SBOOK
WHERE
CARRID = WA_SFLIGHT-CARRID
AND
CONNID = WA_SFLIGHT-CONNID
AND
FLDATE = WA_SFLIGHT-FLDATE.
WRITE: / WA_SBOOK-BOOKID UNDER 'Book-ID',
WA_SBOOK-SMOKER UNDER 'Smoker',
WA_SBOOK-CLASS UNDER 'Class'.
SUM = SUM
+ WA_SBOOK-LUGGWEIGHT.
CNT = CNT
+ 1.
ENDLOOP.
ULINE.
WRITE: 'Number of bookings: ', (3) CNT,
/ 'Total luggage
weight:',
(3) SUM,
WA_SBOOK-WUNIT.
ENDLOOP.
ENDLOOP.
このプログラムでは、書式設定データの例の場合と同じ一覧が作成されます。
データを取得する GET イベントは、ソートプロセスと明確に分離しています。3 つの内部テーブルは、対応するデータベーステーブルとまったく同じ構造と内容を備えています。 データは格納後、表示されます。 このループ構造は、読込中のデータ書式設定の例にある SELECT ループのループ構造とまったく同じです。

以下のプログラムは、論理データベース F1S にリンクしているものと仮定します。
REPORT DEMO.
DATA: SUM TYPE I, CNT TYPE I.
NODES: SPFLI, SFLIGHT, SBOOK.
DATA: BEGIN OF
WA_SBOOK,
BOOKID
TYPE SBOOK-BOOKID,
SMOKER
TYPE SBOOK-SMOKER,
CLASS TYPE
SBOOK-CLASS,
LUGGWEIGHT TYPE
SBOOK-LUGGWEIGHT,
WUNIT TYPE
SBOOK-WUNIT,
END OF WA_SBOOK.
DATA: BEGIN OF
WA_SFLIGHT,
FLDATE TYPE
SFLIGHT-FLDATE,
SBOOK LIKE TABLE OF WA_SBOOK,
END OF WA_SFLIGHT.
DATA: BEGIN OF
WA_SPFLI,
CARRID TYPE
SPFLI-CARRID,
CONNID TYPE
SPFLI-CONNID,
CITYFROM TYPE
SPFLI-CITYFROM,
CITYTO TYPE
SPFLI-CITYTO,
SFLIGHT LIKE TABLE OF WA_SFLIGHT,
END OF WA_SPFLI.
DATA TAB_SPFLI LIKE TABLE OF WA_SPFLI.
START-OF-SELECTION.
GET SPFLI.
REFRESH
WA_SPFLI-SFLIGHT.
GET
SFLIGHT.
REFRESH WA_SFLIGHT-SBOOK.
GET
SBOOK.
MOVE-CORRESPONDING SBOOK TO WA_SBOOK.
APPEND WA_SBOOK TO WA_SFLIGHT-SBOOK.
GET SFLIGHT
LATE.
MOVE-CORRESPONDING SFLIGHT TO WA_SFLIGHT.
APPEND WA_SFLIGHT TO WA_SPFLI-SFLIGHT.
GET SPFLI
LATE.
MOVE-CORRESPONDING SPFLI TO WA_SPFLI.
APPEND WA_SPFLI TO TAB_SPFLI.
END-OF-SELECTION.
SORT TAB_SPFLI BY CITYFROM CITYTO CONNID.
LOOP AT TAB_SPFLI INTO WA_SPFLI.
SKIP.
WRITE: /
WA_SPFLI-CARRID,
WA_SPFLI-CONNID,
'from', (15) WA_SPFLI-CITYFROM,
'to', (15) WA_SPFLI-CITYTO.
ULINE.
SORT WA_SPFLI-SFLIGHT BY FLDATE.
LOOP AT WA_SPFLI-SFLIGHT INTO WA_SFLIGHT.
SKIP.
WRITE: / 'Date:', WA_SFLIGHT-FLDATE.
WRITE: 20 'Book-ID', 40 'Smoker', 50 'Class'.
ULINE.
SORT WA_SFLIGHT-SBOOK BY CLASS SMOKER BOOKID.
SUM = 0.
CNT = 0.
LOOP AT WA_SFLIGHT-SBOOK INTO WA_SBOOK.
WRITE: / WA_SBOOK-BOOKID UNDER 'Book-ID',
WA_SBOOK-SMOKER UNDER 'Smoker',
WA_SBOOK-CLASS UNDER 'Class'.
SUM
= SUM + WA_SBOOK-LUGGWEIGHT.
CNT
= CNT + 1.
ENDLOOP.
ULINE.
WRITE: 'Number of bookings: ', (3) CNT,
/ 'Total luggage
weight:',
(3) SUM,
WA_SBOOK-WUNIT.
ENDLOOP.
ENDLOOP.
このプログラムでは、書式設定データの例の場合と同じ一覧が作成されます。
GET イベントの実行時には、下位構造 SFLIGHT とその下位構造 SBOOK を含む 3 レベルの内部テーブルSORT_SPFLI にデータが書き込まれます。ソートプロセスは、個々のネストレベルで行われます。
このプログラミングでは内部テーブル間のキー関係が不要ですが (WHERE 条件なし) 、フラット内部テーブルを使用した場合よりも複雑になります。内部の管理作業の増大は、必要な記憶域と実行時間にマイナスの影響を与えます。