現行の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を使って以下のように置き換えることができます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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_TYPEがPであれば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のソースがレポートのソースだったと仮定すると、検索結果に含まれる列IDやSTATUSは#ID#、#STATUS#として参照することができます。
しかし、ツリー・リージョンの場合はレポートの表示とは異なり、レポートとして参照できる列はありません。そのため、p_valuesに渡す値は、ソースとなるSELECT文で指定する必要があります。
また、P、T、SといったITEM_TYPEの種類によって、ターゲットとなるURLだけではなく、p_valuesの値も変わっています。
Pの場合は、P3_SELECTED_NODEにid、P7_PROJ_IDにidが渡されています。Tの場合は、P3_SELECTED_NODEにid、P9_PROJ_IDにproj_id、P9_TASK_IDにtask_id、Sの場合はP3_SELECTED_NODEにid、P10_PROJ_IDにproj_id、P10_ROWIDにROWIDが渡されています。
このような切り替えは、宣言的なターゲットの設定ではできません。
今回の記事は以上になります。
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完