Oracle apex 编辑Oracle Apex“选择列表”页面项目时如何首先显示所选项目

Oracle apex 编辑Oracle Apex“选择列表”页面项目时如何首先显示所选项目,oracle-apex,multi-select,selectlist,Oracle Apex,Multi Select,Selectlist,我正在18.c数据库上使用Apex 19.1。 我有一个页面项,其类型为选择列表P136_角色。页面项具有允许多选=是。P136_角色项中的数据有时需要更新。当页面项目以编辑模式显示时,我希望先显示选定的项目,然后按字母顺序显示其余未选定的LOV。 此页面项涉及两个表: AFF_角色 PRIM_KEY此表中的行的唯一键 角色组织中各种角色的名称 AFF\u联系人\u角色 PRIM_KEY此表中的行的唯一键 CONTACT_FKEY与AFF_CONTACT表中的PRIM_键匹配的外键 角色指定给给

我正在18.c数据库上使用Apex 19.1。 我有一个页面项,其类型为选择列表P136_角色。页面项具有允许多选=是。P136_角色项中的数据有时需要更新。当页面项目以编辑模式显示时,我希望先显示选定的项目,然后按字母顺序显示其余未选定的LOV。 此页面项涉及两个表:

AFF_角色

PRIM_KEY此表中的行的唯一键 角色组织中各种角色的名称 AFF\u联系人\u角色

PRIM_KEY此表中的行的唯一键 CONTACT_FKEY与AFF_CONTACT表中的PRIM_键匹配的外键 角色指定给给定联系人的AFF_角色表中的角色 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_角色的LOV:

Select role display, role return From AFF_ROLE;
以下是P136_角色的源代码:SQL查询返回冒号分隔的值:

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;
在“选择列表”类型的页面项目中,如何首先显示选定的值,然后按字母顺序显示未选定的值?
感谢您的关注。

这很有效-我只是根据其中一个答案一起制作了这个。它使用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);
        }
    }); 
}
如果选择列表中有空值,则第二个参数必须为true,这样就不会与其他选项一起排序


我是一个非常糟糕的javascript程序员,所以我不认为这是一个万无一失的解决方案,但它应该让您走上正确的道路。

Hello Koen。谢谢你的回复。我也不是什么Java程序员。在角色字段或任何LOV中都没有空白。我将第二个参数保留为TRUE,没有引号。结果是:列表首先显示一个未选定的值,然后显示1到N个选定的值。我不知道为什么它仍然首先显示单个未选择的值。有什么想法吗?再次感谢您的帮助。仅当存在空值时才需要skip_first参数。它跳过选择列表的第一个条目,该条目将是空值,类似于选择值。如果您不想这样,请将其设置为false。顺便说一句,这是javascript,不是java;你好,科恩。我让它工作了。问题在于页面加载代码时执行。我回顾了您引用的链接,它包含了整个jQuery调用。因此,页面加载时执行中的以下代码生成了我想要的结果:jQuerydocument.readyfunction${sortSelectOptions'P136_ROLES',false;};当然可以你能用完整的电话更新你的答案吗?奇怪的是,这样对你不起作用-在没有完整电话的情况下对我起作用。。。反正我会更新的
jQuery(document).ready(function($) { 
    sortSelectOptions('#P136_ROLES', true); 
});