如何在Oracle Apex中验证popup lov的数据是否已更改

如何在Oracle Apex中验证popup lov的数据是否已更改,oracle,plsql,oracle-apex,Oracle,Plsql,Oracle Apex,目前,我正在Oracle Apex 5.0中创建一个应用程序。其中一个页面包含7个弹出lov或select列表,其中包含一些默认值,这些值是从多个模式的多个表中检索到的 现在我的任务是创建并应用一个验证,该验证检查弹出lov的至少一个数据是否已更改,无论是否所有更改,然后抛出一个错误 我在包中创建了一个过程,并在其中引发了一个错误。我还创建了一个返回布尔值的函数,但它根本不起作用 我还为每个弹出lov创建了隐藏项,以单独检查这些项,但它不起作用 所以,我想可能是因为lov的返回值影响了我的数据。

目前,我正在Oracle Apex 5.0中创建一个应用程序。其中一个页面包含7个弹出lov或select列表,其中包含一些默认值,这些值是从多个模式的多个表中检索到的

现在我的任务是创建并应用一个验证,该验证检查弹出lov的至少一个数据是否已更改,无论是否所有更改,然后抛出一个错误

我在包中创建了一个过程,并在其中引发了一个错误。我还创建了一个返回布尔值的函数,但它根本不起作用

我还为每个弹出lov创建了隐藏项,以单独检查这些项,但它不起作用

所以,我想可能是因为lov的返回值影响了我的数据。所以,我修改了我的包,但它也不会工作

以下是我的代码示例:

 CREATE OR REPLACE package body KPC_CA is


 function find_change ( t_per_id      KPCPAY.EMP_INF.per_id%type, 
                        shift1        KPCPAY.EMP_INF.shft1%type,
                        shift2        KPCPAY.EMP_INF.shft2%type,
                        shift3        KPCPAY.EMP_INF.shft3%type,
                        wklyoff       KPCPAY.EMP_INF.wklyoff%type,
                        sup_name      KPCPAY.EMP_INF.emp_name%type,
                        sup_token_no  KPCPAY.EMP_INF.r_emp_no%type,
                        loc_desc      KPCPAY.EMP_INF.loc_desc%type,
                        dept_name     KPCPAY.EMP_INF.dept_name%type,
                        sbu           KPCPAY.EMP_INF.sbu_id%type,
                        effective_date          date
                  ) return number as

                        t_shift1        KPCPAY.EMP_INF.shft1%type;
                        t_shift2        KPCPAY.EMP_INF.shft2%type;
                        t_shift3        KPCPAY.EMP_INF.shft3%type;
                        t_wklyoff       KPCPAY.EMP_INF.wklyoff%type;
                        t_sup_name      KPCPAY.EMP_INF.emp_name%type;
                        t_sup_token_no  KPCPAY.EMP_INF.r_emp_no%type;
                        t_location      KPCPAY.EMP_INF.loc_desc%type;
                        t_dept_name     KPCPAY.EMP_INF.dept_name%type;
                        t_sbu           KPCPAY.EMP_INF.sbu_id%type;


                        flag                      boolean := false;


 begin
     begin
         select shft1, shft2, shft3, wklyoff, loc_desc, r_emp_no, 
                dept_name into t_shift1, t_shift2, t_shift3, t_wklyoff, 
                t_location, t_sup_token_no, t_dept_name                                
         from KPCPAY.EMP_INF 
         where per_id = t_per_id;


         select emp_name into t_sup_name
         from KPCPAY.EMP_INF 
         where emp_no = (select r_emp_no 
                         from KPCPAY.EMP_INF 
                         where per_id = t_per_id);                      


         SELECT distinct(decode ( SUBSTR(ORGANIZATION_CODE, 1, 1), 
                                                             '1','CORP',
                                                              '2','ACD',
                                                              '3','TRM',
                                                              '4','ACR',
                                                              '5','RR',
                                                              '6','RRS'
                            )) "decode" into t_sbu
            from apps.org_organization_definitions 
            where ORGANIZATION_ID= (select sbu_id 
                            from kpcpay.emp_inf 
                            where per_id = t_per_id);

     end;


     begin

         if t_shift1 != shift1 then
             flag := true;
         end if;

         if t_shift2 != shift2 then
             flag := true;
         end if;

         if t_shift3 != shift3 then
             flag := true;
         end if;

         if t_wklyoff != wklyoff then
                flag := true;
         end if;

         if t_sup_token_no != sup_token_no then
              flag := true;
         end if;

         if t_sup_name != sup_name then
              flag := true;
         end if;

         if t_location != loc_desc then
               flag := true;
         end if;

         if t_dept_name != dept_name then
                flag := true;
         end if;

         if t_sbu != sbu then
               flag := true;
         end if;                

      end;


      if flag = true then
         return 1;
      else
        return 0;
          -- or raise_application_error
      end if;              

    end find_change;
    end KPC_CA;

