【问题标题】:Can I put a validation on an Interactive Grid row deletion?我可以对交互式网格行删除进行验证吗?
【发布时间】:2018-07-16 00:35:48
【问题描述】:

我正在尝试在交互式网格上添加验证,主要是检查是否有任何内容依赖于行,因此我可以显示用户友好的错误,而不是“Ajax 调用返回服务器错误 ORA-20987:APEX - ORA-02292: 完整性约束 (FOO.MY_CONSTRAINT)...",但对于已删除的行似乎总是跳过验证。难道我做错了什么?我正在使用 Apex 5.1.2。

为了测试,我在交互式网格上创建了​​一个验证,类型 = 没有返回行,SQL 查询 = SELECT 1 FROM dual WHERE :APEX$ROW_STATUS = 'D'。我希望这会阻止任何行被删除。相反,验证总是被跳过。调试日志如下所示:

Perform custom validations:
...Validation "New" - Type: NOT_EXISTS
......Skip for row 1 because "Row Status" is "Deleted"

我尝试更改验证类型,将始终执行设置为是,使用所有提交的行和创建和修改的行的范围,但没有运气。

我在这里创建了一个演示:https://apex.oracle.com/pls/apex/f?p=62159:10

【问题讨论】:

    标签: oracle oracle-apex


    【解决方案1】:

    您可以使用APEX error handling function 获得更好的约束违规消息。这会拦截错误消息并允许您对它做任何您想做的事情,例如查找特定的约束名称并发出更合适(和干净)的消息,如下所示:

    此外,您可以用 PL/SQL 代码替换默认的网格处理,如下所示:

    begin  
         case :APEX$ROW_STATUS  
         when 'C' then
             insert into emp ( empno, ename, deptno )  
             values ( :EMPNO, :ENAME, :DEPTNO )  
             returning rowid into :ROWID;  
         when 'U' then  
             update emp  
                set ename  = :ENAME,  
                    deptno = :DEPTNO  
              where rowid  = :ROWID;  
         when 'D' then  
             delete emp  
             where rowid = :ROWID;  
         end case;  
    end;  
    

    除了简单的 DML 语句,您还可以调用自己的 API,例如

         when 'D' then  
             emp_pkg.delete_emp (:ROWID);  
    

    然后这些可以在执行 DML 之前实现您自己的业务规则和错误消息。直到需要错误处理功能才能从异常消息中删除“ORA-20001:”等。

    【讨论】:

    • 如果可以避免的话,我宁愿不编写自己的自定义处理。这个页面很简单,标准的 IG 处理可以处理它。这两种解决方案都适用于处理步骤。有没有办法在验证步骤中捕捉到这一点?
    【解决方案2】:

    Patrick Wolf 已确认这是一个错误,并将予以修复。 https://community.oracle.com/message/14862207#14862207

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 2015-11-14
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多