1

Oracle は、Oracle Forms でのレコードの複数選択をサポートするAPP_MULTIパッケージ (ライブラリにある) を提供しています。APPCOREこの機能を利用するには、フォームに何をする必要がありますか? 例えば:

  • どのトリガーを実装する必要がありますか?
  • どのAPP_MULTIメソッドをいつ呼び出す必要がありますか?
4

1 に答える 1

1

このAPP_MULTIパッケージを使用すると、複数選択機能をフォームに追加できます。これも:

  • レコードをクリックするだけで、1 つのレコードを選択できます。
  • Ctrlキーを押しながらさまざまなレコードをクリックすると、複数のレコードを選択できます。
  • アプリケーション メニューから [すべて選択] を選択すると、複数のレコードをまとめて選択できます。
  • アプリケーション メニューから [すべて選択解除] を選択すると、複数のレコードをまとめて選択解除できます。
  • Shift最初のレコードをクリックし、キーを押しながら最後のレコードをクリックすると、複数のレコードをまとめて選択できます。

機能の有効化

パッケージはAPP_MULTI、フォームの次のイベントに応答することで機能します。

  • DESELECT_ALL
  • KEY-CLRFRM
  • KEY-CLRREC
  • KEY-CREREC
  • KEY-DELREC
  • POST-BLOCK
  • PRE-BLOCK
  • SELECT_ALL
  • WHEN-CLEAR-BLOCK
  • WHEN-MOUSE-CLICK
  • WHEN-NEW-RECORD-INSTANCE

残念ながら、パッケージはこれらのイベントに自動的に「フック」できません。むしろ、必要なトリガーを作成し、APP_MULTI.EVENT処理するイベントの名前を渡して、それぞれのトリガーでプロシージャを明示的に呼び出す必要があります。このプロシージャは次のように宣言されます。

  PROCEDURE event(event_name VARCHAR2,
                  blockname  VARCHAR2 DEFAULT NULL);

たとえば、KEY-CLRFRMトリガーは次のように単純にすることができます。

APP_MULTI.EVENT('KEY-CLRFRM');

このプロシージャはオプションのblockname引数を受け入れることに注意してください。blocknameがの場合NULL、プロシージャはSYSTEM.TRIGGER_BLOCK代わりに の値を使用します。

フォーム上のすべてのデータ ブロックが複数選択機能を受け取るようにする場合は、個々のデータ ブロックではなく、フォーム上にトリガーを作成できます。特定のデータ ブロックのみに機能を適用する場合は、それらのデータ ブロックにトリガーを作成する、フォームにトリガーを作成して独自のチェックを実行し、 をAPP_MULTI.EVENT呼び出す必要があるかどうかを判断します。

選択/選択解除イベントへの応答

MULTI_RETURN_ACTIONカスタムトリガーを (データ ブロックまたはフォームのトップ レベルで)実装することにより、選択と選択解除の通知を受け取ることができます。このトリガーは、レコードを選択または選択解除するたびに発生します (レコードが一括で選択/選択解除されている場合でも)。トリガーでは、これらの値を利用してコンテキストをよりよく理解できます。

  • GLOBAL.APPCORE_MULTI_BLOCKグローバルには、選択/選択解除によって影響を受けるデータ ブロックの名前が含まれます。
  • GLOBAL.APPCORE_MULTI_ACTIONグローバルは次のいずれかです 。
    • 'RECORD_SELECTED'レコードが選択されたとき
    • 'RECORD_DESELECTED'レコードの選択が解除されたとき
    • 'LABEL_CHANGE'[すべて選択] および [すべて選択解除] メニュー項目が有効または無効になっているとき (通常は、フォーカスがそれぞれデータ ブロックに入るか、データ ブロックから出たときに発生します)
  • APP_MULTI.LOOPINGpackage 変数は、ループ内で呼び出されたかどうか(つまり、レコードが一括で選択/選択解除されているかどうか) に応じて、TRUEまたはのいずれかになります。FALSEMULTI_RECORD_ACTION

一括操作中は、すべての選択/選択解除が完了した後にもう一度トリガーAPP_MULTIを呼び出します。MULTI_RETURN_ACTIONこの最後の呼び出し中に、GLOBAL.APPCORE_MULTI_ACTIONが に設定され'LABEL_CHANGE'APP_MULTI.LOOPINGが に設定されFALSEます。パフォーマンス上の理由から、この最終呼び出しを利用して、一括操作中の不要な計算を回避したい場合があります。たとえば、次のMULTI_RETURN_ACTIONようになります。

IF NOT APP_MULTI.LOOPING THEN
  costly_calculation();
END IF;

現在選択されているレコードの判別

データ ブロックごとAPP_MULTIに、現在選択されているレコード番号を含むレコード グループを維持します。特定のデータ ブロックについて、関数を介してこのレコード グループの唯一の列にアクセスできますAPP_MULTI.GET_GROUP_COL。関数を使用して、選択されたレコードの数を決定することもできAPP_MULTI.GET_GROUP_COUNTます。これらの関数はどちらも、データ ブロックの名前を唯一のパラメーターとして受け入れます。

たとえば、 という名前CUSTOMERのフィールドを持つ という名前のデータ ブロックがあるとしますCUSTOMER_NAME。次のコードを使用して、選択した顧客の名前を印刷できます。

PROCEDURE PRINT_SELECTED_CUSTOMER_NAMES IS
  record_number_column GROUPCOLUMN;
  selected_record_count NUMBER;
BEGIN
  record_number_column := APP_MULTI.GET_GROUP_COL('CUSTOMER');
  selected_record_count := APP_MULTI.GET_GROUP_COUNT('CUSTOMER');

  FOR i IN 1 .. selected_record_count LOOP
    DECLARE
      record_number NUMBER;
    BEGIN
      record_number := GET_GROUP_NUMBER_CELL(record_number_column, i);
      GO_RECORD(record_number);
      print(:CUSTOMER.CUSTOMER_NAME);
    END;
  END LOOP;
END;

実装の詳細

複数選択が有効になっているデータ ブロックごとに、APP_MULTIパッケージは、名前が の別個のレコード グループを保持しますblockname || '_MULTI'。このレコード グループには、選択したレコードごとに 1 行が含まれます。列 ( REC_NUM) のみが、選択されたレコードのレコード番号を格納します。これは、前述の関数GROUPCOLUMNによって返されます。APP_MULTI.GET_GROUP_COLUMN

たとえば、 という名前のデータ ブロックがあり、 1番目、4番目、および 9番目のレコードCUSTOMERを選択したとします。レコード グループには、次のデータが含まれます。CUSTOMER_MULTI

+---------+
| | REC_NUM |
+---------+
| | 1 |
| | 4 |
| | 9 |
+---------+

4番目のレコードの選択を解除すると、CUSTOMER_MULTIレコード グループは次のようになります。

+---------+
| | REC_NUM |
+---------+
| | 1 |
| | 9 |
+---------+

標準のビルトイン ( FIND_GROUPFIND_COLUMNGET_GROUP_ROW_COUNT)を使用してこのレコード グループをナビゲートすることはできますが、代わりにパッケージのGET_GROUP_COLおよびGET_GROUP_COUNT関数を使用することをお勧めします。APP_MULTI

于 2010-07-27T16:58:11.517 に答える