3

目前,我使用 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

4 回答 4

3

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

于 2012-09-14T09:44:41.793 回答
2

首先,单击编辑页面并添加以下 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 事件,您可以解析它们并一次填写几个(隐藏或正常)字段。

于 2017-09-13T06:27:33.853 回答
1

当标准选项没有削减它时,您始终可以自己滚动

基本的 jquery 自动完成项目(例如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 :持有标签
  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 文档:http: //jqueryui.com/demos/autocomplete/#remote-jsonp

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

于 2012-09-14T12:05:12.780 回答
0

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

创建两个字段。一个用于自动完整名称,另一个用于 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 列,您必须在 Actions -> Columns 菜单中取消选择该列。您必须确保名称数据是唯一的。重复将导致从 ID 中检索 NAME 以响应多个值,并会导致错误。

于 2019-02-11T22:02:07.313 回答