注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Memory extender

Beautiful Day..

 
 
 

日志

 
 

Form界面校验重复记录(Duplicate Record)  

2010-10-12 12:09:43|  分类: EBS Form |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
       有时候为了更好的User体验,我们可能要在输入完一条记录之后就验证它是否录入重复,而不是在保存的时候才提示Duplicate Record Error。实现基于的前提是多行Block,User一进画面即是查询出所有相关记录,同EBS中实现标准汇总功能的条件。
       下面是一个很好的例子,作者提到“当是也许你有特殊的需求,数据库中可能是存在重复的,但是在进行某种事务的时候必须要求唯一,声明了文章只是实现上述条件下的功能。
    而实际上,我们往往被要求实现在界面上录数据的时候就体现DB的Duplicate Rocord验证。User可能进行Clear_Record操作然后再录入数据,这样如果直接引用作者的方法就会有问题,因为用Form本身的Summary Item实现的SUM只能将当前画面中的数据计入SUM,或许使用作者的方法结合APP_CALCULATE.RUNNING_TOTAL可以实现完整的功能,有时间测试一下能否结合使用。
----------------------------------------------------------------------------------------------------------------------------------------------------
以下摘自 顺 的一篇文章,感谢作者,很好的方法

在一个多行的BLOCK中如果需要去校验一个重复记录,以往我们有一下三种做法:

1.       建议唯一索引。

2.       在保存时,取数据库中的值进行校验。

3.       在某个触发事务处理的按钮上循环整个块,根据数据库中的值进行重复校验。 

使用唯一索引和保存时校验都是同样的道理,只是一个是数据库自身验证,一个是客户化的代码来进行验证。但是我们假设:这个多行块拥有较多的字段,或者是存在较多的dependent item关联,那么使用者在录入多行数据后,提示重复,会让使用者感到非常不爽。

而循环块的方式更加不好,性能差(需要触发大量的触发器),且当数据较多时光标明显的闪烁感,在此,我们提供一个在某些情况下性能较好,且客户体验较好的方法,感谢 Kevin D Clarke 的思路。当是也许你有特殊的需求,数据库中可能是存在重复的,但是在进行某种事务的时候必须要求唯一,那么你恐怕就只能采用第三种方法了。

这里做了个非常简单的例子,假设行号和物料加起来是需要进行唯一验证的,下面是效果图:

Form界面校验重复记录(Duplicate Record) - Gabriel - Gabriel

下面我们就来讲解,如何来实现它。如下图你需要准备一下的块和ITEM还有触发器:

Form界面校验重复记录(Duplicate Record) - Gabriel - Gabriel

Block的属性:

             Block Name             DUPBLOCK

               Query All Records      Yes

               

               Block Name             CONTROL

               Query All Records      Yes

               Single Record          Yes

               Database Data Block    No

Item的属性

FLAGData TypeNumber):

Form界面校验重复记录(Duplicate Record) - Gabriel - Gabriel

   COUNT_ITEM Data TypeNumber):

Form界面校验重复记录(Duplicate Record) - Gabriel - Gabriel
   PRE_DATA :普通的charitem即可

其中FLAGFormula的值为:

cux_com(:contorl.pre_data,:dupblock.line_number||:dupblock.item_number)

 这个表达式中的cux_com是一个Form中的function具体为:

FUNCTION cux_com(str1 varchar2,str2 varchar2) RETURN number IS

  l_return number:=0;

BEGIN

  IF str1 = str2 then

    l_return := 1;

  else

    l_return := 0;

  end if;

  return l_return;

END;

添加DUPBLOCKwhen_validate_record触发器,触发器中的代码为:

:contorl.pre_data := :dupblock.line_number||:dupblock.item_number;

if :contorl.count_item > 1 then

  message('存在重复数据!');

  --fnd_message.debug('存在重复数据!');

  raise form_trigger_failure;

end if;

到这里就完成了。

  评论这张
 
阅读(1101)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017