如何在Oracle Apex中验证弹出列表的数据是否更改

wj8zmpe1  于 2023-05-22  发布在  Oracle
关注(0)|答案(2)|浏览(118)

目前我正在Oracle Apex 5.0中创建一个应用程序。其中,一个页面包含7个popup lov(或选择列表),其中包含一些默认值,这些默认值是从超过1个schemas的表中检索到的。
现在我的任务是创建并应用一个验证,该验证检查至少有一个popup lov的数据被更改(无论是否所有更改),如果没有,则抛出一个错误。
我在一个包中创建了一个过程,并在其中引发了一个错误(我还创建了一个返回boolean值的函数),但它根本不起作用。
我还为每个popup lov创建了隐藏项来独立检查它们,但它不起作用。
所以,我想可能是因为lov的return瓦尔影响了我的数据。所以,我修改了我的包,但它也不会工作。
下面是我的代码示例:

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;
f2uvfpb9

f2uvfpb91#

老实说,我会做以下事情:
1.创建您的7弹出LOV,因为你已经做了。比如说,把它们叫做P1_POPUP_1,等等。
1.对于其中的每一个,创建一个名为P1_POPUP_1_ORIG的隐藏项,其中Source是P1_POPUP_x项。
1.然后创建PL/SQL表达式类型的验证,表达式为:
.

:P1_POPUP_1 != :P1_POPUP_1_ORIG AND :P1_POPUP_2 != :P1_POPUP_2_ORIG ...

只要知道起始值和结束值不为空,就可以使用此方法。如果你需要处理空值,表达式会有一点变化。
您还可以为每个项目更改不同的验证,以便您知道用户没有更改哪一个。
这样就不需要维护复杂的功能。

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

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

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

hl0ma9xz

hl0ma9xz2#

此问题已解决。只是重新导入应用程序就成功了。

相关问题