!--a11y-->

次の文を使用すると、
SELECTION-SCREEN DYNAMIC SELECTIONS FOR NODE|TABLE <node>.
論理データベースの <node> ノードを、選択インクルード内の動的選択として宣言できます。
PUT_<node> サブルーチンの SELECT 文で動的選択を使用するには、データオブジェクト DYN_SEL を使用する必要があります。DYN_SEL データオブジェクトは、論理データベースプログラム内に、次のように自動生成されます。
TYPE-POOLS RSDS.
DATA DYN_SEL TYPE RSDS_TYPE.
これらの行は、開発者がプログラムする必要はありません。DYN_SEL データオブジェクトは、データベースプログラム内で使用できますが、接続された実行可能プログラム内では使用できません。
データオブジェクトの RSDS_TYPE 型は、RSDS データ型グループ内で次のように定義されます。
TYPE-POOL RSDS.
* WHERE-clauses ------------------------------
TYPES: RSDS_WHERE_TAB LIKE RSDSWHERE OCCURS 5.
TYPES: BEGIN
OF RSDS_WHERE,
TABLENAME LIKE
RSDSTABS-PRIM_TAB,
WHERE_TAB TYPE
RSDS_WHERE_TAB,
END OF RSDS_WHERE.
TYPES: RSDS_TWHERE TYPE RSDS_WHERE OCCURS 5.
* Expressions Polish notation ---------------
TYPES: RSDS_EXPR_TAB LIKE RSDSEXPR OCCURS 10.
TYPES: BEGIN
OF RSDS_EXPR,
TABLENAME LIKE
RSDSTABS-PRIM_TAB,
EXPR_TAB TYPE
RSDS_EXPR_TAB,
END OF RSDS_EXPR.
TYPES: RSDS_TEXPR TYPE RSDS_EXPR OCCURS 10.
* Selections as RANGES-tables -----------------
TYPES: RSDS_SELOPT_T LIKE RSDSSELOPT OCCURS 10.
TYPES: BEGIN
OF RSDS_FRANGE,
FIELDNAME LIKE
RSDSTABS-PRIM_FNAME,
SELOPT_T TYPE
RSDS_SELOPT_T,
END OF RSDS_FRANGE.
TYPES: RSDS_FRANGE_T TYPE RSDS_FRANGE OCCURS 10.
TYPES: BEGIN
OF RSDS_RANGE,
TABLENAME LIKE
RSDSTABS-PRIM_TAB,
FRANGE_T TYPE
RSDS_FRANGE_T,
END OF RSDS_RANGE.
TYPES: RSDS_TRANGE TYPE RSDS_RANGE OCCURS 10.
* Definition of RSDS_TYPE
TYPES: BEGIN
OF RSDS_TYPE,
CLAUSES TYPE RSDS_TWHERE,
TEXPR TYPE
RSDS_TEXPR,
TRANGE TYPE
RSDS_TRANGE,
END OF RSDS_TYPE.
これは、以下のコンポーネントを含むデータ型です。
CLAUSES には、ユーザが入力した動的選択 (またはプログラムの内部選択基準によって入力された動的選択) が内部テーブルとして保持されます。これは、動的な WHERE 句において直接使用できます。
CLAUSES は、別の内部テーブル WHERE_TAB をコンポーネントとして保持する内部テーブルです。CLAUSES-TABLENAME 列の各行は、動的選択に指定されたノード名を表します。これらの各データベーステーブルに対し、WHERE_TAB テーブルには動的選択の選択基準が保持されます。WHERE_TAB テーブルは、これらの選択基準を WHERE 句に直接使用できる書式となっています。
WHERE_TAB を論理テーブルで使用するには、動的選択に指定した各 <node> ノードに対し、対応する PUT_<node> サブルーチンで動的 WHERE 句をプログラムする必要があります。これには、<node> に対応する WHERE_TAB 内部テーブルが、DYN_SEL データオブジェクトから読み込まれる必要があります。次の例は、サブルーチンでローカルデータオブジェクトを使用して、これを実現する方法を示します。

