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

ton*_*nyf 3 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
Run Code Online (Sandbox Code Playgroud)

作为上述报告的一个例子,可能总共有10条记录,因此当用户检查10条记录复选框中的每一条时,我想在现场将日期字段设置为sysdate.我也希望反向完成,当取消选中该复选框时 - 将日期和注释都设置为NULL.

非常感谢有关如何处理此问题的任何帮助,以及是否可以通过动态操作或直接通过javascript/on demand流程实现上述功能.

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

谢谢.

Tom*_*Tom 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
Run Code Online (Sandbox Code Playgroud)

在复选框项中添加一个类.这样可以很容易地使用jQuery进行定位.

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

条件是检查复选框元素以查看它是否已被选中或未选中.prop()测试元素的属性,在这种情况下返回true或false.如果为true,则会触发真正的动作,否则将执行错误操作.

真实行动:
行动:执行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'));
Run Code Online (Sandbox Code Playgroud)

最后要注意的:通过VAL消隐出的值:使用val('')引号!根据我的经验,不会使用双倍.

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

ajax进程的一个例子:
所以我想说我要更新我检查的员工的COMM列.

在报告页面上创建一个新进程,给它一个足够简单的名称,不要在其中放置空格.例如,我正在运行"update_emp".

update emp
set comm = apex_application.g_x02
where empno = apex_application.g_x01;
Run Code Online (Sandbox Code Playgroud)

向动态操作添加另一个真实操作,键入"执行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*/
        }
        );
Run Code Online (Sandbox Code Playgroud)

这个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调用,并提供了一种查看它的好方法.