Oracle は、Oracle Forms でのレコードの複数選択をサポートするAPP_MULTI
パッケージ (ライブラリにある) を提供しています。APPCORE
この機能を利用するには、フォームに何をする必要がありますか? 例えば:
- どのトリガーを実装する必要がありますか?
- どの
APP_MULTI
メソッドをいつ呼び出す必要がありますか?
Oracle は、Oracle Forms でのレコードの複数選択をサポートするAPP_MULTI
パッケージ (ライブラリにある) を提供しています。APPCORE
この機能を利用するには、フォームに何をする必要がありますか? 例えば:
APP_MULTI
メソッドをいつ呼び出す必要がありますか?このAPP_MULTI
パッケージを使用すると、複数選択機能をフォームに追加できます。これも:
パッケージは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.LOOPING
package 変数は、ループ内で呼び出されたかどうか(つまり、レコードが一括で選択/選択解除されているかどうか) に応じて、TRUE
またはのいずれかになります。FALSE
MULTI_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_GROUP
、FIND_COLUMN
、GET_GROUP_ROW_COUNT
)を使用してこのレコード グループをナビゲートすることはできますが、代わりにパッケージのGET_GROUP_COL
およびGET_GROUP_COUNT
関数を使用することをお勧めします。APP_MULTI