コンテンツフレーム起動

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

次の文を使用すると、

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

一次キーの項目 (MANDTCARRIDCONNID) は、指定の列に自動的に追加されます。

 

 

 

 

コンテンツフレーム終了