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

时间:2012-09-14 08:58:21

标签: oracle-apex

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

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

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

4 个答案:

答案 0 :(得分:2)

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

答案 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;
    
  5. - &GT; jQuery UI文档:http://jqueryui.com/demos/autocomplete/#remote-jsonp

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

答案 2 :(得分: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事件您可以解析它们并立即填写几个(隐藏或正常)字段。

答案 3 :(得分: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以响应多个值,并且会导致错误。