oracle form builder 内置函数说明,Form Builder开发中的校验(Validation)逻辑

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.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值