目前我使用Popup LOV显示供应商列表,但我正在尝试将字段更改为文本字段自动完成。我显示供应商名称但存储供应商ID。当我尝试更改字段时,APEX表示在LOV查询中选择了错误的列数。
是否有一种方法在文本字段自动完成中保存两个值?我目前用于Popup LOV的以下查询:
SELECT SUPPLIER_NAME KEY, SUPPLIER_ID VALUE
FROM SUPPLIERS
WHERE ENABLED_FLAG = 'Y'
order by SUPPLIER_NAME
自动完成文本项没有单独的显示和返回值,它只有一个值,因此关联的LOV只能有1个值。
当标准选项没有削减它时,您可以随时自行滚动
基本jquery自动完成项目(ex http://apex.oracle.com/pls/apex/f?p=54687:26) (这是相当简陋的,但它向您展示了基础知识)
<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" />
$("#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
});
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
首先,单击编辑页面并添加以下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]);
}
}
});
UPD:您也可以将多个值放入分隔列表中,JSON或标记无关紧要。 OnResult事件您可以解析它们并立即填写几个(隐藏或正常)字段。
需要较少自定义编码的解决方案
创建两个字段。一个用于自动完成名称,另一个用于ID。 ID是存储在数据库中的ID。
ID字段
FIELD_1
SELECTION_ID
名称字段
FIELD_2
SELECT [NAME] FROM [LIST_TABLE]
确保查询提供唯一值;没有重复SELECT [NAME] FROM [LIST_TABLE] WHERE ID = :FIELD_1
表单(SELECT [NAME] FROM [LIST_TABLE] WHERE ID = Q.SELECTION_ID)
用于数据网格动态行动
result
FIELD_2
SELECT [ID] FROM [LIST_TABLE] WHERE [NAME] = FIELD_2
受影响的元素;选择类型:项目
受影响的元素; FIELD_1
笔记
对于数据网格,您将无法直接隐藏ID列,您必须取消选择“操作” - >“列”菜单中的列。您必须确保名称数据是唯一的。重复将导致从ID检索NAME以响应多个值,并将导致错误。