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

问题描述

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...