Oracle APEX 21.2より、JavaScript APIのapex.item.setValueを呼び出してポップアップLOVの値を設定したときに、同時にページ・アイテムの表示と追加値も更新されるようになりました。
以下のGIF動画では、最初にポップアップLOVを操作して値を選択しています。その次に動的アクションによって、ポップアップLOVに従業員番号を設定しています。従業員名の表示とジョブの表示も更新されています。
アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。アプリケーションの名前は任意です。
ポップアップLOVで追加値を扱う場合は、共有コンポーネントのLOVが必要です。表EMPを扱うLOVを作成します。共有コンポーネントのLOVを開きます。
LOVの作成は最初からを選択し、次へ進みます。
LOVの名前はLOV_EMP、タイプはDynamicとします。次へ進みます。
ソース・タイプはTable、表/ビューの名前としてEMP(表)を選択します。次へ進みます。
戻り列はEMPNO、表示列はENAMEとします。作成をクリックします。
共有コンポーネントのLOV、LOV_EMPが作成されます。追加値を扱えるように設定を加えます。LOV_EMPをクリックして編集画面を開きます。
追加表示列の列の選択をクリックします。
今回は検証なので、すべての列を追加表示列にします。更新をクリックします。
以上でLOVの設定は完了です。変更の適用をクリックして共有コンポーネントの作業を終了します。
ホーム・ページをページ・デザイナで開き、ページ・アイテムを3つ作成します。
最初にポップアップLOVのページ・アイテムP1_EMPNOを作成します。
識別の名前はP1_EMPNO、タイプはポップアップLOVです。ラベルは従業員とします。追加出力としてJOB:P1_JOBを指定します。LOVのタイプは共有コンポーネント、LOVは先ほど作成したLOV_EMPを指定します。
追加出力のジョブを保持するページ・アイテムP1_JOBを作成します。
識別の名前はP1_JOB、タイプはテキスト・フィールド、ラベルはジョブとします。
動的アクションの引数とする従業員番号を入力するページ・アイテムP1_EMPNO_DAを作成します。
識別の名前はP1_EMPNO_DA、タイプはテキスト・フィールド、ラベルは従業員#とします。
ポップアップLOVに値を設定するJavaScriptのコードを、動的アクションとして実行するボタンを作成します。
識別のボタン名はB_SET、ラベルは設定とします。動作のアクションとして動的アクションで定義を選択します。
動的アクションは、タイミングとしてボタンB_SETをクリックした時にTRUEアクションが実行されるように設定します。
TRUEアクションを設定します。識別のアクションとしてJavaScriptコードの実行を選択します。コードとして以下を記載します。
apex.item("P1_EMPNO").setValue($v("P1_EMPNO_DA"));
Oracle APEX 21.2からは、apex.item.setValueでポップアップLOVの値を設定すると、画面上の表示および追加値も変更されます。結果として、最初のGIF画面の動作になります。
Oracle APEX 21.2ではapex.itemsというネーム・スペースが追加され、ページ・アイテムの参照が容易になっています。apex.itemsを使用すると上記のコードを、以下に書き換えることができます。
apex.items.P1_EMPNO.setValue(
apex.items.P1_EMPNO_DA.getValue()
);
Oracle APEX組み込みのJavaScriptのコード・エディタは、apex.items.から続くページ・アイテム名の補完を行うようになっています。
ページ・アイテムから呼び出せるファンクション名も補完してくれます。
apex.items以外にコーディングを容易にするネーム・スペースとして、apex.regionsおよびapex.envが追加されています。
ポップアップLOVの拡張については以上になります。
今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/new212-popup-lov-setvalue.sql
Oracle APEXのアプリケーション作成の参考になれば幸いです。
追記
apex.item.setValueを呼び出す他にアクションの値の設定でも、同様に表示と追加値が設定されます。
設定のタイプの設定としてJavaScript Expressionを選択し、JavaScript式としてapex.items.P1_EMPNO_DA.getValue()、影響を受ける要素として選択タイプをアイテム、アイテムにP1_EMPNOを選択します。
完