対話モード・レポートの表示をサインインしたユーザー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スクリプトを保存、レビューおよび実行を続けて行います。
生成されたスクリプトのレビュー画面が表示されます。ここでは実行をクリックします。確認画面が表示されるので、即時実行をクリックします。
アプリケーション作成ウィザードが起動します。
名前をデフォルトのフィルタとし、アプリケーションの作成を実行します。今回使用する表DF_TASKSの対話モード・レポートはウィザードが作成してくれます。
対話モード・レポートのページが含まれるアプリケーションが作成されます。
今回はサインインしたユーザー名をフィルタ条件とするため、確認作業では色々なユーザー名でサインインを行う必要があります。そのため、認証スキームを公開資格証明に変更します。
共有コンポーネントの認証スキームを開きます。
作成をクリックします。
ソースのPL/SQLコードとして以下を設定します。
リージョンIDはビューAPEX_APPLICATION_PAGE_REGIONSを検索して取得します。リージョンIDから対話モード・レポートで直前に実行されたSQLを取得し、バインド変数の使用の有無を確認します。もし、バインド変数が使われていなければ、フィルタ条件が無いと判断して今回のフィルタ条件を追加します。
declare | |
l_report apex_ir.t_report; | |
l_region_id apex_application_page_ir.region_id%type; | |
begin | |
/* | |
* レポートの静的IDからリージョンIDを取得する。 | |
*/ | |
select region_id into l_region_id | |
from apex_application_page_regions | |
where application_id = :APP_ID and page_id = :APP_PAGE_ID | |
and static_id = 'TASKS'; | |
/* | |
* バインド変数の数を確認する。 | |
* ただし、APEX 22.2では、APEX_IR.GET_REPORTは非推奨のAPIとなっている。 | |
* 代わりにAPEX_REGION.OPEN_QUERY_CONTEXTを使用する、とのこと。 | |
*/ | |
l_report := apex_ir.get_report( | |
p_page_id => :APP_PAGE_ID, | |
p_region_id => l_region_id | |
); | |
/* | |
* バインド変数がなければ検索条件が設定されていない。 | |
*/ | |
if l_report.binds.count = 0 then | |
/* デフォルトのフィルタを適用する。 */ | |
apex_ir.add_filter( | |
p_page_id => :APP_PAGE_ID, | |
p_region_id => l_region_id, | |
p_report_column => 'EMAIL', | |
p_filter_value => lower(:APP_USER), | |
p_operator_abbr => 'EQ', | |
p_report_alias => null | |
); | |
end if; | |
end; |
今回作成したアプリケーションのエクスポートを以下に置きました。
ノート:ページ・レンダリング・プロセスでこのプロシージャを使用すると、レポートのダウンロード問題(CSV、HTML、電子メールなど)が発生します。ユーザーがレポートをダウンロードすると、対話モード・レポートでは、REQUEST値のダウンロード形式でページがリロードされます。対話モード・レポートの設定を変更すると(フィルタの追加やレポートのリセットなど)、部分的にページがリフレッシュされます。したがって、ダウンロード・データがユーザーが参照しているレポート・データと一致しないことがあります。このため、ページ送信プロセスでのみこのプロシージャを使用することをお薦めします。