2023年2月20日月曜日

チャートとレポートを連携させる(3) - APIの使用

 APIを使用することにより、対話グリッドのフィルタ条件を設定します。使用するAPIはAPEX_IG.ADD_FILTERです。

チャートをクリックして、同時に複数の対話グリッドにフィルタ条件を設定します。

一番最初の記事で作成したAPEXアプリケーションを元に、サンプルの実装を進めます。

同じページに複数の対話グリッドを配置するため、識別できるように静的IDを設定します。

対話グリッドの詳細静的IDとしてCOUNTRIES1を指定します。

作成済みの対話グリッドを重複させます。

レイアウト新規行の開始OFFにし、対話グリッドが横に並ぶようにします。詳細静的IDとしてCOUNTRIES2を設定します。


フィルタ条件の設定だけであれば、リンクアイテムの設定を追加することで対応できます。

以下のように対話グリッドの静的IDを含め、双方にとして&REGION_NAME.を指定します。

IG[COUNTRIES1]_REGION_NAME
IG[COUNTRIES2]_REGION_NAME


ただし、複数の対話グリッドを対象にフィルタ条件を指定した場合、保存済みレポートの指定はできません。


これからAPIによる実装を行います。

チャート上でクリックした地域名を保持するページ・アイテムを作成します。

識別名前P1_REGIONとします。タイプ非表示とします。JavaScriptで値を設定するため、設定保護された値OFFにします。対話グリッドに表示されている値にフィルタをかけるため、このページ・アイテムに保存する値は列REGION_IDではなく列REGION_NAMEの値です。

シリーズ人口リンクタイプURLにリダイレクトに変更し、ターゲットURLとして以下を記述します。選択リストと異なり、表示値は不要なのでnullを指定します。

javascript:apex.item("P1_REGION").setValue("&REGION_NAME.", null, false);


ページ・アイテムP1_REGIONに動的アクションを作成します。

作成した動的アクションの識別名前地域の変更とします。タイミングはデフォルトでイベント変更選択タイプアイテムアイテムP1_REGIONになります。


TRUEアクションとしてサーバー側のコードを実行を選択し、設定PL/SQLコードとして以下を記述します。APIを呼び出し、それぞれの対話グリッドにフィルタを設定しています。

declare
l_region_id number;
begin
/* 対話グリッドCOUNTRIES1へのフィルタ設定 */
-- レポート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 = 'COUNTRIES1';
-- レポート設定をクリアする。
apex_ig.clear_report(
p_page_id => :APP_PAGE_ID
,p_region_id => l_region_id
,p_report_name => 'RequiredColumnsOnly'
);
-- デフォルトのフィルタを適用する。
apex_ig.add_filter(
p_page_id => :APP_PAGE_ID
,p_region_id => l_region_id
,p_filter_value => :P1_REGION
,p_column_name => 'REGION_NAME'
,p_operator_abbr => 'EQ'
,p_report_name => 'RequiredColumnsOnly'
);
/* 対話グリッドCOUNTRIES2へのフィルタ設定 */
-- レポート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 = 'COUNTRIES2';
-- レポート設定をクリアする。2番目の対話グリッドは代替レポートを指定しない。
apex_ig.clear_report(
p_page_id => :APP_PAGE_ID
,p_region_id => l_region_id
,p_report_id => null
);
-- デフォルトのフィルタを適用する。
apex_ig.add_filter(
p_page_id => :APP_PAGE_ID
,p_region_id => l_region_id
,p_filter_value => :P1_REGION
,p_column_name => 'REGION_NAME'
,p_operator_abbr => 'EQ'
,p_report_id => null
);
end;

送信するアイテムとしてP1_REGIONを指定します。


新規にTRUEアクションを作成し、アクションとしてページの送信を選択します。

対話グリッドに設定したフィルタを反映するためには、ページを再送信する必要があります


以上でアプリケーションは完成です。アプリケーションを実行すると、先頭のGIF動画のように動作します。

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

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