被修改时才被检验。
----点击Table Designer中右上角的Table Properties 按钮,你就可以在表属性对话框中创建记录级的有效性规则。对客户信息表,可以建立如下的有效性规则以确保银行、帐号、税号均不为空。
----Validation Rule:!empty(khyh).and.!empty(zh).and.!empty(sh)
----Validation Text:"开户行、帐号和税号均不能为空"
----3.触发器
----就本质而言,对于表格里的一个记录,我们仅能做三件事情:删除、修改或建立,与之对应的三种触发器使我们能有效地控制这些事件发生,它们通常都使用一个函数,当返回的逻辑值为.t.就继续执行,否则就退出。
----在表属性对话框中,除了记录有效性规则之外,还有三种触发器:INSERT Trigger、UPDATE Trigger和DELETE Trigger。如果想限制某一事件的发生,可直接在其域中填入.f.,例如:在UPDATE Trigger中填.f.,则该表不允许修改。对于本文例示中的销售发票表,我们可以事先在数据库的Stored Procedure中自定义一个函数Inv_del(),然后在删除触发器中填入:
DELETE Trigger:Inv_del()
自定义函数Inv_del()的代码如下:
function Inv_del
*
*INVOICE.DBF Delete Trigger
*
local lnRrt
lnRet=MESSAGEBOX("是否确认删除 本记录?",4+32+256,"提示")
do case
case lnRet=6
select DETAILS
delete for invno=INVOICE.invno
select INVOICE
return .t.
case lnRet=7
return .f.
endcase
----这样,当你确认删除销售发票表的一条记录时,对应的销售明细信息将被自动删除。也许你已经注意到,本例中所示的触发器,其目的是为了维持数据的完整性,其实,如果不需要额外的确认提示,那么在V
FP中维护数据的完整性有更方便的手段,那就是引用完整性构造器。
----4.引用完整性
----保证所有子记录有一个有效的记录的过程被称为引用完整性,这是确保父子表之间关系的关键。
----在Database Designer中右击鼠标打开菜单,选择Referential Integrity,进入引用完整性构造器。该构造器的上部分为一个七列的网格,前两列包含所有父表和子表的名字,中间三列分别显示对更新、删除和插入操作的引用完整性类型,最后两列为关联表的关键字。你可以在网格中选择一行(即选中一种关联),然后为更新、删除和插入操作指定引用完整性的类型。
----构造器下部分的页框给出了分别对应更新、删除 和插入操作的三个页面,每个页面均提供了三种引用完整性类型(Cascade、Restrict或Ignore)的单选按钮。通俗地讲,这三种引用完整性类型的效果分别为:
----Cascade:当父表发生变化时,在所有子记录中作相同的改变。
----Restrict:如果有子记录,不允许改变。
----Ignore:忽略子记录,而只在父记录中修改。
----至此,我们可以极其方便地解决本文开始所提的后五项数据一致性限制要求。例如:当客户信息表的客户编号被修改时,销售发票表的对应客户编号随之改变
----从构造器上部网格中选择父表为Customer并且子表为Invoice关联行的Update列,并在Rules for Updating页面中选中Cas
cade选项,此时, 网格中Update列中的内容应该为Cascade,连续确认后即可。
----其它几项要求的解决方法类似。
----5.几点有益的提示
----虽然VFP的数据字典的功能极强,但它也并非是万能的,因此有必要注意以下几个方面的
问题。
----5.1有效性检测的顺序
----记录有效性规则适所有的记录,并且无论何时增加或修改记录时都被调用。若使用了字段有效性和触发器,则记录有效性规则必须返回一个逻辑值。记录有效性的调用在字段有效性之后,在触发器之前。
----5.2缺省值表达式不能有字段参与
----字段属性中的缺省值表达式在记录创建时调用,而不是在进入字段时。对于"金额=数量*单价