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;
如上方法就可实现数据校验。