幸運なことに作成したOracle APEXのアプリケーションを使う人が増え、色々機能を追加していくと、次第にページが増えていきます。ある程度ページが増えてくると、アプリケーションを更新するのが辛くなります。
基本的にOracle APEXアプリケーションのデプロイメントの単位はアプリケーションなので、それに大量のページが含まれていると、その内の1ページだけの変更であっても、エスクポートは全ページで、インポートも全ページの置き換えになります。また、変更が1ページであっても、それに伴って共有コンポーネントも変更しているかもしれませんし、改変したアプリケーションと現行のアプリケーションとの差分を、稼働しているアプリケーションに適用する、というのも難しい作業です。置き換える単位がアプリケーションであれば、テストの単位もアプリケーションとなるのが通常でしょう。
本記事では、上記のような難しさを軽減するために、比較的容易に採用できる方法について紹介します。項目は以下になります。
- 例題アプリケーションの作成
- アプリケーションの分割
- セッションの共有
- ホーム・ページ、ログイン・ページの共有
- ナビゲーションの更新
- 共有コンポーネントのサブスクリプション
- 別名の付け替えと可用性の設定
- その他の利用可能な機能
最初に例題となるアプリケーションを作成し、そのアプリケーションに対して、ここでリストした作業を実施していきます。
例題アプリケーションの作成
SQLワークショップのサンプル・データセットより、プロジェクト・データをインストールし、それを元にアプリケーションを作成します。
SQLワークショップのユーティリティに含まれるサンプル・データセットを開きます。
プロジェクト・データのインストールをクリックします。
データセットの説明が表示されます。次へ進みます。
インストールされるデータセットがリストされます。確認してデータセットのインストールを実行します。
ロード結果が表示されます。そこからアプリケーションの作成を起動します。
言語を日本語(ja)に変更し、それ以外はそのままにしてアプリケーションの作成を行います。
以上で例題にするアプリケーションが完成しました。
アプリケーションの分割
作成されたアプリケーションを以下に示すように、アプリケーションの別名dm-projects-001と別名dm-projects-002の、2つのアプリケーションに分割します。
Home, Dashboard, Statuses, Project Statusはdm-projects-001、Projects, Milestones, Tasks Project Task, Task Calendarはdm-projects-002、それ以外のページは双方のアプリケーションに残します。
作成されているアプリケーションをコピーします。タスクからこのアプリケーションのコピーを実行します。
新規アプリケーション名はDemonstration - Projects - Homeとします。サポートするオブジェクトの定義のコピーは不要なので、OFFです。次へ進みます。
確認画面からアプリケーションのコピーを実行します。
これで同一のアプリケーションが、ワークスペースに2つ存在することになります。最初にアプリケーションDemonstration - Projects - Homeをアプリケーション・ビルダーで開き、別名をdm-projects-001と設定します。これからの説明は、簡易URLはONとOFFのどちらでも有効ですが、簡易URLがサポートされているバージョンであればONにするべきでしょう。設定ののち、変更の適用をクリックします。
このアプリケーションから、ページ3, 4, 5, 6, 7を削除します。ページ・デザイナにて、ひとつひとつページを開いて、削除していきます。
カスケード削除の確認を要求された場合は、いいえ - 対応するリスト・エントリを削除しないを選びます。そしてページを完全に削除を実行します。
アプリケーションdm-projects-001よりページを削除したら、次にアプリケーションDemonstration - Projectsを開き、別名をdm-projects-002として設定し、こちらからはページ1, 2, 8, 9を削除します。
以上でアプリケーションの分割は完了です。次から、分割したアプリケーションを一体で動作するように設定を行なっていきます。
セッションの共有
それぞれのアプリケーションをアプリケーション・ビルダーで開き、共有コンポーネントの認証スキームを開きます。
カレントの認証スキームを開き、セッション共有の設定を変更します。Cookie名は任意の値(ここではORA_WWV_APP_CUSTOM_PROJECTSとしています)ですが、それ以外はOracle APEXをホストしているサーバーの環境によって決まる値ですので、ご自身の環境に合った値を設定してください。
- タイプ: カスタム
- Cookie名: ORA_WWV_APP_CUSTOM_PROJECTS
- Cookieパス: /pls/apex/
- Cookieドメイン: apex.oracle.com
- セキュア: ON
分割したアプリケーションの両方に同じ設定を行うことで、クッキーに設定されるセッション識別子をアプリケーションで共有します。
ホーム・ページ、ログイン・ページの共有
今回はDemonstration - Projects - Home(別名dm-projects-001)のアプリケーションにホーム・ページを残しているため、別名dm-projects-002のアプリケーションは、ホーム・ページとログイン・ページとしてdm-projects-001のものを使うようにします。
dm-projects-002のアプリケーションのアプリケーション定義のユーザー・インターフェースを開き、属性のホームURLとログインURLを変更します。
- ホームURL: f?p=dm-projects-001:home:&SESSION.
- ログインURL: f?p=dm-projects-001:LOGIN:&APP_SESSION.::&DEBUG.:::
&APP_ID.置換文字列は自分自身のアプリケーションIDを意味するので、これを分割したアプリケーションであるdm-projects-001へ置き換えます。また、ホームURLのページが1として数値で設定されていたので、別名のhomeに置き換えています。アプリケーションIDやページIDとして指定する部分には、できるだけ数値は使わない方がアプリケーションのメンテナンスが容易になります。
こちらについては、アプリケーションdm-projects-002だけの変更になります。アプリケーションに認証が必要なアクセスがあった場合、および、ホームページに移動する場合は、アプリケーションdm-projects-001へ遷移するようになります。
ナビゲーションの更新
ページ1, 2はアプリケーションdm-projects-001、ページ3, 4, 5, 6, 7はアプリケーションdm-projects-002をアクセスするよう、ナビゲーション・メニューを更新します。
共有コンポーネントのリストを開きます。この中のデクストップ・ナビゲーション・メニューとページ・ナビゲーションを変更します。
他にも変更すべきリストがあるのですが、今回の例題の確認には影響がないため、そのままにします。
デスクトップ・ナビゲーション・メニューを開いて、グリッド編集をクリックします。
- Home: f?p=&APP_ID.:home:&APP_SESSION.::&DEBUG.:
- Dashboard: f?p=&APP_ID.:dashboard:&APP_SESSION.::&DEBUG.:
- Projects: f?p=dm-projects-002:projects:&APP_SESSION.::&DEBUG.:
- Milestones: f?p=dm-projects-002:milestones:&APP_SESSION.::&DEBUG.:
- Tasks: f?p=dm-projects-002:tasks:&APP_SESSION.::&DEBUG.:
- Tasks Calendar: f?p=dm-projects-002:tasks-calendar:&APP_SESSION.::&DEBUG.:
- Home: f?p=dm-projects-001:home:&APP_SESSION.::&DEBUG.:
- Dashboard: f?p=dm-projects-001:dashboard:&APP_SESSION.::&DEBUG.:
- Projects: f?p=&APP_ID.:projects:&APP_SESSION.::&DEBUG.:
- Milestones: f?p=&APP_ID.:milestones:&APP_SESSION.::&DEBUG.:
- Tasks: f?p=&APP_ID.:tasks:&APP_SESSION.::&DEBUG.:
- Tasks Calendar: f?p=&APP_ID.:tasks-calendar:&APP_SESSION.::&DEBUG.:
ページ・ナビゲーションも同様に変更します。ページ・ナビゲーションはホーム・ページでのみ使用されるので、dm-projects-001だけ変更します。
以下のターゲットを変更します。
- Dashboard: f?p=&APP_ID.:dashboard:&APP_SESSION.::&DEBUG.:
- Projects: f?p=dm-projects-002:projects:&APP_SESSION.::&DEBUG.:
- Milestones: f?p=dm-projects-002:milestones:&APP_SESSION.::&DEBUG.:
- Tasks: f?p=dm-projects-002:tasks:&APP_SESSION.::&DEBUG.:
- Tasks Calendar: f?p=dm-projects-002:tasks-calendar:&APP_SESSION.::&DEBUG.: