问题描述
我在 18.c 数据库上使用 Apex 19.1。 我有一个类型为 Select List (P136_ROLES) 的页面项。页面项有 Allow Multi Selection = YES。 P136_ROLES 项中的数据有时需要更新。当页面项目在编辑模式下显示时,我想先显示选定的项目,然后按字母顺序显示其余的(未选定的)lov。 此页面项涉及两个表:
AFF_ROLE
- PRIM_KEY(此表中行的唯一键)
- ROLE(组织中各种角色的名称
AFF_CONTACT_ROLE
- PRIM_KEY(此表中行的唯一键)
- CONTACT_FKEY(与 AFF_CONTACT 表中 PRIM_KEY 匹配的外键)
- ROLE(AFF_ROLE 表中分配给给定联系人的角色
AFF_CONTACT_ROLE 表通过 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 查询返回冒号分隔值):
Select role From AFF_CONTACT_ROLE Where contact_fkey = :P136_prim_key;
此来源显示已分配给联系人的角色,但乍一看很难确定所选角色。 我也为 Source 尝试了以下方法,但它给出了与上面列出的 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;
在选择列表类型的页面项目中,如何先显示选定的值,然后显示未选定的按字母顺序排序的值? 感谢您查看此内容。
解决方法
这是有效的 - 我只是根据答案之一here一起制作了这个。它使用 jquery 重新排列选择列表中的值,在其他之前对选定的值进行排序。 在页面属性“函数和全局变量声明”中,输入:
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);
});
如果您的选择列表中有一个 NULL 值,则第二个参数参数需要为真,这样就不会与其他选项一起排序。
我是一个非常糟糕的 javascript 程序员,所以不能声称这是一个万无一失的解决方案,但它应该让你走上正轨。