Oracle FORM Bulider 校验多行多列数据重复的一种方法

  FORM Bulider开发过程中,有些界面在输入时,经常要判断输入的数据是否有重复。


本文介绍一种在多列多行校验数据的方法。

如下,完成界面上所有输入的工单不能重复的功能。



分析:

      因为  FORM Bulider的许多触发器不允许使用go_record()、next_record等,所以在上诉多行多列进行校验时无法使用WHEN-VALIDATE-ITEM等触发器。

      可以再用户输入完成后,点击保存时进行校验,对界面数据逐条记录并比较。

实现:

     (1)在FORM触发器KEY-COMMT中添加校验代码;

      (2)代码实现,创建一个多维数组,记录数据的行、列、值,然后利用两重循环从数组第一个数据和最后一个数据反向进行校验。

       --定义三维记录用作三维数组,分别存放工单号、记录行、栏位
      type v_tab_rec is record(ref_name varchar2(20),ref_record number,ref_item varchar2(40));
    
      TYPE V_TAB IS TABLE OF v_tab_rec;    --声明嵌套表
       v_tab_temp V_TAB := V_TAB();      --初始化

       

      begin
    go_block('BITC_BOM_ENTITY');
    l_current_row := :system.cursor_record;
    first_record;
    
    loop
    l_record :=  l_record + 1;

                --将数据逐一保存
    if :BOM_ENTITY.source_ref1_name is not null then   
     l_count := l_count + 1;
     v_tab_temp.EXTEND;          --扩展嵌套表元素个数
     v_tab_temp(l_count).ref_name   := :BOM_ENTITY.source_ref1_name;
     v_tab_temp(l_count).ref_record := l_record;
     v_tab_temp(l_count).ref_item   := 'BOM_ENTITY.source_ref1_name';
    end if;
   
   if :BOM_ENTITY.source_ref2_name is not null then
   l_count := l_count + 1;
   v_tab_temp.EXTEND;
   v_tab_temp(l_count).ref_name   := :BOM_ENTITY.source_ref2_name;
       v_tab_temp(l_count).ref_record := l_record;
       v_tab_temp(l_count).ref_item   := 'BOM_ENTITY.source_ref2_name';
   end if;
    

                 ……………………保存所有数据

   
   EXIT WHEN :SYSTEM.LAST_RECORD = 'TRUE';
  next_record;
 
    end loop;
    --利用两重循环查看是否有重复工单
    go_record(l_current_row);
    l_count_num := l_count;
    for m in  1..v_tab_temp.count loop  --从第一个数据开始
    l_source_ref :=  v_tab_temp(m).ref_name;
     for i in reverse 1..v_tab_temp.count loop    --从最后一个数据开始
    if l_source_ref = v_tab_temp(i).ref_name and i != m then
    go_block(BOM_ENTITY');
            go_record(v_tab_temp(i).ref_record );  --跳转至重复工单
         go_item(v_tab_temp(i).ref_item);
         
         fnd_message.debug('工单号 '||l_source_ref||' 在画面记录中第 '||v_tab_temp(m).ref_record||
                             ' 和 '||v_tab_temp(i).ref_record||' 行均存在关联关系,请确认!');
  raise form_trigger_failure;
  exit;
  end if;
   end loop;
    end loop;


如上方法就可实现数据校验。

        


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值