2023年7月6日木曜日

対話グリッドの選択リストの列に動的アクションで値を設定する

 対話グリッドの列に設定した値より、別の列の選択リストに値を設定する方法を紹介します。

以下の動画のように、列Product Name製品名を入力したときに、列Shop販売会社を設定します。列Shopに設定された販売会社は初期値で、選択リストを開いて変更できます。


以下のスクリプトを実行し、上記のサンプル・アプリケーションで使用するスキーマを作成します。


アプリケーション作成ウィザードを起動します。アプリケーションの名前選択リストの初期化とします。

ホーム・ページを削除し、代わりに対話グリッドのページを追加します。


対話グリッドのページは、以下の設定で作成します。

ページ名Orders表またはビュー編集を許可を選択します。

表またはビューとしてSHP_ORDERSを選択します。

詳細ホームページとして設定にチェックを入れます。


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

アプリケーションが作成されたら、ページ・デザイナで対話グリッドのページを開きます。

ページ・プロパティJavaScriptファンクションおよびグローバル変数の宣言に以下を記述します。

var defaultShops;

この変数defaultShopsは、製品名と販売会社の組み合わせをキャッシュするために使用します。


対話グリッドShp Ordersを選択し、静的IDとしてordersを設定します。


プロセス・ビューを開きます。

製品名より販売会社の初期値を求めるプロセスを、Ajaxコールバックとして作成します。

識別名前GET_DEFAULT_SHOPとします。この名前は、JavaScript側から呼び出すファンクションapex.server.processの引数として与えるため、変更はできません(変更する場合は、apex.server.processの引数も変更する)。

タイプコードを実行を選び、ソースPL/SQLコードとして以下を記述します。



レンダリング・ビューを開きます。

PRODUCT_NAME動的アクションを作成します。

識別名前onChange ProductNameタイミングはデフォルトでイベント変更選択タイプ対話グリッドShp OrdersPRODUCT_NAMEになります。


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

ページ・アイテムのAPIのsetValueは、引数として表示値(pDisplayValue)、値(pValue)を指定できますが、対話グリッドのsetValueは値(pValue)のみです。そのため、対話グリッドの選択リストやポップアップLOVへ値を設定するには、JSON形式{ d: "表示値", v: "値" } で渡します。


この状態でアプリケーションを実行すると、記事の先頭のGIF動画のように動作します。

とはいえ、対話グリッドに製品名を入力するたびに、ブラウザからデータベースへの問合せが発生するため、今ひとつ反応が良くありません。

ページが開いた時点で、製品名と販売会社の組み合わせを変数defaultShopsにキャッシュする機能を追加します。

プロセス・ビューを開き、AjaxコールバックとしてGET_DEFAULT_SHOPSを作成します。PL/SQLコードとして以下を記述します。



レンダリング・ビューに戻り、ページ・プロパティJavaScriptページ・ロード時に実行に以下を記述します。



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

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

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