oracle怎样统计多列是否重复,Oracle FORM Bulider 校验多行多列数据重复的一种方法...

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

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

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

0818b9ca8b590ca3270a3433284dd417.png

分析:

因为  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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值