Form Builder开发中的校验(Validation)逻辑
(版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处;否则请与本人联系,违者必究)
关于校验(Validation)
Oracle Form校验item来保证item符合它应遵守的规则。触发器可以实现额外的校验。
验证单元(Validation unit)
一个form的验证单元属性控制form中验证粒度.验证单元可以是一个item,record,block或者form.大多数Oracle Forms应用在Item层次进行校验。
什么时候进行校验
Oracle Forms在以下情况下进行校验:
l Oracle Forms 导航出验证单元.这个在终端用户按下某一功能键或者在验证单元外点击鼠标,或者触发器执行某一内置函数。
l 触发器调用内置的ENTER函数,或者终端用户按下[Enter]。
l 触发器调用内置的COMMIT_FORM函数,或者终端用户按下[Commit].在这种情况下,OracleForms 验证form不论当前的验证单元是什么。
l 触发器调用内置的VALIDATE函数。
Oracle Forms不在’输入查询’(Enter-Query)模式下进行验证.这样就允许终端用户输入OracleForms认为无效的查询条件。
验证是如何进行的
在Oracle Forms内部维护了每个Item, record, block和form的状态。为了验证的目的,每个潜在的验证单元都一个具有以下两个值的验证状态:
l 有效(valid)
l 未验证的(Unvalidated)
有效(Valid)状态意味着Oracle Forms不需要检查当前的验证单元。没验证过的(Unvalidated)状态,是内部称为’New’和’Changed’的状态组合,意味着Oracle Forms需要校验验证单元里的items。New和Changed的不同仅仅在校验过程中稍有不同(请参考table中的记录项所遵守的note)。
当验证失败的时候就会出现第三种状态,但在这种情况下Oracle Forms不会继续处理直到这种情况被更正了,所有失败的状态下是不会进入校验流程的。
Oracle Forms通过下面其中的一种来校验一个验证单元:
Item 如果item的状态是有效的,那么校验流程就停止了.如果状态是未验证的,Oracle Forms执行标准的校验检查,然后出发WHEN-VALIDATE-ITEM触发器(请参考Defer Required Enforcement property.)
Record 如果record的状态是有效的,那么校验流程就停止了。如果状态是未验证的,Oracle Forms就会校验record里面的每个item,然后触发WHEN-VALIDATE-RECORD触发器.
注意:如果校验是作为调用VALIDATE触发器的结果,并且记录的内部状态是New,那么校验过程就终止了。
Block OracleForms验证block内的所有记录。
Form Oracle Forms验证form中的所有block.
Item的校验状态
未验证OracleForms在以下情况下把item的状态设置为未验证。
l Oracle Forms创建了一条记录。
l 终端用户为item输入了一个值,或者一个触发器致使一个值存入了这个item.
注意: 即使item新的值和旧的值是一样的,Oracle Forms还是会设置item的状态为未验证。比如,一个Item的状态是有效,并且它的值是10,然后终端用户输入了10到这个item,Oracle还是把这个item的状态设成未验证。
l 当Oracle Forms复制了一条新记录(响应内置的DUPLICATE_RECORD函数或者[DuplicateRecord]键)。任何在原有的记录中为未验证的item在新的记录中仍为未验证状态。
有效 OracleForms 在以下情况下把item的状态设置为有效。
l 当Oracle Forms成功校验了一个item,将设置这个item的状态为有效,即使验证改变了item的值(通过WHEN-VALIDATE-ITEM, WHEN-VALIDATE-RECORD或者POST-CHANGE触发器)。Oracle Forms不会重复验证改变的值。
注意:这种行为避免了验证循环,但是触发器错误可能导致Oracle Forms把一个无效的值提交到数据库中。
l 当Oracle Forms从数据库中取出记录时,将把它们的状态设置为有效,即使POST-CHANGE触发器在取出它们的时候被触发并修改了它们的值。
l 当Oracle Forms成功把数据提交到数据库的时候,它将把form上的所有item的状态设置为有效. Oracle Forms不会验证在提交事务时触发的触发器所做的更改。
注意:请参考在提交事务中修改数据而不遵守这个原则的例外情况(Changing Data During Commit Processing).
l 当Oracle Forms复制了一条新记录(响应内置的DUPLICATE_RECORD函数或者[DuplicateRecord]键)。任何在原有的记录中为有效状态的item在新的记录中仍为有效状态。
记录的验证状态
每条记录都有一个或为有效或为未验证的状态。
注意:一条记录的状态是不同于系统变量SYSTEM.RECORD_STATUS的值的。
未验证OracleForms在以下情况下把一条记录的状态设置为未验证。
l 当Oracle Forms创建了一条记录,将把它的状态设置为未验证。
l 当Oracle Forms把当前记录中的一个item设置为未验证的时候,它也会把当前记录的状态也设成未验证。
l 当Oracle Forms复制了一条新记录(响应内置的DUPLICATE_RECORD函数或者[DuplicateRecord]键),它将把新记录状态设置为未验证。
有效 OracleForms 在以下情况下把一条记录的状态设置为有效。
l 当Oracle Forms校验了一条记录是,将校验每个状态不为有效的item。如果所有的item在这个过程完成时都为有效状态,并且WHEN-VALIDATE-RECORD触发器,如果有的话,返回时没有抛出Form_Trigger_Failure异常, Oracle Forms将把这条记录的状态设置为有效。
l 当Oracle Forms从数据库取记录的时候,将把它们的状态设置为有效。
l 当Oracle Forms成功把数据提交到数据库时,将把form中的每条记录的状态都设置为有效。Oracle Forms不会验证在提交事务时触发的触发器所做的更改
注意:请参考在提交事务中修改数据而不遵守这个原则的例外情况(Changing Data During Commit Processing).
l 当Oracle Forms复制了一条状态为有效的记录(响应内置的DUPLICATE_RECORD函数或者[DuplicateRecord]键)时,新记录的状态也将被设置为有效。
标准的校验检查
Oracle Forms使用属性面板中Data和List ofValues(LOV)部分中的所指定的要求来对一个item进行校验。
文本items的校验顺序
对应文本items,Oracle Forms将采用下面其中之一的校验步骤,依赖于这个item值是不是null.如果text item在其中一个验证步骤中失败,Oracle Forms会注意到这个失败并且忽略掉后面的验证步骤。
当item的值为null是:
1. 如果item的Required属性为Yes,那么item是验证将失败除非item级别的验证是在下面的情况下出现的。
l Form的’ Defer Required Enforcement’属性被设置为Yes或者4.5(对于这类验证行为的讨论,请参考’ Defer Required Enforcement’属性).
l Item实例不允许终端用户修改。
l 在上面的任一例外情形下,OracleForms延迟为null值的item的验证到记录层次的验证.(注意如果item实例不允许终端用户修改,即使’ Defer Required Enforcement’属性设置为No, item的校验也会被延迟).
2. 如果item的Required属性为No,那么WHEN-VALIDATE-ITEM触发器将会被触发。如果触发器Form_Trigger_Failure异常,那么item验证就失败了。
当item的值不为null:
1. 检查数据类型。如果值的类型和item的数据类型不匹配,那么item的此步验证就是把了。
Oracle Forms将尝试把用户输入的值转换为item定义的数据类型.如果item定义了格式,Oracle Forms会使用定义的格式。如果item没有定义格式并且数据类型是DATE或者DATETIME,Oracle Forms将使用Oracle Forms在启动时输入格式。
如果item没有定义格式并且数据类型是NUMBER或者字母,Oracle Forms将检查是不是一个有效的数字或者字母文本串。
2. 范围检查。如果值不匹配item的Lowest Allowed Value和Highest Allowed Value属性,那么验证步骤失败。
3. 如果item的’Use LOV for Validation’属性设置为Yes,验证值是不是在item值列表中。
4. 触发POST-CHANGE触发器。如果触发器抛出Form_Trigger_Failure异常,那么验证步骤就失败了。
5. 触发WHEN-VALIDATE-ITEM触发器.如果触发器Form_Trigger_Failure异常,那么验证步骤就失败了.
非文本item的验证顺序
如果item的类型属性值不是文本item,Oracle Forms遵循上面的顺序,但是忽略掉上面的第三到第五步,除非item的类型为List并且它是列表类型为Combo Box,否则也将忽略第二步的验证。
同步items的验证
如果Items,比如B和C,设置它们的’Synchronize with Item’属性为另一个item的名称,比如A,那么A,B和C组成了一组同步的items。A是这组中的主item,B和C是附属的item.同步items在早期的OracleForms中称为’mirror items’.
一组同步items共享一个公共的数据值,但是它们可以有不同属性值。Oracle Forms取主item的特定数据属性和触发器,忽略附属items的这些属性和触发器。
当验证设置给同步组的items的值时,Oracle Forms使用主item中以下的数据属性和触发器:
l 必填属性(Required)
l 允许的最高值(HighestAllowed Value)
l 允许的最小值(HighestAllowed Value)
l 初始值(InitialValue)
l POST-CHANGE触发器
l WHEN-VALIDATE-ITEM触发器
如果附属item为这些属性设了值或者这些trigger有代码,Oracle Forms会忽略它们并发出一个警告。
Oracle Forms将会对通过编程设置值或者由终端用户操作设置值的item的余下的验证属性进行验证。特别的,Oracle Forms使用item的列表属性进行验证。
SYSTEM.TRIGGER_ITEM变量包含设置了值的item名称。这允许POST-CHANGE或者WHEN-VALIDATE-ITEM触发器中的代码来引用Item的属性,即使这些触发器定义于主item上。
Oracle Forms会考虑不是通过编程设置或终端用户设置,而是由主Item设置的值,因为那是Oracle Forms 用作初始值的数据源。
在记录级别的校验中,Oracle Forms通过设置了数据值item来校验item。如果校验失败,Oracle Forms将会把焦点移到这个item上,除非这个item实例不允许终端用户输入。在这种情况下,Oracle Forms会尝试把焦点给同步组中另一个允许用户输入的item。如果找不到这样的item,Oracle Forms会尝试把焦点给同步组中设置了Enabled属性为Yes的item.
Form Builder开发中的校验(Validation)逻辑
原文:http://blog.csdn.net/tavor/article/details/18448917