2023年12月8日金曜日

APEX 23.2の新しいアイテム・タイプ、コンボボックスを使ってみる

Oracle APEX 23.2では新しいページ・アイテムのタイプとして、コンボボックスが追加されました。すでにあるポップアップLOVと似ていますが、以下の違いがあります。
  1. 手動入力された値は、手動入力アイテムとして設定されたページ・アイテムに入力されます。コンボボックスのページ・アイテムには入力されません。
  2. ポップアップして表示される選択画面に適用するHTML式(テンプレート・ディレクティブ)を指定できます。ポップアップLOVでは、初期化JavaScriptコードrecordTemplateとして設定する必要があります。
APEX Office Hoursにて、開発者のAlexis Galdamezさんがコンボボックスの紹介をされています。14:51頃から29:30頃までです。
Part 1: What's new in Oracle APEX 23.2 - Preview

コンボボックスでは、LOVに含まれていない値でもページ・アイテムに設定できます。反対に、LOVに含まれている値だけ入力できるように制限することはできません。そのような要件では、従来からあるポップアップLOVを使用します。

実際にコンボボックスを使ったAPEXアプリケーションを作成し、使い方を確認してみます。

好みの食べ物を複数選択する機能をコンボボックスを使って実装します。

クイックSQLの以下のモデルより、表COMBO_FOODSCOMBO_FAVORITESを作成します。表COMBO_FOODSはコンボボックスのLOVのソース、つまり食べ物のマスター表になります。表COMBO_FAVORITESはそれぞれの人の好みの食べ物を保存します。複数の食べ物を、好みの食べ物として選ぶことができます。

Oracle APEX 23.2よりクイックSQLがリファクタリングされ、JavaScriptで書き換えられました。モデルを記述するとすぐにSQLが生成されます。


ダイアグラムも表示できます。

レビューおよび実行をクリックします。


生成されたDDLがSQLスクリプトスクリプト・エディタで開かれます。

スクリプト名Sample Comboboxと入力し、実行をクリックします。

ここからの作業の流れは、APEX 23.2以前と変わりません。


即時実行します。


COMBO_FOODSCOMBO_FAVORITESが作成されます。

続けてアプリケーションの作成をクリックします。


アプリケーションの作成をクリックします。


アプリケーション作成ウィザードが起動します。表COMBO_FOODSCOMBO_FAVORITESフォーム付き対話モード・レポートのページが追加されています。

COMBO_FOODSフォーム付き対話モード・レポート編集をクリックし、編集ダイアログを開きます。


詳細を開き、管理ページとして設定チェックを入れます。

変更の保存をクリックします。


COMBO_FAVORITESフォーム付き対話モード・レポートについても同じ操作を行い、管理ページに設定します。

管理ページに設定すると、アイコンがスパナに代わります。表COMBO_FOODSと表COMBO_FAVORITESフォーム付き対話モード・レポート管理ページになっていることを確認し、アプリケーションの作成を実行します。

作成されるアプリケーションの名前Sample Comboboxです。


アプリケーションが作成されます。

アプリケーションを実行し、食べ物のマスター・データを投入します。


ナビゲーション・メニューより管理を開き、アプリケーション管理Foodsを実行します。


作成をクリックし、適当に食べ物を登録します。

以下の画面では、お寿司たこ焼きまんとうハンバーガーをFoods(表COMBO_FOODS)に登録しています。


ここで登録した食べ物を、共有コンポーネントLOVとして扱えるようにします。

共有コンポーネントLOVを開くとCOMBO_FOODS.NAMEが作成されています。アプリケーション作成ウィザードは、表COMBO_FAVORITESに定義されている参照制約よりLOVを自動的に作成しています。

LOVCOMBO_FOODS.NAMEを開き、追加表示列列の選択をクリックします。


COUNTRYDESCRIPTION表示列に追加し、更新します。


NAMECOUNTRYおよびDESCRIPTION表示可能検索可能Yesであることを確認します。

変更の適用をクリックします。


以上でLOVの準備は完了です。

アプリケーションにサインインしたユーザーが、好みの食べ物を登録するページを作成します。好みの食べ物を選ぶために、コンボボックスを使います。

ページの作成をクリックします。


空白のページを選択します。


ページ番号6名前Comboboxとします。

ナビゲーションブレッドクラムの使用ナビゲーションの使用はともにオンです。

ページの作成をクリックします。


好みの食べ物を指定するページ・アイテムとしてP6_FAVORITESを作成します。タイプコンボボックスです。

設定複数の値オンにします。属性については手動入力アイテムHTML式を除くと、ポップアップLOVと概ね同等です。

LOVタイプとして共有コンポーネントLOVとしてCOMBO_FOODS.NAMEを指定します。コンボボックスでは追加値は必ず手動入力アイテムに設定され、コンボボックスのアイテムに含まれることはありません。そのため、追加値の表示はオンでもオフでも挙動は同じですが、コンボボックスのアイテムに追加値が現れないことを確実にするため、オフにしておきます。


手動入力アイテムとして設定するページ・アイテムを作成します。

識別名前P6_MANUAL_VALUESタイプテキスト・フィールドとします。ラベルManual Valuesとしています。


通常はこの値を利用者に見せる必要はないため、タイプ非表示を選び、保護された値オフにします。


今回は手動入力として認識された値を画面に表示させるため、タイプテキスト・フィールドを選んでいます。

作成したページ・アイテムP6_MANUAL_VALUESを、コンボボックスのページ・アイテムP6_FAVORITES手動入力アイテムとして設定します。


