2026年6月30日火曜日

APEX 26.1の対話モード・レポートでの生成AIの利用について

APEX 26.1では、生成AIを活用して自然言語で対話モード・レポートを操作できるようになりました。この機能はAI Interactive Reportと呼ばれています。

概ね、以下のGIF動画のように操作します。動画では以下のプロンプトを与えています。
  • プラム色の服を一覧して。
  • レポートをリセットして。
  • カテゴリ別の服の数を左から少ない順にチャート表示して。
  • このチャートをレポートとして保存して。
  • レポートをリセットして

以下より、対話モード・レポートで生成AIを使用するための設定手順と、その設定について調べたことを紹介します。

公式ブログの以下の記事とAPEX Office Hoursの録画を参考にしています。

Talk to Your Data, Trust the result. Introducing APEX AI Interactive Reports

What's New in APEX 26.1 - Part 4

最初にOracle APEXから生成AIを呼び出すには、ワークスペース・ユーティリティの生成AIに、生成AIサービスを作成する必要があります。

ワークスペース・ユーティリティの生成AIを開きます。


プロバイダのタイプ、APIのエンドポイントURL、APIキー、呼び出すモデルをまとめて、生成AIサービスとして作成します。


対応しているAIプロバイダは、OCI生成AIサービス、OpenAI、Cohere、Google Gemini、Anthropic Claude、Mistral AI、Ollama、汎用(OpenAI API互換)です。

OpenAIについてはChat Completions APIで、Responses APIではありません。また、OpenAIと汎用(OpenAI API互換)は、APIキーが必須かどうかが設定上の違いに見えます。


AIプロバイダとしてOpenAIを選択した場合を例にとります。

最低限、名前、ベースURL、APIキー、静的ID(これは名前からデフォルト値が生成されます)、AIモデルを設定します。

後ほど説明しますが、AI Interactive Reportで使用するLLMは、必ずツール呼び出しに対応しているモデルで、できるだけツール呼び出しに強いモデルを選びます。


ここで資格証明に新規作成を選ぶと、新しく作成されたWeb資格証明にAPIキーが保存されます。


APIキーの更新は、Web資格証明から実施します。


動作確認に使用する、空のAPEXアプリケーションを作成します。名前はAI Interactive Reportとします。


対話モード・レポートで生成AIを使用するには、APEXアプリケーションのアプリケーション定義のAIで、サービスを設定します。

ワークスペース・ユーティリティの生成AIで作成した、生成AIサービスを選択します。


以上で対話モード・レポートで生成AIを使用する準備ができました。

ホーム・ページを開き、対話モード・レポートのリージョンを作成します。

識別の名前はApparel Products、タイトルもApparel Products、タイプは対話モード・レポートとします。

ソースの位置にサンプル・データを選び、サンプル・データとして製品を選択します。

データベースに表を作成せずにレポートの動作を確認できるように、APEX 26.1から追加されたデータ・ソースです。

以上で、動作する対話モード・レポートが作成できました。


ページを実行します。APEX 26.1以前の対話モード・レポートです。


生成AIを使った自然言語による操作を有効にします。

属性タブの生成AIにある自然言語サポートをオンにします。

デフォルトの検索モードとしてAIによる検索と行検索のどちらかを選べます。

レポート・コンテキストに、このレポートについてAIに解釈させる説明を記述します(レポートの定義情報は、システム・プロンプトに含まれています。レポート・コンテキストはこれらの定義情報に追加されます)。

ここで記述した文章は、レポートの定義情報のひとつとして、生成AIに送信されるシステム・プロンプトに含まれます。生成AIに送信されるのはレポートの定義情報で、レポートのソースが表やビューであっても、それらのメタ・データは生成AIに送信されません。

以上の設定で、対話モード・レポートで生成AIを使用できるようになりました。


対話モード・レポートの検索フィールドへの入力に、AIによる検索か行検索のどちらかを選べます。


対話モード・レポートで設定したデフォルトの検索モードは、この設定にあたります。

検索モードがAIによる検索の場合、検索フィールドに自然言語を入力してレポートを操作できるはずなのですが、APEX 26.1ではなぜか、日本語だけ(英語はもちろん韓国語や中国語も大丈夫)が行検索として認識されてしまうようです。


アシスタントを開いて入力すると、生成AIを使った自然言語による操作ができます。


アシスタントに「Shirtsだけを一覧して。」と伝えます。

