【问题标题】:Oracle ApEx Checkbox to Manipulate Other Values When Checked/UncheckedOracle ApEx 复选框以在选中/未选中时操作其他值
【发布时间】:2012-08-15 19:50:07
【问题描述】:

首先,我使用的是最新版本的 Oracle ApEx 4.1.1,并有以下标准报告,其中包含一个复选框选择,因此当单击时,我想设置另一个带有 sysdate 的字段,包括时间。

如果未选中,想将我之前声明中设置的日期以及 cmets 字段重置为 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。当复选框未选中时,我也希望反向完成 - 将日期和 cmets 都设置为 NULL。

我应该如何处理这个问题?以上是否可以通过动态操作或直接通过 JavaScript/按需流程实现?

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

【问题讨论】:

    标签: javascript sql checkbox oracle11g oracle-apex


    【解决方案1】:

    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 Selector
    jQuery 选择器:.check_select(这是我们在 sql 中的复选框中添加的类)
    条件:JavaScript 表达式
    :@ 987654326@

    条件是检查复选框元素以查看它是已选中还是未选中。 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!)

    创建动态操作后,返回。在 Advanced 下,将 Event Scope 更改为 Live。这是考虑分页所必需的。如果您不更改此设置,则分页后不会将任何操作绑定到元素。

    然后编辑真假动作,取消勾选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 删除一个值:使用 val('')SINGLE 引号!根据我的经验,不会与 double 一起使用。

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

    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 来传递佣金值。我在这里对其进行了硬编码,但您当然可以获得任何您想要的值。

    $.post 是一个发布到页面的 jQuery 方法。

    当您学习动态操作或拖网论坛时,您可能会遇到另一种发布到页面的方法,即htmldb_Get,这是内置在 apex javascript 文件中的。我不使用它是因为它不是真正的 Ajax(异步),而是 Sjax(同步),并且不够透明在我看来。我相信它有一些 GetAsync 部分,这很好,但你几乎看不到它在任何示例中使用。现在get.get(); 可能看起来很简单,你可以用 3 行代码而不是我的一段 js 来实现相同的结果,认为实现真正的 ajax 调用是一个好习惯。有时您可能会等待完成一个进程,然后意识到应用程序中的所有这些 htmldb_Get 调用并不像您想象的那么有趣......

    此报告设置也使事情变得更加复杂。对于页面项目,您可以采取另一条路线:您可以执行 plsql 代码块,而不是执行 javascript 块。在那里,您可以指定要提交到会话状态的项目(以便它们可以在 plsql 块中使用),并且项目的值由该 plsql 块设置。 (sql 块在服务器端运行,这意味着引用的项目需要在会话状态下具有它们的值)。我建议您也尝试一下。
    话虽如此,您也可以使用报告操作来执行此操作,但是您需要设置一些虚假项目来临时保存可以提交到会话状态的值。再说一次,我不喜欢那个,所以我没有选择那个(因此是另一个“imo”)。

    基本上,打开浏览器检查工具,例如 firebug。它允许您检查在页面上进行的 ajax 调用,并提供了一种很好的方式来查看它。

    【讨论】:

    • 谢谢汤姆 - 你真的帮了我很多。我只是想知道,因为我在原始帖子中没有提到这一点,我还需要将这些记录更改保存到数据库中——现在,我可以通过动态操作来完成,还是需要使用数组 f01 循环并更新检查的每一行?谢谢。
    • 如果你需要对每一行进行处理,并检查复选框是否被选中,那么除了编写自己的处理之外没有什么可做的了。这取决于您的确切含义:您需要在对它们进行更改时更新这些记录(即选中框 - 保存),还是仅在提交页面时更新?自己的处理负责页面提交,但在即时更新的情况下,您需要更多的 ajax。
    • 嗨,汤姆,我实际上更喜欢在选中/取消选中该框时进行更新,因为我实际上不想有一个“提交”按钮。您提到了ajax,但不确定是否涉及?勾选复选框时,我是否需要调用按需流程来更新记录?谢谢。
    • 是的,如果您希望这种情况立即发生,您应该这样做。仅供参考,动态操作和大量 apex 内置功能都涉及 ajax。例如,运行具有 (pl)sql 组件的动态操作涉及对服务器的调用,这很容易通过在 firefox 中使用(再次例如)firebug 来观察。
    • 再次感谢汤姆。您能否为我提供一个如何通过动态操作调用/使用按需流程的示例?您是否还可以提供任何指向解释动态操作以及内置功能的站点的链接。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2017-03-02
    相关资源
    最近更新 更多