我可以对交互式网格行删除进行验证吗?

时间:2018-06-15 14:46:52

标签: oracle oracle-apex

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

为了测试,我在交互式网格上创建了​​一个验证,Type = No Rows返回,SQL Query = 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"

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

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

2 个答案:

答案 0 :(得分:1)

您可以使用APEX error handling function获得更好的约束违规消息。这会拦截错误消息,并允许您使用它执行任何操作,例如查找特定的约束名称并输出更合适(且干净)的消息,如下所示: enter image description here

此外,您可以用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;  

您可以调用自己的API,而不是简单的DML语句,例如

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

然后,这些可以在执行DML之前实现您自己的业务规则和错误消息。错误处理函数将被要求从异常消息中删除“ORA-20001:”等。

答案 1 :(得分:0)

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