コンボボックスの値を確認するために、ページ・アイテムに設定されている実際の値を表示させるページ・アイテムを作成します。

識別名前P6_ACTUAL_VALUESタイプ表示のみラベルActual Valuesとします。設定ページの送信時に送信オフにします。


ページ・アイテムP6_FAVORITESの値が変更されたときに、確定した値をP6_ACTUAL_VALUESに設定するため、動的アクションを作成します。

識別名前Changeタイミングはページ・アイテムのデフォルトである変更選択タイプアイテムアイテムP6_FAVORITESです。


TRUEアクション値の設定設定タイプの設定としてJavaScript式を選び、JavaScript 式として$v(this.triggeringElement)を記述します。変更イベントの禁止オンにします。

影響を受ける要素選択タイプアイテムアイテムとしてP6_ACTUAL_VALUESを指定します。


この時点でアプリケーションを実行し、動作を確認してみます。

Favoritesとしてお寿司たこ焼き天ぷらを設定しました。お寿司たこ焼きは表COMBO_FOODSに登録されていますが、天ぷらは未登録です。そのため、天ぷらManual Values(手動入力アイテム)の値となっています。


送信ボタンを作成します。

ボタン名SUBMITラベル送信外観ホットオンにします。テンプレート・オプションWidthStretchとします。

動作アクションはデフォルトのページの送信です。


送信ボタンを押した時に実行されるプロセスにて、コンボボックスP6_FAVORITESの値を表COMBO_FAVORITESに登録します。

識別名前Favoritesの登録とします。タイプコードを実行です。ソースPL/SQLコードとして以下を記述します。


サーバー側の条件ボタン押下時SUBMITを指定します。


ページ・アイテムP6_FAVORITESソースを、セッション・ステートからデータベースに保存された値に変更します。

ページ・アイテムP6_FAVORITESを選択します。

ソースのタイプとしてSQL問合せ(コロン区切りの値を返す)を選択し、SQL問合せとして以下を記述します。
select listagg(food_id,':') within group (order by food_id asc) from combo_favorites where person_name = :APP_USER group by person_name

使用セッション・ステートの値がNULLの場合のみを選択し、セッション・ステートストレージリクエストごと(メモリーのみ)とします。


ページ・アイテムP6_MANUAL_VALUESP6_ACTUAL_VALUESも同様に、ソース使用セッション・ステートの値がNULLの場合のみを選択し、セッション・ステートストレージリクエストごと(メモリーのみ)とします。


以上でコンボボックスのサンプルが実装できました。

先ほどの続きで、Favoritesお寿司たこ焼き、そして天ぷらを入力します。天ぷらは表COMBO_FOODSに登録されていないため、Manual Valuesに設定されます。

送信をクリックすると天ぷらが表COMBO_FOODSに登録された上で、表COMBO_FAVORITESに登録されます。結果としてFavoritesお寿司たこ焼き天ぷらの3つの値が表示されます。


管理Foodsを開くと確認できますが、表COMBO_FOODSに登録されているため、天ぷらは手動入力された値とは見做されません。


今まであるポップアップLOVと比較してみます。新しいコンボボックスはポップアップLOVを置き換えるものではありません。

Comboboxのページをコピーします。

ページの作成をクリックします。


コピーとしてのページの作成をクリックします。


次のコピーとしてのページを作成としてこのアプリケーションのページを選択します。

へ進みます。


コピー元ページ6. Comboboxです。新規ページ番号として7新規ページ名Popup LOVとします。ブレッドクラム親エントリなしエントリ名Popup LOVとして作成します。

へ進みます。


ナビゲーションのプリファレンスとして新規ナビゲーション・メニュー・エントリの作成新規ナビゲーション・メニュー・エントリPopup LOVとします。親ナビゲーション・メニュー・エントリーは選択しません(- 親が選択されていません -を選びます)。

へ進みます。


ページをコピーするにあたって変更が必要なラベルはありません。

コピーを実行します。


ページがコピーされます。

コピーされたページのページ・アイテムP7_FAVORITESを選択し、タイプコンボボックスからポップアップLOVに変更します。

設定複数の値オンにし、手動入力オフにします。LOV追加値の設定オフにします。

手動入力を許可しない場合はポップアップLOVを使用します。コンボボックスは、手動入力を禁止することはできません。


ポップアップLOVに変更した動作を確認してみます。手動入力を除くと、コンボボックスと変わらない動作になります。


ポップアップLOVの手動入力オンにすると、新機能としてコンボボックスが作成された理由が分かります。

このページをページ番号8にコピーし、ページ・アイテムP8_FAVORITES設定手動入力オン追加値の表示オンにしてみます。


ポップアップLOVの場合、手動入力オンにすると、入力する値は表示値ではなく戻り値の入力が求められます


表示値戻り値が同じ値であれば用途はありますが、コンボボックスのように使うことはできません。

新しいコンボボックスHTML式を確認してみます。ページ番号Comboboxのページを、ページ番号Fancy Comboboxとしてコピーします。

ページ・アイテムP9_FAVORITESを選択し、設定HTML式に以下を記述します。

食べ物の名前を太字にし、国名説明は設定されているときだけ表示するようにしています。


コンボボックスの選択リストは、以下のように表示されます。


コンボボックスの設定複数選択オンにすると、選択リストにチェックボックスが現れ、選択リスト上で複数の選択を行うことができるようになります。


選択リストは以下のように表示されます。


Oracle APEX 23.2の新しいコンボボックスの紹介は以上になります。

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

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