您好,欢迎访问一九零五行业门户网

【ERP】利用内建对象Record Group做重复性验证

在开发oracle forms的过程中,唯一性验证及重复性验证时是最基本的form验证功能之一了。通常情况下,通过为基表创建唯一性索引的
背景描述
在开发oracle forms的过程中,唯一性验证及重复性验证时是最基本的form验证功能之一了。通常情况下,通过为基表创建唯一性索引的方式来达到唯一性验证已经可以满足日常开发的要求。但是,不免会有特殊的行为和需求唯一性索引的方式还是搞不定的,比如一条记录中的两个字段的值取自相同的数据来源,但是他们彼此之间以及记录与记录之间都不能允许有重复。
幸运的是,对于特殊的情况,开发者们也有很多解决方案加以应对,比如利用pl/sql的内建数组来存储每一次录入的需要做验证的值,在验证时迭代所有数组中的值去做重复性验证。甚至你也可以利用字符串来存取单一的一个值的集合来做同样的事情,虽然我本人并不推荐使用这种方式;) 。
总结起来大概有这么几种:
使用pl/sql数组 (缺点:与form结合性不好) 使用字符串 (操作起来复杂,不宜使用,验证多列时尤为明显) 使用first_record, loop, 循环界面记录 (记录行多时速度慢,效率低,用户视觉体验不佳:因为光标一直在动。。。) 如果还有请帮我补充;) 
记录组(record group)
在开发实践中我们发现,在oracle forms内部已经提供了一种内建的类似于数组的对象record group,我想提起他来大家肯定都不陌生~ 是啊,这有什么好惊讶的?我们在创建lov的时候不是经常用到它吗。。。但是,oracle也提供了一系列的内建api来帮助我们动态创建、删除和操作记录组以及记录组中的元素,,而且可以以二维的形式存储多行数据。因此这个记录组对象就可以以编程的方式为我们所用。
相比其他的方式,我认为使用记录组的方式有如下优点:
form内建支持,可以与oracle forms有机结合 提供简洁明了的api,便于使用 记录组的行号的运作机制与数据块上的 record number时完全相同的,便于同步界面上的记录 相比其他内建方法,速度快,效率也比较高 如果还有请帮我补充;)
api简介
下面就简要介绍一下能够对我们的验证所用的api函数定义,详细的说明和文档请参考oracle forms builder的帮助文档。
一个简单的例子
下面就举一个简单的例子来说明这些api如何使用,图我就不上了,默认你们对form开发已经很熟悉啦,:)
假设form中有一个多行数据块replist,现在我们要对该数据块的report_id字段做界面唯一性验证。
1. 向form级别的触发器when-new-form-instance加入如下代码:
2. 向数据块replist添加块级触发器pre-query,添加代码如下:
3.  向数据块replist添加块级触发器when-remove-record,添加代码如下:
4. 向数据块replist添加块级触发器when-create-record,添加代码如下:
5. 向数据块replist添加块级触发器post-query,添加代码如下:
6. 向数据块replist的report_id项添加item级触发器when-validate-item,添加代码如下:
ok,大功告成了,界面上的验证部分就此告一段落,另外我们还要结合界面和数据库两个层面进行充分的验证,因为并不是所有的记录都显示在了界面上。
程序包zz_record_group
虽然内建的api已经很简洁了,但是某些操作为了简化api和验证需要在每次调用api之前做,很麻烦,故而本人干脆直接写了一个方便同学们(包括我自己)易于使用的通用程序包zz_record_group,该程序包有如下特点:
对记录行的创建和删除做了封装,简化了操作 对重复值查找提供了更方便的value_exists函数,分别为字符类型、数字类型和日期类型重载了三次 对单元格(cell)的修改操作改为set_value方便使用 以library形式发布,使用时直接attach到本机form上即可 我已经将它发布到了github上了,有兴趣的同学可以去瞧瞧;)
传送门:https://github.com/eliu/zz_record_group
感谢以下文章对笔者的启发,thanks!
enjoy!
其它类似信息

推荐信息