在自动填充文本字段中存储2个值:ID和名称

问题描述 投票:3回答:4

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

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

 SELECT SUPPLIER_NAME KEY, SUPPLIER_ID VALUE
 FROM SUPPLIERS
 WHERE ENABLED_FLAG = 'Y'
 order by SUPPLIER_NAME
oracle-apex
4个回答
2
投票

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


1
投票

当标准选项没有削减它时,您可以随时自行滚动

基本jquery自动完成项目(ex http://apex.oracle.com/pls/apex/f?p=54687:26) (这是相当简陋的,但它向您展示了基础知识)

  1. 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" />
  2. 2项 P26_EMPNO:将保持VALUE P26_ENAME:持有LABEL
  3. 动态操作,页面加载,真实操作:执行javascript $("#P26_ENAME").autocomplete({ source: function(req, add){ //call the page process get_contact_data and put its return in greturn //this process returns markup for a JSON object so this can easily be parsed in jquery //x01: a temporary variable simply used for passing on a value $.post('wwv_flow.show', {"p_request" : "APPLICATION_PROCESS=GET_EMPLOYEES", "p_flow_id" : $v('pFlowId'), "p_flow_step_id" : $v('pFlowStepId'), "p_instance" : $v('pInstance'), "x01" : req.term }, function(data){ if(data){ add($.parseJSON(data)); }; } ); }, select: function(event, ui){ $("#P26_ENAME").val(ui.item.label); $("#P26_EMPNO").val(ui.item.value); event.preventDefault(); }, delay: 500, minLength: 1, autoFocus: true });
  4. 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 docs:http://jqueryui.com/demos/autocomplete/#remote-jsonp

或者考虑使用插件。例如,这个:http://apex-plugin.com/oracle-apex-plugins/odtug-competition/combobox_208.html


1
投票

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

<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

现在,列表的每一行都包含不可见的KEY值,您可以处理表单字段的result事件,提取不可见的密钥,以及在提交时发送的填充隐藏字段。

再次编辑表单并将一些Javascript添加到页面中,如下所示:

$("#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]);
    }
  }
});
  • P99_AC_FIELD - 用于在列表中搜索值的文本字段
  • P99_AC_FIELD_KEY - 用于传递所选键的隐藏字段

UPD:您也可以将多个值放入分隔列表中,JSON或标记无关紧要。 OnResult事件您可以解析它们并立即填写几个(隐藏或正常)字段。


0
投票

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

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

ID字段

  • 姓名:FIELD_1
  • 类型:隐藏
  • 设置;价值保护:没有
  • 资源;类型:数据库列
  • 资源;数据库专栏:SELECTION_ID

名称字段

  • 姓名:FIELD_2
  • 键入:具有自动完成功能的文本字段
  • 设置:[选择你想要的]
  • 价值清单;键入:SQL查询
  • 价值清单; SQL查询:SELECT [NAME] FROM [LIST_TABLE] 确保查询提供唯一值;没有重复
  • 资源;类型:SQL查询(返回单值)
  • 资源; SQL查询:SELECT [NAME] FROM [LIST_TABLE] WHERE ID = :FIELD_1表单
  • 资源; SQL查询:(SELECT [NAME] FROM [LIST_TABLE] WHERE ID = Q.SELECTION_ID)用于数据网格

动态行动

  • 名称:更新ID字段
  • 什么时候;事件:自定义
  • 什么时候;自定义事件:result
  • 什么时候;选择:项目
  • 什么时候;项目:FIELD_2
  • 行动何时为真 行动:设定价值 设置;设置类型:SQL语句 设置; SQL语句:SELECT [ID] FROM [LIST_TABLE] WHERE [NAME] = FIELD_2 受影响的元素;选择类型:项目 受影响的元素; FIELD_1

笔记

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

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.