対話モード・レポートのフィルタとしてCategory = 'Shirts'が追加され、レポートがリフレッシュされます。


このとき、対話モード・レポートのアシスタントに入力したメッセージが、生成AIに送信されます。対話モード・レポートには、アクションとしてレポートに適用できる操作が実装されていますが、それらの操作がツール定義としてメッセージと一緒に送信されています。


すべてのアクションがツール定義に含まれてはいないようですが、例えば、フィルタ・ツール、ソート・ツール、ハイライト・ツールといったツールが(OpenAIでの説明ではFunction calling)利用可能なツールとして、生成AIに送信されています。

生成AIはメッセージが「Shirtsだけを一覧して。」であることを認識して、フィルタ・ツールを呼び出してCategory = 'Shirts'を設定するように、レスポンスを返します。それを受けて、APEXはAPEX_IR.ADD_FILTERといったAPIを呼び出す、といった処理の流れになっています。

そのような処理であるため、任意のSQLが実行できるといった、いわゆるNL2SQLにあるようなセキュリティ上の懸念はありません。生成AIができることは、生成AIへのリクエストにツールとして渡している処理に限定されます。

AI Interactive Reportの説明では「生成AIで検索」できるといったような表現が見られますが、対話モード・レポートのAPIを生成AI経由で呼び出しているというのが処理の実態なので、自然言語で対話モード・レポートを操作する、というのがより正しい説明になるでしょう。

対話モード・レポートの説明はレポート・コンテキストに記述し、それが生成AIに送信されます。レポートのそれぞれの列についても、生成AIに送信するメッセージを設定できます。

列のプロパティとして生成AIが追加されています。

列コンテキストに列の説明を記述します。ここで記述した文章は、生成AIに送信されるメッセージのシステム・プロンプトに追加されます。

それに加えて、参照データ型があります。なし、共有コンポーネント、SQL問合せ、静的値から選んで設定します。


AI Interactive Reportから生成AIに送信されるメッセージに、対話モード・レポートから取り出される(つまり対話モード・レポートのソースから取り出されている)情報は含まれません。

その代わりに、参照データ型から取り出される情報を、その列の参照データ(referenceData)としてシステム・プロンプトに追加します。例えば、対話モード・レポートで個人情報を表示していたとしても、生成AIには参照データとして存在しない人名や電話番号といった情報を送信することができます。

参照データ型に静的値を選択した場合、静的値として以下のように値を設定します。システム・メッセージを確認したところ、コンポーネントとしてLOVを流用しているためか、表示値と戻り値がありますが、参照データとしてシステム・プロンプトに含まれるのは表示値のみのようです。そのため、参照データ型は共有コンポーネントやSQL問合せでも、表示値と戻り値が同じ値になるように構成すると良いでしょう。


今回の記事は以上になります。

NL2SQLとは異なり、データベースに保存されている業務データが生成AIに送信されることが無いように設計されているため、気軽に自然言語でレポートを操作することができます。

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

完

2026年6月29日月曜日

APEX 26.1の新しいアプリケーション・タイプを使う

Oracle APEX 26.1からアプリケーションの属性としてアプリケーション・タイプが新設されました。APEXアプリケーションは、テーマ、ライブラリ、ボイラープレート、標準のどれかのアプリケーション・タイプに設定されます。APEX 26.1以前のアプリケーションは標準にあたります。新設された3つタイプについて、リリース・ノートでは以下のように説明されています。

2.9 New Application Types

To promote consistency and simplify shared component reuse, three new types of applications are now available:
  • Theme - Contains a theme definition that defines the visual style of an application through theme assets such as styles, templates, and template components.
  • Library - Contains reusable shared components such as authentication schemes and lists of values (LOVs) that can be subscribed to by standard applications.
  • Boilerplate - Provides seeded shared component subscriptions and pre-built pages designed to accelerate the creation of new applications.
Existing applications now have an application type of Standard. You can boost productivity and ensure consistency by using boilerplate applications as starting points for new applications, subscribing to shared components from library applications on existing applications, or maintaining instance-specific themes in theme applications.

これまでのAPEXのアプリケーションでもアプリケーションが異なる共有コンポーネントを、サブスクライブすることにより参照することができました。APEX 26.1から、サブスクライブされる共有コンポーネントを保持するためだけのアプリケーション・タイプとして、テーマとライブラリが設定されています。

アプリケーション・タイプがテーマであるアプリケーションは、スタイル、テンプレートおよびテンプレート・コンポーネントを保持します。

