Javascript Oracle ApEx复选框,用于在选中/取消选中时操纵其他值
首先,我使用的是最新版本的Oracle ApEx 4.1.1,下面的标准报告中有一个复选框,因此单击时,我想用sysdate设置另一个字段,包括时间 未选中时,是否希望将我在上一条语句中设置的日期以及注释字段重置为空 报告可能如下所示:Javascript Oracle ApEx复选框,用于在选中/取消选中时操纵其他值,javascript,sql,checkbox,oracle11g,oracle-apex,Javascript,Sql,Checkbox,Oracle11g,Oracle Apex,首先,我使用的是最新版本的Oracle ApEx 4.1.1,下面的标准报告中有一个复选框,因此单击时,我想用sysdate设置另一个字段,包括时间 未选中时,是否希望将我在上一条语句中设置的日期以及注释字段重置为空 报告可能如下所示: select id, name, telephone, apex_item.checkbox2(10,id) as "Tick when Contacted", apex_item.display_and_
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/按需流程实现的
如果可能的话,我肯定更喜欢动态行动方法,以便学习执行所需任务的新方法。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选择器:
。选中\u select
(这是我们添加到sql中复选框中的类)条件:JavaScript表达式
值:
$(this.triggeringElement).prop('checked')
该条件是对checkbox元素的检查,以查看它是否已被选中。prop()测试元素的属性,在本例中返回true或false。当为真时,将触发真实动作,否则将触发错误动作
真正的行动:操作:执行JavaScript代码
Code:
$(this.triggeringElement).closest(“tr”).find(“td[headers='EMPNAME']input”).val(“test”)代码>
错误操作:
操作:执行JavaScript代码
Code:$(this.triggeringElement).closest(“tr”).find(“td[headers='EMPNAME']input”).val(“”)代码>
这两种方法都没有选择类型,因为我们需要针对与单击的复选框所在行相同的项目。没有一种方法可以通过顶点选择的可能性来实现这一点。通过标题指向列,不要忘记指向td内部的输入(或:textarea
!)
创建动态动作后,返回。在高级下,将事件范围更改为实时
。这对于分页是必需的。如果不更改此项,则分页后不会将任何操作绑定到元素
然后编辑true和false操作,并取消选中页面加载时激发的
现在说明您的日期:
由于您希望sysdate作为默认值,我建议在页面中添加一个隐藏项,例如P9_DEF_DATE。作为源,使用PLSQL表达式,并使用SYSDATE
然后可以将该字段的值用作默认值,例如:
$(this.triggeringElement).closest("tr").find("td[headers='EMPNAME'] input").val($v('P9_DEF_DATE'));
最后一个注意事项:通过val将值清空:使用val(“”)
和单引号!根据我的经验,我不会和double一起工作
动态操作文档的一些链接:
- oracle示例(演示如何在动态操作中使用plsql块):
- 迪米特里·吉利斯(一些基础知识):
- Dan McGhan的Youtube教程:
- 当然,网络上总是有很多东西可以找到,但不要这样做
忘记OTN论坛吧
ajax流程的示例:
假设我想更新我检查过的员工的COMM列
在报告页面上创建一个新流程,给它一个足够简单的名称,不要在其中加空格。例如,我正在运行“update_emp”
将另一个true操作添加到动态操作中,键入“执行JavaScript代码”
此javascript将发布到页面,以更新\u emp
过程为目标x01
和x02
是一种“临时”变量。它们是存在的,因此我们不必一直提交页面项以便将值发布到会话状态。它们是apex_应用程序包的一部分。
因此,这里我使用x01
存储empno(复选框的值,因此this.triggeringElement
),并x02
为佣金传递值。我在这里硬编码,但是你可以得到你想要的任何值
$.post
是发布到页面的jQuery方法
在学习动态动作或拖网论坛时,您可能会遇到另一种方法来发布到页面,即htmldb\u Get
,这是apex javascript文件中内置的。我之所以不使用它,是因为它不是真正的Ajax(异步),而是Sjax(同步),而且在我看来不够透明。我相信有一些GetAsync
是它的一部分,这是很好的,但在任何例子中,你几乎看不到它的使用。现在get.get()代码>看起来很简单,您可以在3行代码中获得相同的结果,而不是我的JS片段,认为实现真正的Ajax调用是一个很好的实践。有时,您可能会等待太多时间来完成一个过程,并意识到应用程序中所有的htmldb\u Get
调用并不像您想象的那样有趣
使用此报告设置,情况也更复杂。对于页面项,您可以采取另一种方法:不执行javascript块,而是执行plsql代码块。在那里,您可以指定要提交到会话状态的项(以便它们可以在plsql块中使用)以及要由该plsql块设置其值的项。(sql块在服务器端运行,这意味着引用的项需要在
update emp
set comm = apex_application.g_x02
where empno = apex_application.g_x01;
$.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*/
}
);