如何在编辑 Oracle Apex "Select List" 页面项目时首先显示所选项目
How to display selected items first when editing an Oracle Apex "Select List" page item
我在 18.c 数据库上使用 Apex 19.1。
我有一个类型为 Select 列表 (P136_ROLES) 的页面项目。页面项目允许多 Selection = YES。 P136_ROLES 项中的数据有时需要更新。当页面项目以编辑模式显示时,我想先显示选定的项目,然后按字母顺序显示其余(未选定的)LOV。
此页面项目涉及两个 table:
AFF_ROLE
- PRIM_KEY(此 table 中行的唯一键)
- ROLE(组织中各种角色的名称
AFF_CONTACT_ROLE
- PRIM_KEY(此 table 中行的唯一键)
- CONTACT_FKEY(外键匹配AFF_CONTACT中的PRIM_KEYtable)
- ROLE(AFF_ROLE table 中分配给给定联系人的角色
AFF_CONTACT_ROLE table 通过 PL/SQL 页面进程更新:
DECLARE
l_selected apex_t_varchar2;
BEGIN
-- Convert the colon separated string of values into a PL/SQL array
l_selected := apex_string.split(p_str => :P136_ROLES, p_sep => ':');
-- Delete all prior role assignments for this contact.
Delete From AFF_CONTACT_ROLE
Where contact_fkey = :P136_PRIM_KEY;
-- Loop over array to insert row(s) containing contact_fkey and role
FOR i IN 1..l_selected.count
LOOP
Insert into AFF_CONTACT_ROLE (contact_fkey, role)
Values (:P136_PRIM_KEY, l_selected(i));
END LOOP;
END;
这是 P136_ROLES 的 LOV:
Select role display, role return From AFF_ROLE;
这是 P136_ROLES 的来源:(SQL 查询 return 冒号分隔值):
Select role From AFF_CONTACT_ROLE Where contact_fkey = :P136_prim_key;
此来源显示已分配给联系人的角色,但所选角色乍一看很难确定。
我还尝试了以下来源,但它给出了与上面列出的 Select 语句类似的结果:
select ar.role
from aff_role ar
right join aff_contact_role acr on acr.role = ar.role
and acr.contact_fkey = :p136_prim_key
order by
ar.role,
acr.role nulls last;
在 Select 列表类型的页面项目中,如何先显示选定的值,然后再显示未选定的按字母顺序排序的值?
感谢您查看此内容。
这行得通 - 我只是根据其中一个答案 here 一起制作了这个。它使用 jquery 重新排列 select 列表中的值,将 selected 的值排在其他值之前。
在页面属性“函数和全局变量声明”中,输入:
function sortSelectOptions(selector, skip_first) {
var options = (skip_first) ? $(selector + ' option:not(:first)') : $(selector + ' option');
var arr = options.map(function(_, o) { return { t: $(o).text(), v: o.value, s: $(o).prop('selected') }; }).get();
arr.sort(function(o1, o2) {
var t1 = o1.s ? o1.t.toLowerCase() : 'zz'+ o1.t.toLowerCase()
, t2 = o2.s ? o2.t.toLowerCase() : 'zz'+ o2.t.toLowerCase();
return t1 > t2 ? 1 : t1 < t2 ? -1 : 0;
});
options.each(function(i, o) {
o.value = arr[i].v;
$(o).text(arr[i].t);
if (arr[i].s) {
$(o).attr('selected', 'selected').prop('selected', true);
} else {
$(o).removeAttr('selected');
$(o).prop('selected', false);
}
});
}
在“页面加载时执行”中,输入:
jQuery(document).ready(function($) {
sortSelectOptions('#P136_ROLES', true);
});
如果您的 select 列表中有 NULL 值,则第二个参数参数需要为真,这样就不会与其他选项一起排序。
我是一个非常糟糕的 javascript 程序员,所以并不是说这是一个万无一失的解决方案,但它应该会让你走上正轨。
我在 18.c 数据库上使用 Apex 19.1。 我有一个类型为 Select 列表 (P136_ROLES) 的页面项目。页面项目允许多 Selection = YES。 P136_ROLES 项中的数据有时需要更新。当页面项目以编辑模式显示时,我想先显示选定的项目,然后按字母顺序显示其余(未选定的)LOV。 此页面项目涉及两个 table:
AFF_ROLE
- PRIM_KEY(此 table 中行的唯一键)
- ROLE(组织中各种角色的名称
AFF_CONTACT_ROLE
- PRIM_KEY(此 table 中行的唯一键)
- CONTACT_FKEY(外键匹配AFF_CONTACT中的PRIM_KEYtable)
- ROLE(AFF_ROLE table 中分配给给定联系人的角色
AFF_CONTACT_ROLE table 通过 PL/SQL 页面进程更新:
DECLARE
l_selected apex_t_varchar2;
BEGIN
-- Convert the colon separated string of values into a PL/SQL array
l_selected := apex_string.split(p_str => :P136_ROLES, p_sep => ':');
-- Delete all prior role assignments for this contact.
Delete From AFF_CONTACT_ROLE
Where contact_fkey = :P136_PRIM_KEY;
-- Loop over array to insert row(s) containing contact_fkey and role
FOR i IN 1..l_selected.count
LOOP
Insert into AFF_CONTACT_ROLE (contact_fkey, role)
Values (:P136_PRIM_KEY, l_selected(i));
END LOOP;
END;
这是 P136_ROLES 的 LOV:
Select role display, role return From AFF_ROLE;
这是 P136_ROLES 的来源:(SQL 查询 return 冒号分隔值):
Select role From AFF_CONTACT_ROLE Where contact_fkey = :P136_prim_key;
此来源显示已分配给联系人的角色,但所选角色乍一看很难确定。 我还尝试了以下来源,但它给出了与上面列出的 Select 语句类似的结果:
select ar.role
from aff_role ar
right join aff_contact_role acr on acr.role = ar.role
and acr.contact_fkey = :p136_prim_key
order by
ar.role,
acr.role nulls last;
在 Select 列表类型的页面项目中,如何先显示选定的值,然后再显示未选定的按字母顺序排序的值? 感谢您查看此内容。
这行得通 - 我只是根据其中一个答案 here 一起制作了这个。它使用 jquery 重新排列 select 列表中的值,将 selected 的值排在其他值之前。 在页面属性“函数和全局变量声明”中,输入:
function sortSelectOptions(selector, skip_first) {
var options = (skip_first) ? $(selector + ' option:not(:first)') : $(selector + ' option');
var arr = options.map(function(_, o) { return { t: $(o).text(), v: o.value, s: $(o).prop('selected') }; }).get();
arr.sort(function(o1, o2) {
var t1 = o1.s ? o1.t.toLowerCase() : 'zz'+ o1.t.toLowerCase()
, t2 = o2.s ? o2.t.toLowerCase() : 'zz'+ o2.t.toLowerCase();
return t1 > t2 ? 1 : t1 < t2 ? -1 : 0;
});
options.each(function(i, o) {
o.value = arr[i].v;
$(o).text(arr[i].t);
if (arr[i].s) {
$(o).attr('selected', 'selected').prop('selected', true);
} else {
$(o).removeAttr('selected');
$(o).prop('selected', false);
}
});
}
在“页面加载时执行”中,输入:
jQuery(document).ready(function($) {
sortSelectOptions('#P136_ROLES', true);
});
如果您的 select 列表中有 NULL 值,则第二个参数参数需要为真,这样就不会与其他选项一起排序。
我是一个非常糟糕的 javascript 程序员,所以并不是说这是一个万无一失的解决方案,但它应该会让你走上正轨。