2021年3月22日月曜日

対話モード・レポートにデフォルトでフィルタを設定する

 対話モード・レポートの表示をサインインしたユーザーIDで絞り込むようにできないか、との相談がありました。

ユーザーIDでなく固定のフィルタであれば、デフォルトのレポートとしてフィルタを保存することができます。また、必ず絞り込みを行うのであれば、最初から対話モード・レポートのSQL自体に検索条件として含めることもできます。

両方ともに要件に合わなかったため、PL/SQLのAPI、APEX_IR.ADD_FILTERを呼び出すことでフィルタを設定してみました。その作業ログです。

最初にクイックSQLでモデルを定義して、表DF_TASKSを作成します。

# prefix: df
# semantics: default
# language: ja
tasks /insert 10
    name vc255
    email

SQLの生成SQLスクリプトを保存レビューおよび実行を続けて行います。

生成されたスクリプトのレビュー画面が表示されます。ここでは実行をクリックします。確認画面が表示されるので、即時実行をクリックします。


SQLの実行がすべて成功していることを確認し、アプリケーションの作成をクリックします。確認画面が表示されるので、再度アプリケーションの作成をクリックします。

アプリケーション作成ウィザードが起動します。

名前デフォルトのフィルタとし、アプリケーションの作成を実行します。今回使用する表DF_TASKSの対話モード・レポートはウィザードが作成してくれます。

対話モード・レポートのページが含まれるアプリケーションが作成されます。

今回はサインインしたユーザー名をフィルタ条件とするため、確認作業では色々なユーザー名でサインインを行う必要があります。そのため、認証スキームを公開資格証明に変更します。

共有コンポーネント認証スキームを開きます。

作成をクリックします。


スキームの作成としてギャラリからの事前構成済スキームに基づくを選択し、に進みます。


名前は任意ですが、今回はユーザー名のみとしました。スキーム・タイプ公開資格証明を選択し、認証スキームの作成をクリックします。


スキーム・タイプ公開資格証明認証スキームが作成され、カレントに切り替わります。


続いて今回の本題である、フィルタの設定を行います。

ページ・デザイナで、対話モード・レポートが含まれるページを開きます。

対話モード・レポートのリージョンを選択し、詳細静的IDとしてTASKSを設定します。PL/SQLのコードで対話モード・レポートのリージョンを特定するために使用します。


ヘッダーの前にプロセスを作成します。名前ユーザー名でフィルタとします。

ソースPL/SQLコードとして以下を設定します。

リージョンIDはビューAPEX_APPLICATION_PAGE_REGIONSを検索して取得します。リージョンIDから対話モード・レポートで直前に実行されたSQLを取得し、バインド変数の使用の有無を確認します。もし、バインド変数が使われていなければ、フィルタ条件が無いと判断して今回のフィルタ条件を追加します。


以上で完了です。アプリケーションを実行して動作を確認すると、 最初のGIF動画のような動作になります。

APIリファレンスのAPEX_IR.ADD_FILTERに以下のノートが記載されています。レンダリング・プロセスでのAPEX_IR.ADD_FILTERの使用は推奨されていません。レポートを印刷する場合は、注意が必要です。

ノート:ページ・レンダリング・プロセスでこのプロシージャを使用すると、レポートのダウンロード問題(CSV、HTML、電子メールなど)が発生します。ユーザーがレポートをダウンロードすると、対話モード・レポートでは、REQUEST値のダウンロード形式でページがリロードされます。対話モード・レポートの設定を変更すると(フィルタの追加やレポートのリセットなど)、部分的にページがリフレッシュされます。したがって、ダウンロード・データがユーザーが参照しているレポート・データと一致しないことがあります。このため、ページ送信プロセスでのみこのプロシージャを使用することをお薦めします。

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

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