老实说,我要做的是:

创建你的7个弹出式爱情,就像你已经做的那样。给他们打电话,比如说,P1_POPUP_1,等等。 对于其中的每一项,创建一个名为P1_POPUP_1_ORIG的隐藏项,其中源是P1_POPUP_x项。 然后创建PL/SQL表达式类型的验证,表达式为:

只要您知道起始值和结束值将不为null,这项功能就可以工作。如果需要处理空值,表达式会有一点变化

您还可以为每个项目更改为不同的验证,以便知道用户没有更改哪一项

这样就不需要维护复杂的功能

编辑: 有多种方法可以处理空值。在这种情况下,我通常会这样做:

NVL( :P1_POPUP_1, '*' ) != NVL( :P1_POPUP_1_ORIG, '*' ) AND 
NVL( :P1_POPUP_2, '*' ) != NVL( :P1_POPUP_2_ORIG, '*' ) AND  ...

在这里,我选择了“*”作为一个简单的字符串,我知道它永远不会以实际值的形式出现,但您可能希望选择更适合预期值的字符串。

将选择列表的值传递给您的过程时:您是否确保它们的值存储到会话状态?最简单的方法是使用一个提交页面的按钮,并创建一个在按下该按钮时运行的进程;然后,该进程应该调用您的过程或函数,不管怎样,将项的值传递给它。检查所传递内容的一种简单方法是创建一个日志记录表,然后根据您的过程执行INSERT。通过一个自主的事务处理过程和提交插入,这样你就能够看到发生了什么。请阅读-总结是,这不是一个理想的方式来解决志愿者,可能会适得其反获得答案。请不要将此添加到您的问题中。请注意,当在此处的帖子中使用时,您需要使用带反勾号的内联格式,否则它将被理解为HTML,这在大多数情况下意味着它将消失。请在发布之前校对你的文章。谢谢好的,谢谢@halfer我会提醒它。好的@Littlefoot我会检查它。@ealson实际上我以前也做过,但它不起作用,是的,我还需要处理空值。不起作用不是对问题的有用描述。我不知道你是否得到了一个错误,如果无效值传递为有效值,或者反之亦然,或者什么。事实上,问题是我没有得到任何错误。但这种验证仍然没有执行。同样,条件没有被应用,但仍然没有被执行。我将编辑并重新发布此问题以向您显示我的验证代码。然后,我将在函数开头添加对apex_debug的调用,以记录所有这些项的状态,然后在调试模式下运行页面。首先,将验证简化为单个项目,使其正常工作,然后添加更多。当您说您的验证没有执行时,您的意思是它不再运行了吗?检查调试日志,或者运行并说它是有效的?问题解决了!我已经删除了我的应用程序并导入了一个备份副本。我不知道为什么,但其中许多副本也受到同样问题的影响。这是最初的副本。然后我得到了我预期的结果。但说真的,这不是一个恰当的解决方案。正当
NVL( :P1_POPUP_1, '*' ) != NVL( :P1_POPUP_1_ORIG, '*' ) AND 
NVL( :P1_POPUP_2, '*' ) != NVL( :P1_POPUP_2_ORIG, '*' ) AND  ...