コンテンツフレーム起動

データベースプログラムの動的選択 文書を SAP ライブラリストラクチャに組み込む

次の文を使用すると、

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

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

TEXPR には、内部書式 (ポーランド記法) による動的選択の選択内容が保持されます。FREE_SELECTIONS_INIT および FREE_SELECTIONS_DIALOG 汎用モジュールでこの書式を使用すると、プログラム内で動的選択を処理できます (追加情報については、各汎用モジュールの文書を参照)

TRANGE

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 データベーステーブルには、CARRNAMECURRCODE、および一次キー以外の列は生成されません。したがって、この論理データベースは、CLAUSES コンポーネントを使用した上記の例の論理データベースと同じ機能を持つことになります。

 

 

 

 

コンテンツフレーム終了