选中/取消选中时,Oracle ApEx复选框将处理其他值

时间:2012-08-20 13:14:24

标签: javascript sql checkbox oracle11g oracle-apex

首先,我使用的是最新版本的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 /按需流程实现的?

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

1 个答案:

答案 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进程。 x01x02是一种“温度”。变量。它们存在,因此我们不必一直提交页面项目以便将值发布到会话状态。它们是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调用,并提供一种很好的方式来查看它。