首先,我使用的是最新版本的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 /按需流程实现的?
如果可能的话,肯定会更喜欢动态行动方法,以便学习执行我所需任务的新方法。
答案 0 :(得分: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
!)
创建动态操作后,请返回。在高级下,将事件范围更改为Live
。这是分页的必要条件。如果您不改变这一点,则在分页后不会对元素绑定任何操作。
然后编辑true和false操作,取消选中 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消隐一个值:使用带有 SINGLE 引号的val('')
!根据我的经验,不会双倍工作。
动态操作文档的一些链接:
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
来传递commision的值。我在这里硬编码,但你可以获得任何你喜欢的价值。
$.post
是一个发布到页面的jQuery方法。
当您学习动态操作或拖网论坛时,您可能会遇到另一种发布到该页面的方法,即htmldb_Get
,这是内置在apex javascript文件中的。我没有使用它,因为它不是真正的Ajax(异步),而是Sjax(同步),并且在我看来并不足够透明。我相信它有一些GetAsync
部分,这很好,但是你几乎没有看到它在任何例子中使用过。现在get.get();
可能看起来很简单,你可以在3行代码而不是我的js中获得相同的结果,认为实现真正的ajax调用是一个好习惯。您可能有时等待完成一个过程太多,并且在您的应用程序中实现所有htmldb_Get
次调用并不像您认为的那样有趣......
此报告设置也更复杂。对于页面项,您可以采用另一种方法:您可以执行plsql代码块,而不是执行javascript块。在那里,您可以指定要提交到会话状态的项目(因此可以在plsql块中使用它们),以及通过此plsql块设置其值的项目。 (sql块在服务器端运行,这意味着引用的项需要在会话状态中具有它们的值)。我也建议你去解决这个问题 话虽如此,您也可以使用报告操作执行此操作,但是您需要设置一些虚假项目以临时保存值,然后可以将其提交到会话状态。再说一遍,我并不喜欢那样,所以我没有那样做(另一个' imo'因此)。
基本上,有一个浏览器检查工具,如firebug打开。它允许您检查在页面上进行的ajax调用,并提供一种很好的方式来查看它。