アプリケーション・タイプがライブラリであるアプリケーションは、認証スキーム、LOVおよびリストなどを保持します。

アプリケーションの見た目に関するテーマは、多くの場合、すべてのアプリケーションに適用することが多いと思います。そのため、アプリケーション・タイプがテーマのアプリケーションはAPEXワークスペースにひとつまたは少数作成し、それをその他のアプリケーションから参照する使い方になるでしょう。

認証スキーム、LOVやリストなどは、例えば顧客管理や販売管理といったアプリケーションのグループ単位で共有するものが多く、アプリケーション・タイプをライブラリとして、テーマよりも細かい単位で分けて保持させます。

ボイラープレートは、テーマやライブラリとは異なり、共有コンポーネントを保持するためのアプリケーション・タイプではありません。あらかじめテーマやライブラリのサブスクライブやアプリケーションへの適用を行なった後に、アプリケーション・タイプをボイラープレートに変更し、新規に作成するアプリケーションの雛形とするものです。アプリケーション・タイプがボイラープレートのアプリケーションがAPEXワークスペースに存在すると、アプリケーションの作成時に雛形のアプリケーションとして、それらのボイラープレートを選択することができます。

企業向けにカスタマイズしたテーマ・スタイルが適用され、必要な共有コンポーネントがサブスクライブ済みの状態から、アプリケーション開発を始めることができます。


アプリケーション・タイプがテーマ、ライブラリ、ボイラープレートのアプリケーションは、としては、アプリケーションとしては実行できません。

今から5年以上前になりますが、共有コンポーネントのサブスクライブを活用し、ひとつの大きなAPEXアプケーションを複数のアプリケーションに分割しする手順を解説しています。

記事:Oracle APEXアプリケーションのデプロイメントに使用できる設定の紹介

新しいアプリケーション・タイプの導入は、アプリケーションの分割を、よりシステムとして定義された方法で実施できるようにします。

APEXのアプリケーションはデプロイメントの単位がアプリケーションになっています。例えば、100ページある1つのAPEXアプリケーションを10人で共同開発するよりも、10ページある10のアプリケーションを、それぞれ10人で開発する方が、それぞれのアプリケーションを個別にデプロイ(エクスポートやインポートおよび動作確認など)できるため、開発効率が高くなります。

これ以降は、5年前の記事に書いた作業を、APEX 26.1のアプリケーション・タイプを使う形で実施し直してみます。
  1. 例題アプリケーションの作成
  2. アプリケーションの分割
  3. セッションの共有
  4. ホーム・ページ、ログイン・ページの共有
  5. ナビゲーションの更新
  6. テーマのサブスクリプション
  7. 共有コンポーネントのリフレッシュ
  8. ボイラープレート

例題アプリケーションの作成


SQLワークショップのサンプル・データセットより、プロジェクト・データをインストールし、それを元にアプリケーションを作成します。

SQLワークショップのユーティリティに含まれるサンプル・データセットを開きます。


プロジェクト・データのインストールをクリックします。

データセットの説明が表示されます。次へ進みます。


インストールされるデータセットがリストされます。確認してデータセットのインストールを実行します。

ロード結果が表示されます。そこからアプリケーションの作成を起動します。


アプリケーションの名前はDemonstration - Projectsだと長いので、Projectsに変更します。できるだけ作業を単純にするため、標準の機能はすべて外します。

言語を日本語(ja)に変更してアプリケーションの作成を行います。

以上で例題として使用するアプリケーションが完成しました。



アプリケーションの分割


作成されたアプリケーションをコピーして、以下の3つのアプリケーションを準備します。

ライブラリ用途 - Projects:認証スキーム、メニュー、LOVを含むライブラリ・アプリケーション。アプリケーション別名はprojectsとします。このアプリケーションはすでに作成済みです。

アプリケーション - Projects - Home:ページとしてHome、Dashboard、Statuses、Project Status、ログイン・ページ、管理を含む標準アプリケーション。アプリケーション別名はprojects-homeとします。

アプリケーション - Projects - Main:ページProjects、Milestones、Tasks、Project Task、Task Calendarを含む標準アプリケーション。アプリケーション別名はprojects-mainとします。

グローバール・ページはProjects - Home、Projects - Mainの双方のアプリケーションに含めます。


作成されているアプリケーションをコピーします。タスクからアプリケーションのコピーを実行します。


