2023年6月7日水曜日

ページをリダイレクトしてダイアログまたはドロワーを直接開く

 モーダル・ダイアログまたはドロワーは、レポートのページなどが開かれている状態から、そのページに重なるように表示されます。そのため、基となるページが必要で、他のページからリダイレクトする宛先にモーダル・ダイアログやドロワーのページを指定することはできません。

ドロワーを開く基となるページをリダイレクトの宛先として、その宛先に渡した引数を元にドロワーを開く実装を行なってみます。

以下のように動作します。


実装には、サンプル・データセットEMP/DEPTに含まれる表EMPを使います。

アプリケーション作成ウィザードを起動します。名前ドロワーのオープンとします。

ページの追加をクリックし、表EMPをソースとした対話モード・レポートとフォームのページを追加します。


対話モード・レポートを選択します。


ページ名EMPとし、表またはビュー対話モード・レポートを選択します。表またはビューEMPを選択します。フォームを含めるチェックを入れます。

ページの追加をクリックします。


以上で、アプリケーションの作成を実行します。


アプリケーションが作成されたら、リダイレクトの宛先となる対話モード・レポートのページ(ページ番号)を、ページ・デザイナで開きます。


リダイレクト時の引数となるページ・アイテムP2_EMPNOを作成します。P2_EMPNOに指定されている従業員をドロワーで開きます。

識別名前P2_EMPNOタイプ非表示とします。セッション・ステートストレージリクエストごと(メモリーのみ)を選択します。


オープンするドロワーを指すURL(実際にはJavaScriptのコード)を保持するページ・アイテムP2_TARGETを作成します。タイプ非表示セッション・ステートストレージリクエストごと(メモリーのみ)です。


引数P2_EMPNOの値より、ターゲットとなるURLを生成します。

レンダリング前にプロセスターゲットの生成を作成します。タイプとしてコードを実行を選択します。

PL/SQLコードとして以下を記述します。p_pageにダイアログまたはドロワーのページが指定されている場合はURLではなく、JavaScriptのコードが返されます。
:P2_TARGET := apex_page.get_url(
    p_page => 3
    ,p_items => 'P3_EMPNO'
    ,p_values => :P2_EMPNO
);
サーバー側の条件タイプアイテムはNULLではないを選択し、アイテムとしてP2_EMPNOを指定します。引数P2_EMPNOに値が渡されているときに限り、P2_TARGETの値を設定します。


ターゲットとして生成されたJavaScriptを実行し、ドロワーを開く動的アクションを作成します。

動的アクション・ビューを開き、ページのロードに動的アクションターゲットを開くを作成します。


TRUEアクションとしてJavaScriptコードの実行を選択し、設定コード&P2_TARGET.を記述します。

クライアント側の条件タイプとしてアイテムはnullではないを選択し、アイテムP2_TARGETを指定します。P2_TARGETに値がない場合は、対話モード・レポートが表示され、ドロワーは開きません。


以上でドロワーを開く設定ができました。

ページ・デザイナホーム・ページを開き、直接ドロワーを開く機能を実装します。

従業員を選択するページ・アイテムP1_EMPNOを作成します。識別タイプとして選択リストを選びます。ラベル従業員とします。設定選択時のページ・アクションとしてRedirect and Set Valueを選択します。

LOVタイプとしてSQL問合せを選択し、SQL問合せに以下を記述します。

select ename d, empno r from emp


詳細保存されていない変更の警告として無視を選択します。選択時のページ・アクションRedirect and Set Valueのときは、ページ・アイテムの値が変更された後にリダイレクトが発生するため、必ず警告が表示されます。警告が表示されないよう、この属性に無視を設定します。


ドロワーを開くボタンを作成します。

識別ボタン名OPENラベルOpenとします。動作アクションとしてこのアプリケーションのページにリダイレクトを選択します。


ターゲットをクリックし、リンク・ビルダーを開きます。

ターゲットページは対話モード・レポートのページである(ドロワーのページではありません)、アイテムの設定として名前P2_EMPNO&P1_EMPNO.を設定します。


以上でアプリケーションは完成です。

今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/open-drawer-on-page-redirect.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。