以前に、ひとつの表をレポートと編集の対象とした、Oracle APEXのアプリケーションを作成する手順について記事を書いています。単にExcelやCSVをアップロードしてアプリケーションを作成するのではなく、あらかじめスキーマを定義することにより、その定義に対応したユーザー・インターフェースが、Oracle APEXのウィザードによって自動生成されます。結果として、より短い時間でアプリケーションが完成します。
対象をひとつの表としているのは少し単純です。本記事では、いわゆるマスター・ディテール関係の表から、Oracle APEXのアプリケーションを作成してみます。
これから行う作業では、Always FreeのAutonomous DatabaseのAPEX 21.2.6を使います。
データ・ソースとして、CSVのサンプルとして提供されているプロジェクトとタスクを使います。
アプリケーション・ビルダーを開いてアプリケーションの作成を実行し、ファイルからを選択します。
データのロードのダイアログが開きます。
コピー・アンド・ペーストを選択し、サンプル・データ・セットとしてプロジェクトとタスクを選択します。
ロードされるデータは、Project、Task Name、Start Date、End Date、Status、Assigned To、Cost、Budgetです。新規に表をひとつ作成し、このデータをロードします。しかし、本来はProjectを保持するマスター表があり、それに紐づくTaskがディテール表を構成するように、ふたつの表を作成する方がデータの持ち方としては適切に見えます。
本記事では、これからロードするデータをマスター・ディテール関係の表に入れ替えて、Oracle APEXのアプリケーションを作ります。
まずは、その準備作業としてCSVのサンプル・データ・セットをデータベースにロードします。
次へ進みます。
データのロード先として新規表を選択し、表名にPRJ_TEMPを入力します。ここで作成する表は、マスター・ディテール関係の表にデータを入れ替えるソースとして一時的に使用します。
データのロードを実行します。
73行のデータが新規に作成した表PRJ_TEMPにロードされます。この表を使って、
アプリケーションの作成を実行します。マスター・ディテール関係にあるデータを、フラットな表に保存した状態で作成されるアプリケーションを確認します。
アプリケーション作成ウィザードが起動します。
アプリケーションの名前にプロジェクト管理 - フラットと入力し、それ以外は変更せずアプリケーションの作成を実行します。
アプリケーションが作成されます。
スキーマ定義の違いの影響を受けるのは、主にデータを編集する作業です。レポートとフォームのページを実行し、操作を確認します。
レポートのページを表示し、データを編集するフォームを開きます。
フォーム上でProject、Task Name、Status、Assigned Toを任意の値で設定することができます。これは望しい状態ではありません。
クイックSQLのモデルを以下のように定義し、データを入れ替える表を作成します。
# prefix: prj
statuses
status vc20 /nn
members
member_name vc200 /nn
tasks
task_name vc200 /nn
projects
project_name vc200
project_tasks
task_id /fk tasks /nn
start_date
end_date
status /fk statuses
assigned_to /fk members
cost num
budget num
ステータスの定義をPRJ_STATUSES、メンバーの定義(Assigned_Toに割り当てるメンバー)をPRJ_MEMBERS、タスクの定義を保持する表をPRJ_TASKSとし、プロジェクトのマスターをPRJ_PROJECTS、ディテール表をPRJ_PROJECT_TASKSとして、スキーマを定義します。
生成されたDDLが実行されると、5つの表が作成されます。
程度によりますがスキーマ定義に合わせて、元のOracle APEXアプリケーションを修正するのは、手間のかかる上、間違いが発生しやすいです。今回はアプリケーションを新規に作成しますが、すでにアプリケーションが作成されている場合は、新規に作成したページによって、既存のページを置き換えるといった手順が有効でしょう。
これからデータを移行します。アプリケーションの作成は、その後に実施します。
SQLワークショップのSQLスクリプトを開き、以下のスクリプトを実行します。
insert into prj_members(member_name) select distinct assigned_to from prj_temp;
insert into prj_statuses(status) select distinct status from prj_temp;
insert into prj_projects(project_name) select distinct project from prj_temp;
insert into prj_tasks(task_name) select distinct task_name from prj_temp;
insert into prj_project_tasks(project_id, task_id, start_date, end_date, status, assigned_to, cost, budget)
select
(select id from prj_projects pr where pr.project_name = p.project) project_id,
(select id from prj_tasks tk where tk.task_name = p.task_name) task_id,
start_date,
end_date,
(select id from prj_statuses st where st.status = p.status) status,
(select id from prj_members mb where mb.member_name = p.assigned_to) assigned_to,
cost,
budget
from prj_temp p;
commit;
ひとつの表にアップロードされたCSVのデータが、正規化された表に移行されました。
これから本題である、マスター・ディテール関係の表を元にしたOracle APEXアプリケーションを作成します。
アプリケーション作成ウィザードを起動します。
アプリケーションの名前をプロジェクト管理とします。
ページの追加をクリックし、マスター・ディテール関係を元にしたレポートおよび編集フォームのページを追加します。
マスター・ディテールを選択します。
ページの形式として積上げを選択します。積上げを選択すると、マスター表、ディテール表ともに対話グリッドを使った実装になります。ページ名は積上げ、(マスター)表はPRJ_PROJECTS、ディテール表はPRJ_PROJECT_TASKSを指定します。
ページの追加をクリックします。
同様の手順で、形式が左右のページも追加します。
左右では、マスター、ディテールの双方ともクラシック・レポートによって実装されます。編集フォームは別ページのフォームになります。
プライマリ表示列はPROJECT_NAME、セカンダリ表示列にIDを選択します。セカンダリ表示列にIDを選択するのは適切ではありませんが、表PRJ_PROJECTSはIDとPROJECT_NAMEしか列がないため、IDを選択しています。画面に表示することが適切な列が他にある場合は、それをセカンダリ表示列として設定します。
表のメンテナンスを行う画面を追加します。
ページの追加をクリックします。
追加ページを開き、複数のレポートを選択します。
今回のアプリケーションに関連する表をすべて選択します。表の接頭辞としてPRJ_が付加されている表をすべて選択し、ページの追加をクリックします。
追加されたフォーム付き対話モード・レポートのページは、編集を開いて管理ページに変更します。機能のアクセス制御にチェックを入れ、これらのページはエンド・ユーザーではなく、管理者向けのページからアクセスできるようにします。
これらの変更を行なった後、アプリケーションの作成を実行します。
アプリケーションが作成されます。
これから作成されたアプリケーションの、ユーザー・インターフェースを調整します。
積上げ形式のマスター・ディテールのレポート/編集ページを開きます。
ディテール表の対話グリッドにて、Task、Status、Assigned ToにIDが表示されています。これを選択リストに変更します。
ページ・デザイナを起動し、列TASK_IDの識別のタイプを選択リストに変更します。LOVのタイプとして共有コンポーネントを選択し、LOVにPRJ_TASKS.TASK_NAMEを選択します。追加値の表示はOFFにします。
同様に列STATUSもタイプを選択リストに変更し、LOVとしてPRJ_STATUSES.STATUSを選択します。列ASSIGNED_TOも選択リストに変更し、LOVはPRJ_MEMBERS.MEMBER_NAMEを選択します。
列のタイプを選択リストに変更しても、データ・ソースである表から取り出される/保存される列のデータはIDのまま変更されません。あくまでユーザー・インターフェースでの変更になります。
今回の作業では、アプリケーションを作成した際に、共有コンポーネントのLOVがいくつか自動的に作成されています。
これは、生成するページに表PRJ_PROJECT_TASKSの対話モード・レポートを含んでいるためです。アプリケーション作成ウィザードのページに、外部キー制約を含む表の対話モード・レポートのページが追加されていると、外部キー制約を元に共有コンポーネントのLOVが作成されます。
形式が左右のマスター・ディテールのページを確認します。
Task、Status、Assigned ToがIDで表示されているので、これらをLOVに基づく表示に変更します。
ページ・デザイナを開き、列TASK_IDのタイプをプレーン・テキスト(LOVに基づく)に変更します。LOVのタイプは共有コンポーネント、LOVとしてPRJ_TASKS.TASK_NAMEを選択します。
同様に、列STATUSはLOVとしてPRJ_STATUSES.STATUS、列ASSIGNED_TOはPRJ_MEMBERS.MEMBER_NAMEに基づいた表示になるように変更します。
以上で、IDによる表示が名前に置き換えられます。
編集フォームは、共有コンポーネントのLOVを使用するようになっているため、変更は不要です。
マスター・ディテール関係の表を扱うOracle APEXアプリを、ウィザードを使って作成する手順の解説は以上になります。
マスター・ディテールのサンプルは、Oracle APEXのギャラリーのサンプルに含まれています。
公式のサンプルは、もっと凝った実装になっています。
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完