APEX 3.2(Oracle):在项目更改时动态填充页面上其他项的值

时间:2012-11-30 15:37:03

标签: oracle-apex

我在APEX 3.2上并且以用于在表f中插入字段f1和f2的形式,我想有几个文本项目将根据f1和查询中输入的数据自动填充和显示在桌子上。换句话说,在f1中键入empno,移动到f2框,用户应自动查看emp last_name和first_name显示。通过这种方式,她可以验证输入的empno是否正确,在f2中键入其他数据并提交表单。

有关如何达到此范围的任何建议?

我想我应该使用一些javascript。

非常感谢。 加布里埃尔

3 个答案:

答案 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 call POST values ajax调用的响应值: AJAX call RESPONSE values

答案 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