我在APEX 3.2上并且以用于在表f中插入字段f1和f2的形式,我想有几个文本项目将根据f1和查询中输入的数据自动填充和显示在桌子上。换句话说,在f1中键入empno,移动到f2框,用户应自动查看emp last_name和first_name显示。通过这种方式,她可以验证输入的empno是否正确,在f2中键入其他数据并提交表单。
有关如何达到此范围的任何建议?
我想我应该使用一些javascript。
非常感谢。 加布里埃尔
答案 0 :(得分:1)
我可以看到你可能已经走下了javascript之路......过去我曾经在APEX 3.2上遇到类似的问题,并且不知道足够的javascript来从平台上获得这种动态功能。如果你想尝试一种替代方法,你可以调整你的用户界面以提供你所寻求的功能,但你必须与用户核实他们是否可以适应这种方式,你应该可以使用现有的3.2功能,没有额外的脚本:
要求:
根据field1和field2的字段输入,使用现有表格中的数据自动填充顶点页面,以便用户可以确认在field1和field2中输入的数据是否正确。使用搜索结果中的数据作为输入新流程或表单的参数。
推荐设计:
第1页:以空白页开头,然后添加三项:field1,field2和“提交”按钮。 添加页面进程(提交后,以提交按钮项为条件),从页面1表单上的值重定向到设置项P2_field1和P2_field2。
第2页:报告页面。设置一个查询,该查询将搜索现有员工的表,搜索对employee表的部分或完整字符串搜索。 APEX 3.2曾经使用以下约定来解决部分和区分大小写的匹配问题:
SELECT field1, field2, field3, field4, ...
FROM table1
WHERE instr(upper(field1), upper(:P2_field1), 1, 1) > 0
AND instr(upper(field2), upper(:P2_field2), 1, 1) > 0
为同一搜索查询创建多个答案时,为搜索工作创建报表输出“表格”...例如使用“Smith”或“John”等常用名称...
在报告输出中添加一个附加列,或使名称列(field1或field2)成为一个链接列,转到第3页,从employee表中提供查询数据。
将属性添加到报表编辑器上的列值:重定向到“第3页”,设置P3_key =#KEY#其中第3页是最终目标表单或进程,“key”是索引或主键您正在搜索的表...或者您可以从查找表中提取已查询的n个值,以填充第2页报告。
我认为重要的是了解旧版Apex的局限性以及可能的限制以及高级Web脚本语言的知识。即使您熟悉的只是Apex版本和SQL的基础知识,您的要求仍然可以实现。
注意:如果您的查找表是巨大的(数十万条记录),您可能需要咨询DBA以获取有关优化表以处理SQL搜索查询的帮助。如果没有额外的优化帮助,在WHERE标准中添加UPPER和INSTR函数并不是查询大型数据集的最有效方法。
答案 1 :(得分:0)
我不是3.2 wiz,我没有使用它。我知道没有动态操作,也没有页面按需处理点,所以我已经考虑到了这一点。
申请流程:'get_emp_details'
(我不知道您可以/需要在3.2中选择的处理点。如果您可以按需选择,请选择它。)
代码:
DECLARE
lEmp emp%rowtype;
BEGIN
SELECT *
INTO lEmp
FROM emp
WHERE empno = :P7_EMPNO;
htp.p('{"result":"ok", "emp":{"ename":"'||lEmp.ename||'","job":"'||lEmp.job||'"}}');
EXCEPTION
WHEN no_data_found THEN
htp.p('{"result":"nok", "emp":{}}');
END;
在您的页面上(在我的情况下,我使用了第7页,将页码更改为您的页码!)将其放在html标题部分(或者如果您有javascript部分,请将javascript代码放在那里,而不是脚本标签):
修改:添加到console.log
行。请注意,当开发工具(F12)未打开时,这些将在IE中产生javascript错误!
<script type="text/javascript">
$(document).ready(function(){
console.log('document is ready');
$("#P7_EMPNO").change(function(){
var oDBGet = new htmldb_Get(null, $('pFlowId').val(), "APPLICATION_PROCESS=get_emp_details", '0');
oDBGet.add('P7_EMPNO', $("#P7_EMPNO").val());
var oResult = oDBGet.get();
var lReturn = $.parseJSON(oResult);
if(lReturn.result=='ok'){
var lEmp = lReturn.emp;
$("#P7_ENAME").val(lEmp.ename);
} else {
alert('ename could not be found for this empno!');
};
});
});
</script>
这将在EMPNO更改时执行ajax回调,并更改员工的ename。由于没有可以使用的临时应用程序项(apex_application.g_x##
),我将所需的页面项提交到会话状态。在这种情况下,P7_EMPNO
被添加到p_arg_names数组,其值被添加到p_arg_values数组中的相应位置。这是必要的,因为在应用程序进程中使用了P7_EMPNO的会话状态。
检查Firebug中的控制台选项卡时:
发布ajax调用的值:
ajax调用的响应值:
答案 2 :(得分:0)
汤姆, 这是您的代码修改为在我的系统中工作:
- 按需申请流程get_emp_details:
DECLARE
lEmp emp%rowtype;
BEGIN
SELECT *
INTO lEmp
FROM emp
WHERE badge = :P2_BADGE;
htp.p('{"result":"ok", "emp":{"lastname":"'||lEmp.last_name||'","firstname":"'||lEmp.first_name||'"}}');
EXCEPTION
WHEN no_data_found THEN
htp.p('{"result":"nok", "emp":{}}');
END;
- 页眉中的Javascript:
<script type="text/javascript">
$(document).ready(function(){
$("#P2_BADGE").change(function(){
$.post('wwv_flow.show',
{"p_request" : "APPLICATION_PROCESS=get_emp_details",
"p_flow_id" : $v('pFlowId'),
"p_flow_step_id" : '0',
"p_instance" : $v('pInstance'),
"p_arg_names" : ['P2_BADGE'],
"p_arg_values" : [$('#P2_BADGE').val()]},
function(data){
if(data){
var lReturn = $.parseJSON(data);
if(lReturn.result=='ok'){
var lEmp = lReturn.emp;
$("#P2_LAST_NAME").val(lEmp.last_name);
} else {
alert('ename could not be found for this empno!');
};
};
}
);
});
});
</script>
我可能遗漏了某些东西,当我在P2_BADGE中输入徽章编号时,它不会在P2_LAST_NAME中显示last_name。
谢谢, 加布里埃尔
汤姆,这就是我在firebug右侧窗口中的功能(数据)步骤:
this
function()
arguments
[
"wwv_flow.show"
, Object { p_request=
"APPLICATION_PROCESS=get_emp_details"
, p_flow_id=
"120"
, p_flow_step_id=
"0"
, more...}, function()]
0
"wwv_flow.show"
1
Object { p_request=
"APPLICATION_PROCESS=get_emp_details"
, p_flow_id=
"120"
, p_flow_step_id=
"0"
, more...}
p_arg_names
[
"P2_BADGE"
]
p_arg_values
[
"155752"
]
p_flow_id
"120"
p_flow_step_id
"0"
p_instance
"2189517750670012"
p_request
"APPLICATION_PROCESS=get_emp_details"
2
function()
e
"wwv_flow.show"
r
Object { p_request=
"APPLICATION_PROCESS=get_emp_details"
, p_flow_id=
"120"
, p_flow_step_id=
"0"
, more...}
p_arg_names
[
"P2_BADGE"
]
p_arg_values
[
"155752"
]
p_flow_id
"120"
p_flow_step_id
"0"
p_instance
"2189517750670012"
p_request
"APPLICATION_PROCESS=get_emp_details"
s
undefined
i
function()
toString
function()
Closure Scope
Closure Scope { toString=function()}
Closure Scope
Closure Scope { toString=function()}
Window
Window f?p=120:2:2189517750670012::NO:::
从我的firebug 1.10.6控制台:
文件准备就绪
f?p = 12 ...... :: NO :::(第29行)
empno已经改变
f?p = 12 ...... :: NO :::(第31行)
使用empno值执行帖子:undefined
f?p = 12 ...... :: NO :::(第32行)
POST
400 Bad Request
过48ms
wwv_fl .... min.js(第2行)
HeadersPostResponseHTMLCookies
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>400 Bad Request</TITLE>
</HEAD><BODY><H1>Bad Request</H1>
The HTTP client sent a request that this server could not understand.</BODY></HTML>
- 帖子标签:
Parametersapplication/x-www-form-urlencoded
p_arg_names[] P2_BADGE
p_arg_values[] 155751
p_flow_id 120
p_flow_step_id 0
p_instance 4466366911674565
p_request APPLICATION_PROCESS=get_emp_details
Source
p_request=APPLICATION_PROCESS%3Dget_emp_details&p_flow_id=120&p_flow_step_id=0&p_instance=4466366911674565&p_arg_names%5B%5D=P2_BADGE&p_arg_values%5B%5D=155751