3

首先,我使用的是最新版本的 Oracle ApEx 4.1.1,并有以下标准报告,其中包含一个复选框选择,因此当单击时,我想使用 sysdate 设置另一个字段,包括时间。

未选中时,想将我之前声明中设置的日期以及注释字段重置为 NULL

报告可能如下所示:

select id,
       name,
       telephone,
       apex_item.checkbox2(10,id) as "Tick when Contacted",
       apex_item.display_and_save(20,:P2_DATE) as "Date Contacted",
       apex_item.textarea(30,:P2_COMMENT,5,80) as "Comment"
from   my_table

作为上述报告的示例,可能总共有 10 条记录,因此由于用户选中了 10 条记录复选框中的每一个,我想当场将日期字段设置为 sysdate。当复选框未选中时,我也希望反向完成 - 将日期和注释都设置为 NULL。

我应该如何处理这个?以上是否可以通过动态操作或直接通过 JavaScript/按需流程实现?

如果可能的话,肯定会更喜欢动态操作方法,以便学习执行我所需任务的新方法。

4

1 回答 1

6

EMP 表上的示例:

select 
apex_item.checkbox2(p_idx => 1, p_value => empno, p_attributes => 'class="check_select"') empselection,
apex_item.text(2, ename) empname,
empno,
ename
from emp

向复选框项目添加一个类。这使得使用 jQuery 定位目标变得容易。

创建一个新的动态动作,例如“复选框单击”。
事件:单击
选择类型:jQuery 选择器
jQuery选择器:(.check_select这是我们在 sql 中的复选框中添加的类)
条件:JavaScript 表达式
$(this.triggeringElement).prop('checked')

条件是检查复选框元素以查看它是已选中还是未选中。prop() 测试元素的属性,在这种情况下返回 true 或 false。当为真时,将触发一个真动作,否则将触发一个假动作。

真正的行动:
行动:执行 JavaScript 代码
代码$(this.triggeringElement).closest("tr").find("td[headers='EMPNAME'] input").val('test');

错误操作:
操作:执行 JavaScript 代码
代码$(this.triggeringElement).closest("tr").find("td[headers='EMPNAME'] input").val('');

两者都没有选择类型,因为我们需要将项目定位在与单击的复选框相同的行中。没有办法通过顶点选择的可能性来做到这一点。通过标题定位列,并且不要忘记定位 td 内的输入(或:textarea!)

创建动态操作后,返回。在Advanced下将Event Scope更改为Live。这是考虑分页所必需的。如果您不更改此设置,则分页后不会将任何操作绑定到元素。

然后编辑真假动作,取消勾选 Fire on Page Load

现在说明您的日期:
由于您希望 sysdate 作为默认值,我建议在您的页面中添加一个隐藏项,例如 P9_DEF_DATE。作为,使用PLSQL 表达式,并使用SYSDATE.
然后,您可以将该字段的值用作默认值,例如:

$(this.triggeringElement).closest("tr").find("td[headers='EMPNAME'] input").val($v('P9_DEF_DATE'));

最后一点:通过 val 删除一个值:val('')引号一起使用!根据我的经验,不会与 double 一起使用。

动态操作文档的一些链接:

ajax 进程的一个示例:
假设我想更新我检查的员工的 COMM 列。

在报告页面上创建一个新流程,给它一个足够简单的名称,并且不要在其中添加空格。例如,我正在使用“update_emp”运行。

update emp
set comm = apex_application.g_x02
where empno = apex_application.g_x01;

向动态操作添加另一个真实操作,键入“执行 JavaScript 代码”。

$.post('wwv_flow.show', 
       {"p_request"      : 'APPLICATION_PROCESS=update_emp',
        "p_flow_id"      : $v('pFlowId'), //app id
        "p_flow_step_id" : $v('pFlowStepId'), //page id
        "p_instance"     : $v('pInstance'), //session id
        "x01"            : $(this.triggeringElement).val(),
        "x02"            : '88', //just a bogus value to demonstrate
        },
        function(data){
           /*normally you'd handle the returned value here
             an example would be a JSON return with which to set item values*/
        }
        );

此 javascript 将发布到页面,以update_emp进程为目标。x01并且x02是一种“临时”变量。它们存在,因此我们不必一直提交页面项目以将值发布到会话状态。它们是 apex_application 包的一部分。
所以在这里我x01用来存储 empno (复选框的值,因此this.triggeringElement),并x02传递佣金的值。我在这里对其进行了硬编码,但您当然可以获得任何您想要的值。

$.post是一个发布到页面的 jQuery 方法。

当您学习动态操作或拖网论坛时,您可能会遇到另一种发布到页面的方法,即htmldb_Get,这是内置在 apex javascript 文件中的。我不使用它是因为它不是真正的 Ajax(异步),而是 Sjax(同步),而且在我看来不够透明。我相信它的某些GetAsync部分,这很好,但你几乎看不到它在任何示例中使用。现在get.get();看起来很简单,你可以用 3 行代码而不是我的一段 js 来实现相同的结果,认为实现真正的 ajax 调用是一个好习惯。您有时可能会等待完成一个过程太多,并意识到htmldb_Get您的应用程序中的所有这些调用并不像您想象的那么有趣......

此报告设置也使事情变得更加复杂。对于页面项目,您可以采用另一条路线:您可以执行 plsql 代码块,而不是执行 javascript 块。在那里,您可以指定要提交到会话状态的项目(以便它们可以在 plsql 块中使用)和项目的值由该 plsql 块设置。(sql 块在服务器端运行,这意味着引用的项目需要在会话状态下具有它们的值)。我建议也玩一下。
话虽如此,您也可以使用报告操作来执行此操作,但是您需要设置一些虚假项目来临时保存可以提交到会话状态的值。再说一次,我不喜欢那个,所以我没有去(另一个'imo'因此)。

本质上,打开浏览器检查工具,例如 firebug。它允许您检查在页面上进行的 ajax 调用,并提供了一种很好的方法来查看它。

于 2012-08-20T15:23:44.267 回答