データベーステーブル SCARR は ZHK 論理データベースのルートノードであり、SPFLI は唯一の下位ノードであるとします。
選択インクルード DBZHKSEL には、以下の行が含まれます。
SELECT-OPTIONS S_CARRID FOR SCARR-CARRID.
SELECT-OPTIONS S_CONNID FOR SPFLI-CONNID.
SELECTION-SCREEN DYNAMIC SELECTIONS FOR TABLE SCARR.
SAPDBZHK データベースプログラムの PUT_SCARR サブルーチンは、次のような動的選択を使用します。
FORM PUT_SCARR.
STATICS:
DYNAMIC_SELECTIONS TYPE RSDS_WHERE,
FLAG_READ.
IF
FLAG_READ = SPACE.
DYNAMIC_SELECTIONS-TABLENAME
= 'SCARR'.
READ TABLE
DYN_SEL-CLAUSES
WITH KEY DYNAMIC_SELECTIONS-TABLENAME
INTO DYNAMIC_SELECTIONS.
FLAG_READ
= 'X'.
ENDIF.
SELECT *
FROM SCARR
WHERE CARRID IN
S_CARRID
AND
(DYNAMIC_SELECTIONS-WHERE_TAB).
PUT SCARR.
ENDSELECT.
ENDFORM.
DYN_SEL-CLAUSES 内部テーブルにおいて、DYN_SEL-CLAUSES-TABLENAME 列内の SCARR 値を保持する行は、DYNAMIC_SELECTIONS ローカル構造内に読み込まれます。STATICS 文および FLAG_READ 項目は、プログラムの 1 回の実行につき、DYN_SEL テーブルが 1 度だけ読み込まれることを保証します。DYNAMIC_SELECTIONS-WHERE_TAB テーブルは、動的 WHERE 句に使用されます。
ZHK を論理データベースとして使用し、SCARR または SPFLI に対して NODES または TABLES 文を保持する各実行可能プログラムは、SCARR テーブル内の各項目に対し、選択画面上で動的選択を提供できるようになります。動的 WHERE 句は、選択画面上および動的選択で、選択条件を満たす行だけが論理データベースに読み込まれることを意味します。
TEXPR には、内部書式 (ポーランド記法) による動的選択の選択内容が保持されます。FREE_SELECTIONS_INIT および FREE_SELECTIONS_DIALOG 汎用モジュールでこの書式を使用すると、プログラム内で動的選択を処理できます (追加情報については、各汎用モジュールの文書を参照)。
TRANGE には、動的選択による選択内容が範囲テーブルとして保持されます。これは、WHERE 句または論理式の中で IN 演算子と共に使用できます。
TRANGE は、別の内部テーブルFRANGE_T をコンポーネントとして保持する内部テーブルです。TRANGE-TABLENAME 列の各行は、動的選択に指定されたノード名を表します。これらの各ノードに対し、FRANGE_T テーブルには、RANGES テーブルの書式による動的選択の選択基準が保持されます。FRANGE_T には、RANGES テーブルが定義されたノードの項目を保持する FIELDNAME 列が保持されます。FRANGE_T のもう一方のコンポーネントである SELOPT_T には、実際の RANGES テーブルが保持されます。
TRANGE を使用すると、個々のデータベース列の選択内容に直接アクセスできます。また、WHERE 句の書式で保存されるものより、RANGES 書式で保存された選択基準の方が、修正が容易です。次の例は、対応するサブルーチン PUT_<node> のローカルデータオブジェクトを使用して、TRANGE を処理する方法を示します。

データベーステーブル SCARR は ZHK 論理データベースのルートノードであり、SPFLI は唯一の下位ノードであるとします。
選択インクルード DBZHKSEL には、以下の行が含まれます。
SELECT-OPTIONS S_CARRID FOR SCARR-CARRID.
SELECT-OPTIONS S_CONNID FOR SPFLI-CONNID.
SELECTION-SCREEN DYNAMIC SELECTIONS FOR TABLE SCARR.
SAPDBZHK データベースプログラムの PUT_SCARR サブルーチンは、次のような動的選択を使用します。
FORM PUT_SCARR.
STATICS:
DYNAMIC_RANGES TYPE RSDS_RANGE,
DYNAMIC_RANGE1 TYPE RSDS_FRANGE,
DYNAMIC_RANGE2 TYPE RSDS_FRANGE,
FLAG_READ.
IF FLAG_READ = SPACE.
DYNAMIC_RANGES-TABLENAME
= 'SCARR'.
READ TABLE
DYN_SEL-TRANGE
WITH KEY DYNAMIC_RANGES-TABLENAME
INTO DYNAMIC_RANGES.
DYNAMIC_RANGE1-FIELDNAME
= 'CARRNAME'.
READ TABLE
DYNAMIC_RANGES-FRANGE_T
WITH KEY DYNAMIC_RANGE1-FIELDNAME
INTO DYNAMIC_RANGE1.
DYNAMIC_RANGE2-FIELDNAME
= 'CURRCODE'.
READ TABLE
DYNAMIC_RANGES-FRANGE_T
WITH KEY DYNAMIC_RANGE2-FIELDNAME
INTO DYNAMIC_RANGE2.
FLAG_READ = 'X'.
ENDIF.
SELECT *
FROM SCARR
WHERE CARRID IN S_CARRID
AND CARRNAME
IN DYNAMIC_RANGE1-SELOPT_T
AND CURRCODE
IN DYNAMIC_RANGE2-SELOPT_T.
PUT SCARR.
ENDSELECT.
ENDFORM.
DYN_SEL-TRANGE 内部テーブルにおいて、DYN_SEL-CLAUSES-TABLENAME 列内に SCARR 値を保持する行が、DYNAMIC_RANGES ローカルテーブル内に読み込まれます。ネストされたテーブル DYNAMIC_RANGES-FRANGE_T は、DYNAMIC_RANGES-FIELDNAME の内容に従い、DYNAMIC-RANGE1 および DYNAMIC-RANGE2 ローカルテーブルに読み込まれます。STATICS 文および FLAG_READ 項目は、プログラムの 1 回の実行につき、各テーブルが 1 度だけ読み込まれることを保証します。READ 文が実行されると、ローカルテーブルにネストされた SELOPT_T テーブルには、SCARR データベーステーブルの CARRNAME および CURRCODE 列を表す RANGES テーブルが保持されます。
SELOPT_T テーブルは、選択テーブルとして SELECT 文内で直接使用されます。SCARR データベーステーブルには、CARRNAME、CURRCODE、および一次キー以外の列は生成されません。したがって、この論理データベースは、CLAUSES コンポーネントを使用した上記の例の論理データベースと同じ機能を持つことになります。