Oracle APEXのPL/SQL APIとして提供されているファンクションAPEX_REGION.OPEN_QUERY_CONTEXTの引数にp_outer_sqlがあります。これを使用して、以下の機能を実装します。
- サンプル・データセットに含まれる表EMPを準備する。
- 表EMPのファセット検索ページを作成する。
- ファセットを使って表EMPの検索(従業員の絞り込み)を行う。
- 検索結果の列SALおよびCOMMの合計、平均、最小値、最大値、件数を別のレポートに表示する。
- 合計値などは、ファセットを変更する度に更新する。
作成したアプリケーションは、以下のように動作します。
以下より、実装手順を紹介します。
実装にはAlways FreeのAutonomous Databaseを使用します。
サンプル・データセットのEMP/DEPTのインストール
SQLワークショップのユーティリティに含まれるサンプル・データセットを開き、EMP/DEPTをインストールします。
すでにインストール済みの場合は、ボタンが更新になっています。その場合は、表EMPおよびDEPTが作成済みなので、追加の作業は不要です。
表EMPやDEPTを変更している場合(列をドロップしている等)は、更新を開いてインストール済みのデータセットを削除し、再度インストールし直す必要があります。データのみ変更している場合(例えば表EMPの行をすべて削除している等)は、リフレッシュするといった準備が必要になります。
アプリケーションの作成
アプリケーションを作成します。
アプリケーション・ビルダーを開き作成を実行して、アプリケーション作成ウィザードを起動します。
名前はファセット検索サマリーとします。ホーム・ページの編集をクリックして、このページを削除します。
削除をクリックします。
ページの追加をクリックし、ファセット検索のページを追加します。
ファセット検索を選択します。
ページ名は従業員検索とします。表示形式はレポートとし、ソースとなる表にEMPを選択します。編集は行わないため、フォームを含めるはチェックしません。
ページの追加をクリックします。
以上でアプリケーションの作成を実行します。
アプリケーションが作成されます。
今回の機能はページ1の従業員検索のページに実装します。
集計をレポートするパイプライン表関数の作成
ファセット検索の結果に集計関数を適用するパイプライン表関数emp_summaryを作成します。
以下のコードを実行します。
SQLワークショップのSQLスクリプトを開きます。
作成を実行します。
コードを貼り付け、適当なスクリププト名を入力して実行をクリックします。
即時実行をクリックします。
エラーなく処理が完了したら、パイプライン表関数emp_summaryの作成は完了です。
集計結果レポートの追加
従業員検索のページに、集計結果を表示するレポートを追加します。
集計のソースとなるパイプライン表関数emp_summaryは、検索結果を表示するリージョンの静的IDを引数とします。検索結果を表示するリージョンはEmployeesなので、これの詳細の静的IDとしてemployeesを設定します。
集計結果を表示するリージョンを、クラシック・レポートとして作成します。
すでにあるレポートと表示形式を合わせるため、リージョンEmployeesを重複させます。リージョンEmployees上でコンテキスト・メニューを表示させ、重複を実行します。
重複として作成されたリージョンの識別のタイトルを集計結果に変更します。ソースのタイプをSQL問合せとし、SQL問合せとして以下を記述します。
select * from emp_summary(
:APP_ID,
:APP_PAGE_ID,
'employees'
)
集計結果が、検索結果のレポートが表示された後にリフレッシュされるように、動的アクションを作成します。
リージョンEmployees上でコンテキスト・メニューを表示させ、動的アクションの作成を実行します。
作成した動的アクションの
識別の
名前は
集計結果のリフレッシュとします。
タイミングはデフォルトで、
イベントは
リフレッシュ後、
選択タイプは
リージョン、
リージョンとして
Employeesが選択されます。
動的アクションとして実行されるTRUEアクションの、識別のアクションとしてリフレッシュを選択します。影響を受ける要素の選択タイプはリージョン、リージョンとして検索結果を選択します。
以上でアプリケーションは完成です。アプリケーションを実行すると、記事の先頭のGIF動画の動作をします。
レポートなどのソースにRESTソースを指定したときに、ローカル後処理としてSQL問合せを書けることは知っていたのですが、APEX_REGION.OPEN_QUERY_CONTEXTの引数として指定できることを最近知りました。それで、使い方を確認するためにアプリケーションを作成してみました。
今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/emp-summary-with-facet.sql
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完