Oracle apex 在自动完成文本字段中存储2个值:ID和名称

Oracle apex 在自动完成文本字段中存储2个值:ID和名称,oracle-apex,Oracle Apex,目前,我使用弹出LOV显示供应商列表,但我正在尝试将该字段更改为文本字段自动完成。我显示供应商名称,但存储供应商ID。当我尝试更改字段时,APEX表示在LOV查询中选择了错误的列数 是否有在文本字段自动完成中保存两个值的方法?我当前用于弹出LOV的以下查询: SELECT SUPPLIER_NAME KEY, SUPPLIER_ID VALUE FROM SUPPLIERS WHERE ENABLED_FLAG = 'Y' order by SUPPLIER_NAME 自动完成文本项没

目前,我使用弹出LOV显示供应商列表,但我正在尝试将该字段更改为文本字段自动完成。我显示供应商名称,但存储供应商ID。当我尝试更改字段时,APEX表示在LOV查询中选择了错误的列数

是否有在文本字段自动完成中保存两个值的方法?我当前用于弹出LOV的以下查询:

 SELECT SUPPLIER_NAME KEY, SUPPLIER_ID VALUE
 FROM SUPPLIERS
 WHERE ENABLED_FLAG = 'Y'
 order by SUPPLIER_NAME

自动完成文本项没有单独的显示值和返回值,它只有一个值,因此关联的LOV只能有一个值。

当标准选项没有剪切它时,您可以始终滚动自己的LOV

基本jquery自动完成项(ex)
(这是相当基本的,但它向您展示了基本知识)

  • HTML标题

    <script src="#IMAGE_PREFIX#libraries/jquery-ui/1.8.14/ui/minified/jquery.ui.autocomplete.min.js" type="text/javascript"></script>
    <link rel="stylesheet" href="#IMAGE_PREFIX#libraries/jquery-ui/1.8.14/themes/base/jquery.ui.autocomplete.css" type="text/css" />
    
  • AJAX回调过程

    DECLARE
       v_json CLOB;
    BEGIN
       FOR rec IN (SELECT '{' || '"value":"' ||e.EMPNO ||'",'||
                                 '"label":"' ||e.ENAME ||'"' -- last entry
                              || '}' obj
                     FROM EMP e
                    WHERE UPPER(e.ENAME) like UPPER(apex_application.g_x01)||'%'
       ) LOOP
          v_json := v_json ||','|| rec.obj;
       END LOOP;
    
       v_json := '[' || LTRIM(v_json, ',') || ']';
       htp.p(v_json);
    END;
    
  • ->jQuery UI文档:


    或研究使用插件。例如,这个:

    首先,单击编辑页面并添加以下CSS:

    <style>ac_key{display:none}</style>
    
    • P99_AC_字段-用于在列表中搜索值的文本字段
    • P99_AC_FIELD_KEY-用于传递所选密钥的隐藏字段
    UPD:
    此外,您还可以将多个值放入分隔列表中,JSON或标记并不重要。在结果事件中,您可以分析它们并一次填写几个(隐藏或正常)字段。

    解决方案需要更少的自定义编码

    创建两个字段。一个用于自动完成名称,另一个用于ID。ID是存储在数据库中的内容

    ID字段

    • 名称:
      字段_1
    • 类型:隐藏
    • 设置;受保护价值:否
    • 来源;类型:数据库列
    • 来源;数据库列:
      SELECTION\u ID
    名称字段

    • 名称:
      字段_2
    • 类型:具有自动完成功能的文本字段
    • 设置:[选择所需内容]
    • 价值清单;类型:SQL查询
    • 价值清单;SQL查询:
      从[LIST\u TABLE]中选择[NAME]
      • 确保查询提供唯一的值;没有重复的
    • 来源;类型:SQL查询(返回单个值)
    • 来源;SQL查询:
      从表单的[LIST\u TABLE]中选择[NAME],其中ID=:FIELD\u 1
    • 来源;SQL查询:
      (从[LIST\u TABLE]中选择[NAME],其中ID=Q.SELECTION\u ID)
      用于数据网格
    动态动作

    • 名称:更新ID字段
    • 何时;事件:自定义
    • 何时;自定义事件:
      结果
    • 何时;选择:项目
    • 何时;项目:
      字段2
    • 正确时的操作
      • 动作:设定值
      • 设置;集合类型:SQL语句
      • 设置;SQL语句:
        从[LIST\u TABLE]中选择[ID],其中[NAME]=FIELD\u 2
      • 受影响因素;选择类型:项目
      • 受影响因素<代码>字段_1
    注释


    对于数据网格,您将无法直接隐藏ID列,您必须在Actions->Columns菜单中取消选择该列。您必须确保名称数据是唯一的。重复将导致从ID检索名称时响应多个值,并将导致错误。

    但确实如此。请看下面我的答案。@NaeelMaqsudov不,它没有。你下面的答案是一个好主意,但是LOV仍然只有一个单一的价值,你只是对这个价值的内容进行了创新。我的答案仍然正确。当然,我的想法不会使你的答案不正确。我只想指出,自动完成文本项自然地不支持单独的显示和返回值。很好,但从说“这是一种克服限制的方法”开始可能是个好主意+无论如何,令人惊讶的是,这不是APEX最初设计的一部分。它在EBS中以类似的形式出现已经很久了。
    <style>ac_key{display:none}</style>
    
    SELECT SUPPLIER_NAME||'<ac_key>'||SUPPLIER_ID||'</ac_key>'
    FROM SUPPLIERS
    WHERE ENABLED_FLAG = 'Y'
    order by SUPPLIER_NAME
    
    $("#P99_AC_FIELD").result(function(event,data,formatted){
      if(data){
        if(ac_key = data.toString().match("<ac_key>(.*)</ac_key>")){
          //console.log(ac_key[1]);
          $("#P99_AC_FIELD_KEY").val(ac_key[1]);
        }
      }
    });