新規アプリケーション名はProjects - Homeとします。パブリック・レポートは作成されていないので、パブリック・レポートのコピーはオンでもオフでも結果は同じです。

次へ進みます。

確認画面からアプリケーションのコピーを実行します。


アプリケーションProjectsのコピーがProjects - Homeとして作成されます。


作成されたアプリケーションの別名をPROJECTS-HOMEに変更します。5年前とは異なり、簡易URLは必ずオンにします。


アプリケーションProjects - Homeからは、ページ3, 4, 5, 6, 7を削除します。


ページ・デザイナにて、ひとつひとつページを開いて、削除していきます。


ページ3、4、5、6、7ではカスケード削除は、いいえ - 対応するリスト・エントリを削除しないを選択し、ナビゲーション・メニューのリストからエントリが削除されないようにします。フォームのように、ナビゲーション・メニューに紐づいていないページでは、カスケード削除は表示されません。

ページを完全に削除を実行します。


アプリケーションProjects - Homeに、グローバル・ページ、Home、Dashboard、Statuses、Project Status、ログイン・ページ、管理が残ります。

ページの別名はナビゲーション・メニューのターゲット指定に使用します。それぞれのページに割り当てられている別名を覚えておきます。(ページ別名の管理については日本語の別名を英数字に変更すべきですが、今回はページ番号の10000をターゲット指定に使用します)。


アプリケーションProjects - Homeについては一旦作業は完了です。

同じ作業を実施して、アプリケーションProjectsをコピーしてアプリケーションProjects - Mainを作成します。アプリケーションの別名はPROJECTS-MAINに変更します。


アプリケーションProjects - Mainからは、ページ1, 2, 8, 9および9999と10000を削除します。


アプリケーションProjects - Mainに、グローバル・ページ、Projects、Milestones、Tasks、Project Taskが残ります。

ページの別名はナビゲーション・メニューのターゲット指定に使用します。それぞれのページに割り当てられている別名を覚えておきます。


アプリケーション・ビルダーにてアプリケーションProjectsを開き、アプリケーション・タイプをライブラリに変更します。


アプリケーション・タイプがライブラリまたはテーマであるアプリケーションは、標準ページを含むことができません。そのため、エラーが発生し、アプリケーション・タイプを切り替えることができません。


アプリケーションProjectsに含まれる標準ページをすべて削除します。


アプリケーションProjectsからすべてのページが削除されています。


アプリケーションProjectsのアプリケーション・タイプをライブラリに変更します。

変更の適用を実行します。


アプリケーションProjectsのアプリケーション・タイプがライブラリに変更されました。


以上でアプリケーションの分割は完了です。次から、分割したアプリケーションを一体で動作するように設定を行なっていきます。


セッションの共有



ライブラリ・アプリケーションであるProjectsを開き、共有コンポーネントの認証スキームを開きます。


認証スキームのOracle APEXアカウントを開き、セッション共有の設定を変更します。

タイプをカスタムに変更し、Cookie名は任意の値(ここではORA_WWV_APP_PROJECTSとしています)に設定します。それ以外はOracle APEXをホストしているサーバーの環境によって決まる値ですので、ご自身の環境に合った値を設定してください。

  • タイプ: カスタム
  • Cookie名: ORA_WWV_APP_PROJECTS
  • Cookieパス: 空白
  • Cookieドメイン: 空白
  • セキュア: OFF

アプリケーションProjects - Homeを開き、共有コンポーネントの認証スキームから、Oracle APEXアカウントを開きます。

サブスクリプションのサブスクライブ元として、ライブラリ・アプリケーションであるProjects(以下の例ではアプリケーションIDが109)が持つ認証スキームである109: Oracle APEXアカウントを選択します。

変更の適用を実行します。


現行の認証スキームの設定が、サブスクライブした認証スキームの設定に上書きされる旨、警告されます。

サブスクライブをクリックします。


認証スキームの一覧画面に戻ります。再度、Oracle APEXアカウントを開きます。


アプリケーションProjectsの認証スキームであるOracle APEXアカウントがサブスクライブされていることが確認できます。


アプリケーションProjects - Mainについても同様に、認証スキームOracle APEXアカウントを、ライブラリ・アプリケーションProjectsの認証スキームであるOracle APEXアカウントをサブスクライブするように設定します。

アプリケーションProjects - HomeとProjects - Mainで、同じ設定(特にクッキー名)の認証スキームをサブスクライブすることにより、アプリケーション間でセッションが共有されます。


