Oracle ApEx复选框选中/取消选中时操作其他值的方法

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 /按需处理来完成以上操作?
如果可能的话,肯定更喜欢动态操作方法,以便学习执行所需任务的新方法。
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。当为true时,将触发一个true动作,否则会触发一个false动作。

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

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

两者都没有选择类型,因为我们需要针对与点击复选框所在行相同的项目。在apex选择可能性中没有真正的方法来做到这一点。通过标题定位列,并不要忘记针对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('')单引号将值清空!在我的经验中不能使用双引号。

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

一个 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”调用并不像您想象的那样有趣...
这个报告设置也更加复杂。使用页面项目,您可以采取另一种路线:而不是执行javascript块,您可以执行plsql代码块。在那里,您可以指定要提交到会话状态的项目(因此它们可以在plsql块中使用)和要由此plsql块设置其值的项目。(sql块在服务器端运行,这意味着引用项目需要在会话状态中具有其值)。我建议您也玩弄一下。
也就是说,拥有像firebug这样的浏览器检查工具。它允许您检查页面上进行的ajax调用,并提供了一个很好的查看此内容的方法。

嗨Tom,实际上我更喜欢在勾选/取消勾选框时更新过程,因为我实际上不想有一个“提交”按钮。你提到了ajax,但不确定是否涉及?当复选框被选中时,我需要调用一个按需过程来更新记录吗?谢谢。 - tonyf
再次感谢你,汤姆。你能否给我提供一个通过动态操作调用/使用按需进程的示例?你还能提供任何解释动态操作以及内置功能的网站链接吗?谢谢。 - tonyf
汤姆:再次感谢您对我的问题的帮助以及详细的示例和解释。向您致敬。在我接受您最新回复的答案之前,我有几个问题:1)我熟悉htmldb_Get,但是在您上面的.post示例中,我不确定是否必须添加/使用函数(数据)json部分,还是只需保留原样?2)在firebug中,我应该在哪里检查ajax调用,即我需要单击哪些菜单才能看到这些调用?谢谢。 - tonyf
抱歉Tom,又有一个问题是关于之前两个问题的:3)你所编写的上述过程,是否为按需过程? - tonyf
谢谢Tom - 如果我能给你10个赞,我一定会的。希望你能帮助我解决我在SO上新发布的关于我的原始选择 - APEX_ITEM api的问题。谢谢。 - tonyf
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接