如何在编辑 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

AFF_CONTACT_ROLE

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 程序员,所以并不是说这是一个万无一失的解决方案,但它应该会让你走上正轨。