ホーム・ページ、ログイン・ページの共有



今回はアプリケーションProjects - Homeに、ホーム・ページとログイン・ページを残しています。アプリケーションProjects - Mainは、ホーム・ページとログイン・ページとしてProjects - Homeのものを使うようにします。

アプリケーションProjects - Mainのアプリケーション定義のユーザー・インターフェースを開き、属性のホームURLとログインURLを変更します。
  • ホームURL: f?p=projects-home:home:&APP_SESSION.::&DEBUG.:::
  • ログインURL: f?p=projects-home:LOGIN:&APP_SESSION.::&DEBUG.:::

&APP_ID.置換文字列は自分自身のアプリケーションIDを意味するので、これをホーム・ページやログイン・ページを持つアプリケーションの別名であるprojects-homeへ置き換えます。また、ホームURLのページが1として数値で設定されていたので、別名のhomeに置き換えています。アプリケーションIDやページIDとして指定する部分には、できるだけ数値は使わない方がアプリケーションのメンテナンスが容易になります。

こちらについては、アプリケーションProjects - Mainだけの変更になります。アプリケーションに認証が必要なアクセスがあった場合、および、ホームページに移動する場合は、アプリケーションProjects - Homeへ遷移するようになります。


ナビゲーションの更新


ページ1、2、10000はアプリケーションProjects - Home、ページ3, 4, 5, 7はアプリケーションProjects - Mainをアクセスするよう、ナビゲーション・メニューを更新します。

ライブラリ・アプリケーションProjectsの共有コンポーネントのリストを開きます。この中のナビゲーション・メニューとページ・ナビゲーションを変更します。


他にも変更すべきリストはありますが、今回の例題の確認には影響がないため、そのままにします。

ナビゲーション・メニューを開いて、グリッド編集をクリックします。

分割されたアプリケーションを指すエントリのターゲットに、アプリケーションの別名を指定します。

  • Home: f?p=projects-home:home:&APP_SESSION.::&DEBUG.:::
  • Dashboard: f?p=projects-home:dashboard:&APP_SESSION.::&DEBUG.:::
  • Projects: f?p=projects-main:projects:&APP_SESSION.::&DEBUG.:::
  • Milestones: f?p=projects-main:milestones:&APP_SESSION.::&DEBUG.:::
  • Tasks: f?p=projects-main:tasks:&APP_SESSION.::&DEBUG.:::
  • Tasks Calendar: f?p=projects-main:tasks-calendar:&APP_SESSION.::&DEBUG.:::
  • 管理: f?p=projects-home:10000:&APP_SESSION.::&DEBUG.:::

ターゲット更新後、List: ナビゲーション・メニューのページを再ロードします。

ターゲットが適切に更新されていることを確認し、変更の適用を実行します。


リストのページ・ナビゲーションについても、同様にターゲットを変更します。


ページ・ナビゲーションは、Homeと管理は含みません。


アプリケーションにたいして簡易URLを設定していても、ナビゲーションに指定するURLについてはf?p=形式のURLを使用できます。簡易URLの形式で指定するにはワークスペース名を含める必要があるなど、ナビゲーションの宛先URLとしては使いにくいのでf?p=形式で指定できるのは助かります。

ライブラリ・アプリケーションProjectsで更新したリストであるナビゲーション・メニューおよびページ・ナビゲーションを、アプリケーションProjects - HomeとProjects - Mainからサブスクライブします。

それぞれのアプリケーションで、共有コンポーネントのリストのナビゲーション・メニューを開きます。

サブスクリプションのサブスクライブ元として109: ナビゲーション・メニューを選択し、変更の適用を実行します。109はライブラリ・アプリケーションProjectsのアプリケーションIDです。


リスト・エントリのターゲットが更新されるので、確認します。


同様に、共有コンポーネントのリストのページ・ナビゲーションを開き、109: ページ・ナビゲーションをサブスクライブします。


アプリケーションProjects - Mainについても上記と同様の作業を行ない、ナビゲーション・メニューとページ・ナビゲーションを、ライブラリ・アプリケーションProjectsからサブスクライブします。

ページの遷移にまつわる設定は以上で完了です。アプリケーションを実行して動作を確認してみます。

アプリケーションProjects - HomeとProjects - Mainのどちらを実行しても、Projects - Homeのログイン・ページが開きます。


