!--a11y-->

次の文を使用すると、
SELECTION-SCREEN FIELD SELECTION FOR NODE|TABLE <node>.
論理データベースの <node> ノードを、選択インクルード内の項目選択として宣言できます。
つまり、SELECT * を使用して全列を選択するのではなく、対応する PUT_<node> サブルーチンの SELECT 文で、個々の項目を選択できるようになります。これにより、データベースから転送されるデータ量を最小化できるので、多くの場合はパフォーマンスが向上します。
項目選択を許可した各ノードに対し、読み込みたい列を指定できます。これには、実行可能プログラムまたは LDB_PROCESS 汎用モジュールの FIELD_SELECTION パラメータで、GET 文の FIELD 追加オプションを使用します。論理データベースのデータベースプログラムは、SELECT_FIELDS データオブジェクト内の各列名にアクセスできます。SELECT_FIELDS データオブジェクトは、論理データベースプログラム内で、次のように自動生成されます。
TYPE-POOLS RSFS.
DATA SELECT_FIELDS TYPE RSFS_FIELDS.
これらの行は、開発者がプログラムする必要はありません。SELECT_FIELDS データオブジェクトは、データベースプログラム内、および接続された各実行可能プログラム内でも使用できます。
データオブジェクトの RSDS_FIELDS 型は、RSDS データ型グループ内で次のように定義されます。
TYPE-POOL RSFS.
* Fields to be selected per table
TYPES: BEGIN
OF RSFS_TAB_FIELDS,
TABLENAME LIKE
RSDSTABS-PRIM_TAB,
FIELDS LIKE RSFS_STRUC OCCURS
10,
END OF RSFS_TAB_FIELDS.
* Fields to be selected for all tables
TYPES: RSFS_FIELDS TYPE RSFS_TAB_FIELDS OCCURS 10.
RSDS_FIELDS は、TABLENAME および FIELDS コンポーネントを含んだ内部テーブルです。TABLENAME 列の各行は、項目選択に指定されたノード名を表します。FIELDS テーブルには、アプリケーションプログラム内で、これらの各ノードに対して GET 文で指定された列が保持されます。FIELDS テーブルは、これらの列を SELECT 文の動的 WHERE 句に直接使用できる書式となっています。
論理データベース内の列名を使用するには、PUT_<node> サブルーチン内で SELECT 文の SELECT 句を使用して、項目選択が許可された各ノード <node> に対する FIELDS 動的一覧を指定します。これには、SELECT_FIELDS 内部テーブルから、対応する内部テーブルを読み込む必要があります。次の例は、サブルーチンのローカルデータオブジェクトを使用して、これを実現する方法を示します。

データベーステーブル SCARR は ZHK 論理データベースのルートノードであり、SPFLI は唯一の下位ノードであるとします。
選択インクルード DBZHKSEL には、以下の行が含まれます。
SELECT-OPTIONS S_CARRID FOR SCARR-CARRID.
SELECT-OPTIONS S_CONNID FOR SPFLI-CONNID.
SELECTION-SCREEN FIELD SELECTION FOR TABLE SPFLI.
SAPDBZHK データベースプログラムの PUT_SCARR サブルーチンは、次のような項目選択を使用します。
FORM PUT_SPFLI.
STATICS:
FIELDLISTS TYPE RSFS_TAB_FIELDS,
FLAG_READ.
IF
FLAG_READ = SPACE.
FIELDLISTS-TABLENAME
= 'SPFLI'.
READ TABLE
SELECT_FIELDS WITH KEY FIELDLISTS-TABLENAME
INTO FIELDLISTS.
FLAG_READ
= 'X'.
ENDIF.
SELECT
(FIELDLISTS-FIELDS)
INTO CORRESPONDING FIELDS OF
SPFLI FROM SPFLI
WHERE CARRID =
SCARR-CARRID
AND CONNID IN
S_CONNID.
PUT SPFLI.
ENDSELECT.
ENDFORM.
SELECT_FIELDS 内部テーブルにおいて、SELECT_FIELD-TABLENAME 列内に SCARR 値を保持する行は、FIELDLISTS ローカル構造内に読み込まれます。STATICS 文および FLAG_READ 項目は、実行可能プログラムの 1 回の実行につき、 DYN_SEL テーブルが 1 度だけ読み込まれることを保証します。FIELDLISTS-FIELDS テーブルは、動的 SELECT 句で使用されます。
これで、HKZ 論理データベースにリンクされた実行可能プログラムには、たとえば以下の行が保持されます。
TABLES SPFLI.
GET SPFLI FIELDS CITYFROM CITYTO.
...
GET 文の FIELDS 追加オプションは、論理データベースがデータベーステーブルから、一次キー以外にどの項目を読み込むかを定義します。
システムは内部的に、SELECT_FIELDS テーブルに対応する値を設定します。これは、以下の行をプログラムに追加して試すことができます。
DATA: ITAB LIKE
SELECT_FIELDS,
ITAB_L LIKE LINE OF ITAB,
JTAB LIKE ITAB_L-FIELDS,
JTAB_L LIKE LINE OF JTAB.
START-OF-SELECTION.
ITAB =
SELECT_FIELDS.
LOOP AT
ITAB INTO ITAB_L.
IF ITAB_L-TABLENAME = 'SPFLI'.
JTAB =
ITAB_L-FIELDS.
LOOP AT
JTAB INTO JTAB_L.
WRITE / JTAB_L.
ENDLOOP.
ENDIF.
ENDLOOP.
これらの行により、一覧に列名が次のように表示されます。
CITYTO
CITYFROM
MANDT
CARRID
CONNID
一次キーの項目 (MANDT、CARRID、CONNID) は、指定の列に自動的に追加されます。