2024年5月30日木曜日

サンプル・アプリSample Treesのapex_util.prepare_urlをapex_page.get_urlに置き換える

ツリー・リージョンの実装サンプルとしてSample Treesが提供されています。このアプリケーションのツリー・リージョンですが、ソースとなるSELECT文にapex_util.prepare_urlが含まれています。

現行のAPEXでは、APEX_UTIL.PREPARE_URLの使用は推奨されていません。代わりにAPEX_PAGE.GET_URLを使うように案内されています。


APEX_UTIL.PREPARE_URLは引数としてURLを受け取り、それにチェックサムを加えます。一般にAPEX_UTIL.PREPARE_URLには、f?p URL構文によるURLを与えます。

Oracle APEX App Builder User's Guide

APEX_PAGE.GET_URLの呼び出しでは、アプリケーションID、ページ番号、URLに含めるアイテム名、その値などを、それぞれ引数として指定します。そのため、URL構文について考える必要はありません。

Sample Treesのツリー・リージョンのソースは、APEX_PAGE.GET_URLを使って以下のように置き換えることができます。

select case when connect_by_isleaf = 1 then 0
when level = 1 then 1
else -1
end as status,
level,
label||': '||name as title,
case when item_type = 'P' then 'fa-file-text-o'
when item_type = 'S' then 'fa-caret-square-o-right'
when item_type = 'T' then 'fa-minus-square-o'
else null
end as icon,
id as value,
case when tooltip is not null then name||' - '||tooltip||'% complete'
else name
end as tooltip,
/*
* apex_util.prepare_urlをapex_page.get_urlに置き換えます。
*/
case when item_type = 'P' then
apex_page.get_url(
p_page => 'create-edit-project'
,p_request => 'T'
,p_items => 'P3_SELECTED_NODE,P7_PROJ_ID'
,p_values => id||','||id
)
-- apex_util.prepare_url('f?p='||:app_id||':7:'||:app_session||':T:::P3_SELECTED_NODE,P7_PROJ_ID:'||id||','||id)
when item_type = 'T' then
apex_page.get_url(
p_page => 'create-edit-tasks'
,p_request => 'T'
,p_items => 'P3_SELECTED_NODE,P9_PROJ_ID,P9_TASK_ID'
,p_values => id||','||link
)
-- apex_util.prepare_url('f?p='||:app_id||':9:'||:app_session||':T:::P3_SELECTED_NODE,P9_PROJ_ID,P9_TASK_ID:'||id||','||link)
when item_type = 'S' then
apex_page.get_url(
p_page => 'modify-subtask-information'
,p_request => 'T'
,p_items => 'P3_SELECTED_NODE,P10_PROJ_ID,P10_ROWID'
,p_values => id||','||link
)
-- apex_util.prepare_url('f?p='||:app_id||':10:'||:app_session||':T:::P3_SELECTED_NODE,P10_PROJ_ID,P10_ROWID:'||id||','||link)
end as link
from (
select 'P' item_type,
t.label label,
to_char(a.PROJ_ID) id,
null parent,
a.project_name name,
a.status tooltip,
null link
from eba_demo_tree_projects a, (select wwv_flow_lang.system_message('PROJECT') label from dual) t
union all
select 'T' item_type,
u.label label,
to_char(b.proj_id)||'-'||to_char(b.task_id) id,
to_char(b.proj_id) parent,
b.task_name name,
null tooltip,
b.proj_id||','||b.task_id link
from eba_demo_tree_task b, (select wwv_flow_lang.system_message('TASK') label from dual) u
union all
select 'S' item_type,
v.label label,
to_char(c.proj_id)||'-'||to_char(c.task_id)||'-'||to_char(c.sub_id) id,
to_char(c.proj_id)||'-'||to_char(c.task_id) parent,
c.sub_name name,
null tooltip,
c.proj_id||','||c.rowid link
from eba_demo_tree_subtask c, (select wwv_flow_lang.system_message('SUBTASK') label from dual) v
)
start with parent is null
connect by prior id = parent
order siblings by name
Sample Treesでは、ノードのタイプに依存して開く編集フォームを切り替えるために、ソースのSELECT文でAPEX_PAGE.GET_URLを呼び出しています。

ITEM_TYPEPであればcreate-edit-projectのフォーム、Tであればcreate-edit-tasksのフォーム、Sであればmodify-subtask-informationに遷移します。

一般的にAPEX_PAGE.GET_URLの引数と、ターゲットをクリックすると開くリンク・ビルダーの設定項目は1対1で対応しています。

ツリー・リージョンの場合、属性設定リンクでノードをクリックしたときに遷移する宛先を設定できます。


リンク・ビルダーの設定項目は、APEX_PAGE.GET_URLの引数に以下のように対応します。アンカーは、APEX_PAGE.GET_URLに対応する引数はありません(コードからは、生成されたURLに文字列としてアンカーを追加できるため)。


対話モード・レポートなどのレポートの場合、アイテム(引数p_valuesに与える)にレポートの列の値を割り当てることができます。Sample Treesのソースがレポートのソースだったと仮定すると、検索結果に含まれる列IDSTATUS#ID##STATUS#として参照することができます。

しかし、ツリー・リージョンの場合はレポートの表示とは異なり、レポートとして参照できる列はありません。そのため、p_valuesに渡す値は、ソースとなるSELECT文で指定する必要があります。

また、P、T、SといったITEM_TYPEの種類によって、ターゲットとなるURLだけではなく、p_valuesの値も変わっています。

Pの場合は、P3_SELECTED_NODEidP7_PROJ_IDidが渡されています。Tの場合は、P3_SELECTED_NODEidP9_PROJ_IDproj_idP9_TASK_IDtask_idSの場合はP3_SELECTED_NODEidP10_PROJ_IDproj_idP10_ROWIDROWIDが渡されています。

このような切り替えは、宣言的なターゲットの設定ではできません。

今回の記事は以上になります。

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