ナビゲーション・メニューやホーム・ページのナビゲーションをクリックして、アプリケーション自体も遷移すること、アクセスするアプリケーションが変わっても再認証が求められないことを確認します。



テーマのサブスクリプション



テーマのサブスクリプションの例として、テーマ・スタイルを共有してみます。アプリケーションは何でも構いませんが、壊しても問題ないアプリケーションで作業します。

最初にカスタマイズするテーマを、標準のUniversal Themeのコピーとして作成します。

共有コンポーネントのテーマを開きます。


タスクからテーマのコピーを実行します。


このテーマIDにコピーに1042を指定します。オリジナルのUniversal Themeの参照を維持するため、テーマのサブスクライブはオンにします。

次へ進みます。


テーマのコピーを実行します。


テーマIDが1042で、Universal Themeのコピーが作成されます。

テーマを切り替えます。コピーなので、テーマを切り替えてもアプリケーションの見た目は変わりません。


次のテーマに切替えに1042: Universal Themeを選択し、次へ進みます。


内容は同じテーマなので、互換性の確認のテンプレートからと、テンプレートにの設定は同じになります。

次へ進みます。


テーマの切替えを実行します。


コピーとして作成したテーマUniversal Theme - 1042が、カレントのテーマに切り替わります。


APEXアプリケーションを実行します。

テーマ・ローラーを使用して、既存のテーマ・スタイルをカスタマイズして保存します。


ヘッダーを淡(英語でLight)、ナビゲーションも淡に変更し、新しいテーマ・スタイルとして別名保存します。


新しいスタイル名をIris Lightとし、保存します。


テーマ・スタイルIris Lightが保存されました。


作成されたテーマ・スタイルを確認します。

共有コンポーネントのテーマを開きます。

本来であれば、ここでUniversal Theme - 1042をエクスポートすればよいのですが、エクスポートしたテーマをAPEXアプリケーションにインポートできません。APEX 24.2ではテーマのエクスポート/インポートは動作するので、APEX 26.1に何か問題があるように思われます。


回避策として、追加したテーマ・スタイルのIris Lightを手作業でコピーします。テーマ・スタイルIris Lightの属性値などをメモします。

Universal Theme - 1042を開き、スタイル・セクションからIris Lightを開きます。


設定のパブリック、アクセシビリティのテスト済、ファイルURLやテーマ・ローラー属性の読取り専用、入力パラメータ・ファイルURL、出力CSSファイルURL、テーマ・ローラーJSON構成を、どこかに記録しておきます。

出力CSSファイルURLとして設定されているファイルは、データベースに保存されています。


テーマの編集画面に戻り、ファイル・セクションを開きます。

出力CSSファイルが見つかるので、これをダウンロードします。


以上で、別のアプリケーションにテーマIris Lightを作成するために必要な情報が取得できました。

新規にアプリケーションを作成して、アプリケーション・タイプをテーマに変更します。

空のアプリケーションを作成します。名前はMy Themesとします。


アプリケーションMy Themesが作成されます。デフォルトで作成されるページ、グローバル・ページ、ホーム、ログイン・ページは削除します。


共有コンポーネントのテーマを開きます。

テーマのコピーを実行し、テーマIDが1042のテーマを作成します。テーマをコピーする手順はすでに提示済みなので省略します。


コピーとして作成したテーマUniversal Theme - 1042を開き、テーマ・スタイルとしてIris Lightを追加します。


スタイル・セクションのスタイルの追加をクリックします。


テーマ・スタイルの名前はIris Lightです。先ほど記録した設定値を戻し、テーマ・スタイルを作成します。


テーマ・スタイルとしてIris Lightが作成されます。

現在のテーマ・スタイルをIris Lightに変更したのち、ファイル・セクションに移ります。


ファイルの作成をクリックします。


先ほどダウンロードしたCSSファイルを選択し、作成をクリックします。


アップロードしたファイルが、データベースから参照されるファイルとして保存されます。

参照の値は、テーマ・スタイルIris Lightの出力CSSファイルURLに一致します。


以上で、テーマ・スタイルIris Lightを含むテーマが準備できました。

アプリケーション定義のアプリケーション・タイプを、テーマに変更します。


アプリケーションProjects - HomeとProjects - Mainのテーマ・スタイルをIris Lightに変更します。

共有コンポーネントのテーマを開き、作成をクリックします。


別のテーマからのコピーとしてを選択し、次へ進みます。


