时间:2021-07-01 10:21:17 帮助过:1人阅读
在开发Oracle forms的过程中,唯一性验证及重复性验证时是最基本的form验证功能之一了。通常情况下,通过为基表创建唯一性索引的
背景描述
在开发Oracle forms的过程中,唯一性验证及重复性验证时是最基本的form验证功能之一了。通常情况下,通过为基表创建唯一性索引的方式来达到唯一性验证已经可以满足日常开发的要求。但是,不免会有特殊的行为和需求唯一性索引的方式还是搞不定的,比如一条记录中的两个字段的值取自相同的数据来源,但是他们彼此之间以及记录与记录之间都不能允许有重复。
幸运的是,对于特殊的情况,开发者们也有很多解决方案加以应对,比如利用PL/SQL的内建数组来存储每一次录入的需要做验证的值,在验证时迭代所有数组中的值去做重复性验证。甚至你也可以利用字符串来存取单一的一个值的集合来做同样的事情,虽然我本人并不推荐使用这种方式;) 。
总结起来大概有这么几种:
如果还有请帮我补充;)
记录组(Record Group)
在开发实践中我们发现,在Oracle forms内部已经提供了一种内建的类似于数组的对象Record Group,我想提起他来大家肯定都不陌生~ 是啊,这有什么好惊讶的?我们在创建LOV的时候不是经常用到它吗。。。但是,Oracle也提供了一系列的内建API来帮助我们动态创建、删除和操作记录组以及记录组中的元素,,而且可以以二维的形式存储多行数据。因此这个记录组对象就可以以编程的方式为我们所用。
相比其他的方式,我认为使用记录组的方式有如下优点:
如果还有请帮我补充;)
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,该程序包有如下特点:
我已经将它发布到了github上了,有兴趣的同学可以去瞧瞧;)
传送门:https://github.com/eliu/zz_record_group
感谢以下文章对笔者的启发,Thanks!
Enjoy!