Oracle FormsのAPP_MULTIパッケージ活用ガイド:複数レコード選択機能の実装方法
Oracle® の APP_MULTI パッケージを使用すると、Oracle Forms のフォームに複数レコード選択(マルチセレクト)機能を追加できます。このパッケージは APPCORE ライブラリに含まれており、標準的な EBS フォーム開発で広く利用されています。
APP_MULTI パッケージを使えば、単一レコードだけでなく複数レコードを選択し、それらに対して必要な処理をまとめて実行できるようになります。下図は、ランダムに複数のレコードを選択している様子を示したものです。

画像出典: https://i36.me/images/oracle/ebs/ebs_frm_lnchse_with_app_multi_01.jpg
主な機能
APP_MULTI パッケージを使用すると、以下のような操作が可能になります。
- レコードをクリックすることで、そのレコードを単独で選択できます。
- Ctrl キーを押しながら複数のレコードをクリックすると、離れた複数のレコードを同時に選択できます。
- アプリケーションメニューから「すべて選択(Select All)」を選ぶと、全レコードを一括選択できます。
- アプリケーションメニューから「すべて解除(Deselect All)」を選ぶと、選択済みの全レコードをまとめて解除できます。
- 先頭のレコードをクリックした後、Shift キーを押しながら連続範囲の最後のレコードをクリックすると、連続した複数レコードを一括で選択できます。
APP_MULTIパッケージが対応するイベント
APP_MULTI パッケージは、フォーム上で発生する以下のイベントに応答します。
- KEY-CLRFRM(フォームレベル):フォームをクリアする前にレコードの妥当性検証を行います。使用例:
APP_MULTI.EVENT('KEY-CLRFRM'); - KEY-CLRREC(ブロックレベル):現在のレコードをクリアしたときに発生します。
clear_recordコマンドと同等です。 - KEY-CREREC(ブロックレベル):新しいレコードを作成したときに発生します。
create_recordコマンドと同等です。 - KEY-DELREC(ブロックレベル):既存のレコードを削除したときに発生します。
delete_recordコマンドと同等です。 - PRE-BLOCK(ブロックレベル):ブロックに入ったときに発生します。
- POST-BLOCK(ブロックレベル):ブロックから出たときに発生します。
- SELECT_ALL(ブロックレベル):すべてのレコードを選択したときに発生します。
- DESELECT_ALL(ブロックレベル):すべてのレコードの選択を解除したときに発生します。
- WHEN-CLEAR-BLOCK(ブロックレベル):ブロックをクリアしたときに発生します。
- WHEN-MOUSE-CLICK(ブロックレベル):マウスをクリックしたときに発生します。
- WHEN-NEW-RECORD-INSTANCE(ブロックレベル):ブロック上でレコードを作成または照会したときに発生します。
トリガーの手動作成方法
APP_MULTI を利用するには、必要なトリガーを作成し、処理対象のイベント名を引数として渡して APP_MULTI.EVENT プロシージャを明示的に呼び出す必要があります。プロシージャの定義は以下のとおりです。
PROCEDURE event(p_event_name VARCHAR2,
p_blockname VARCHAR2 DEFAULT NULL);
たとえば、KEY-CLRREC トリガーは次のように非常にシンプルに記述できます。
APP_MULTI.EVENT('KEY-CLRREC');
ポイント:このプロシージャにはオプション引数 p_blockname を渡すことができます。省略した場合、SYSTEM.TRIGGER_BLOCK の値が自動的に使用されます。
選択・選択解除イベントの通知
カスタムの MULTI_RETURN_ACTION トリガーをデータブロック内、またはフォームの最上位レベルに実装すると、レコードの選択・選択解除のタイミングでシステムから通知を受け取ることができます。このトリガーは、個別のレコード操作でも一括操作でも、選択または解除が行われるたびに起動されます。
トリガー内で使える変数
トリガー内では、以下の変数を利用できます。
- GLOBAL.APPCORE_MULTI_BLOCK:選択・選択解除の影響を受けたデータブロックの名前が格納されるグローバル変数です。
- GLOBAL.APPCORE_MULTI_ACTION:以下のいずれかの値を持つグローバル変数です。
- **'RECORD_SELECTED'**: レコードが選択されたとき - **'RECORD_DESELECTED'**: レコードの選択が解除されたとき - **'LABEL_CHANGE'**: 「すべて選択」「すべて解除」メニュー項目の 有効/無効が切り替わったとき - APP_MULTI.LOOPING:MULTI_RECORD_ACTION をループ内で呼び出したかどうかに応じて TRUE または FALSE となるパッケージ変数です。
フォーム上で選択されたデータの取得方法
APP_MULTI パッケージは、各データブロックに対して、現在選択中のレコード番号を保持するレコードグループを管理しています。データブロック名を指定することで、以下の処理が可能です。
- APP_MULTI.GET_GROUP_COL 関数を使って、特定のデータブロックのレコードグループにある唯一のカラムへアクセスします。
- APP_MULTI.GET_GROUP_COUNT 関数を使って、選択されているレコードの件数を取得します。
たとえば、「個別ジョブ(Discrete Jobs)」フォームのブロック W_JOBS、フィールド WIP_ENTITY_ID がある場合、次の PL/SQL コードで選択済みジョブの ID を表示できます。
DECLARE
record_number_column groupcolumn;
selected_record_count NUMBER;
BEGIN
record_number_column := app_multi.get_group_col ('W_JOBS');
selected_record_count := app_multi.get_group_count ('W_JOBS');
FOR i IN 1 .. selected_record_count
LOOP
DECLARE
record_number NUMBER;
v_wip_entity_id NUMBER;
BEGIN
record_number := GET_GROUP_NUMBER_CELL (record_number_column, i);
GO_RECORD (record_number);
v_wip_entity_id := NAME_IN ('W_JOBS.WIP_ENTITY_ID');
fnd_message.debug ('v_wip_entity_id' || v_wip_entity_id);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END LOOP;
END;
まとめ
APP_MULTI パッケージを活用すれば、カスタムの Oracle Forms で大量データを効率的に処理できるようになります。ユーザーが標準フォーム上で選択した大量データの詳細情報を取得でき、フォームパーソナライズや CUSTOM.PLL のコードの中で使用することで、標準の Oracle フォームに独自の機能を追加することも可能です。
ご意見やご質問がある場合は、フィードバックタブからお気軽にお寄せください。チャットでのご相談も受け付けています。
-
Oracle Databaseのリフレッシュ可能なクローン機能を使いこなす ― パート1:基本概念と仕組みの解説
Oracle® Database 18c Enterprise Edition(クラウド版)は、Exadataなどのエンジニアード・システムと組み合わせることで、数多くの新機能と改良された機能を提供します。Release 18cでは、12c Release 2から搭載されていたリフレッシュ可能なクローン(Refreshable Clone)機能が強化され、迅速なスイッチオーバーやフェイルオーバーが可能になりました。さらに、マルチテナント環境において、スナップショット・カルーセル(Snapshot Carousel)を使用してプラガブル・データベース(PDB)のクローンや複製を作成することもでき
-
画面オフの状態でも「OK Google」を使う方法|Googleアシスタントをロック画面から起動する3つのテクニック
Googleアシスタントは、Androidユーザーの生活をより便利にしてくれる非常に賢く実用的なアプリです。人工知能(AI)を活用してユーザー体験を最適化するパーソナルアシスタントであり、スケジュール管理、リマインダーの設定、電話の発信、メッセージの送信、ウェブ検索、ジョークや歌など、さまざまな用途に活用できます。さらに、簡単ながらも機知に富んだ会話を楽しむことさえ可能です。ユーザーの好みや選択を学習しながら徐々に精度を高めていくため、時間とともにどんどん賢くなり、できることが増えていきます。常に新機能が追加され続けることから、Androidスマートフォンにとって欠かせない存在となっています。