アプリケーションに、先ほどアプリケーション・タイプをテーマに変更したアプリケーションを選択します。

次のテーマからコピーにテーマIDが1042の1042. Universal Themeを選択します。

このテーマIDにコピーに1042を指定します。テーマのサブスクライブはオンです。

次へ進みます。


テーマのコピーを実行します。


テーマ・スタイルIris Lightを含むテーマが作成されます。

テーマの切替えを行い、カレント・テーマに変更します。


次のテーマに切替えに1042. Universal Themeを選択します。

次へ進みます。


互換性の確認はそのまま変更せず、次へ進みます。


テーマの切替えを実行します。


カレントのテーマが切り替わります。


アプリケーションProjects - HomeとProjects - Mainで同様の作業を繰り返し、両方のアプリケーションのテーマ・スタイルをIris Lightに切り替えます。

テーマおよびテーマ・スタイル変更後にアプリケーションを実行します。

アプリケーションProjects - Homeのテーマ・スタイルがIris Lightに変わっていることが確認できます。


アプリケーションProjects - Mainについても、テーマ・スタイルがIris Lightに変わっていることが確認できます。


アプリケーション・タイプをテーマにすると、アプリケーションとして実行できなかったり、現状はテーマのインポートでエラーが発生したりするので、テーマ・スタイルなどを頻繁に変更する状況では、アプリケーション・タイプをテーマにせず標準のままでテーマのサブスクライブ元にした方が、開発はしやすいように思います。

以上でアプリケーションの分割と、分割したアプリケーションの共通部分を、それぞれアプリケーション・タイプがライブラリおよびテーマのアプリケーションからサブスクライブするように、アプリケーションを構成することができました。


共有コンポーネントのリフレッシュ



サブスクライブ元のコンポーネントが変更された場合は、サブスクリプション・ステータスがリフレッシュが必要に変わります。

例えば、アプリケーションProjectsのナビゲーション・メニューが変更されると、それをサブスクライブしているアプリケーションProjects - HomeおよびProjects - Mainのナビゲーション・メニューのサブスクリプション・ステータスがリフレッシュが必要に変わります。


リフレッシュが必要な場合、それぞれのコンポーネントのサブスクリプションのセクションに、リフレッシュを実行するボタンが現れます。


リフレッシュを実行すると、サブスクライブ元の変更が反映されます。

逆にいうと、リフレッシュを実行するまでは、サブスクライブ元のコンポーネントが変更されてもアプリケーションには反映されません。


ボイラー・プレート



アプリケーション・タイプがボイラー・プレートのアプリケーションを作成します。

アプリケーションProjects - Homeのコピーを作成します。


アプリケーションの名前はProjects - Boilerplateとします。パブリック・レポートのコピーはオフにします。


アプリケーションのコピーを実行します。


本来は重複するページは削除すべきですが、ボイラープレートからどのようにアプリケーションが作成されるかを確認するため、すべてのページをそのまま残します。


アプリケーション定義より、アプリケーション・タイプをボイラープレートに変更します。


新規にアプリケーションを作成します。

ボイラープレートからのアプリケーション作成を選択します。


ワークスペースに作成されているボイラープレートが一覧されます。

先ほど作成したProjects - Boilerplateを選択します。


アプリケーション名、アプリケーションIDおよび解析対象スキーマなどを設定し、アプリケーションの作成を実行します。


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

このアプリケーションはボイラープレートのコピーなので、アプリケーションの開発に必要な共有コンポーネントやテーマなどが、あらかじめ含まれています。


今回の記事は以上になります。

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

追記:

今回のようにサブスクライブ元となるアプリケーションは、マスター・アプリケーションになります。これらのアプリケーションに含まれるコンポーネントをサブスクライブしているアプリケーションをAPEXlang形式でエクスポートすると、以下のようにアプリケーションIDが参照に含まれます。
list ナビゲーション-メニュー (
    name: ナビゲーション・メニュー
    subscription {
        master: @/109/ナビゲーション-メニュー
    }
環境の違いなどでマスター・アプリケーションのアプリケーションIDが変わる場合、アプリケーションのインポートができません。そのための対応方法が、APEX 26.1のリリース・ノートの以下のセクションに紹介されています。

10.1 Known Issues for Importing APEXlang Applications in App Builder

エクスポートしたファイルに含まれるdeployments/default.jsonに、マスター・アプリケーションへのマッピングを定義して対応します。

完