目前我使用Popup LOV显示供应商列表,但我正在尝试将字段更改为文本字段自动完成。我显示供应商名称但存储供应商ID。当我尝试更改字段时,APEX表示在LOV查询中选择了错误的列数。
是否有一种在文本字段自动完成中保存两个值的方法?我目前用于Popup LOV的以下查询:
SELECT SUPPLIER_NAME KEY, SUPPLIER_ID VALUE
FROM SUPPLIERS
WHERE ENABLED_FLAG = 'Y'
order by SUPPLIER_NAME
答案 0 :(得分:2)
自动填充文本项没有单独的显示和返回值,它只有一个值,因此关联的LOV只能有1个值。
答案 1 :(得分:1)
当标准选项没有剪切时,您可以随时滚动
基本jquery自动填充项目(ex http://apex.oracle.com/pls/apex/f?p=54687:26)
(这是相当简陋的,但它向您展示了基础知识)
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件
动态操作,页面加载,真实操作:执行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
});
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;
- &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]);
}
}
});
UPD: 您还可以将多个值放入分隔列表中,JSON或标记无关紧要。 OnResult事件您可以解析它们并立即填写几个(隐藏或正常)字段。
答案 3 :(得分:0)
需要较少的自定义编码的解决方案。
创建两个字段。一个用于自动完成名称,另一个用于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以响应多个值,并且会导致错误。