看实例学VFP:同时向两个表中添加记录2009-02-28 www.bianceng.cn 老马本文利用这个实例中的知识来制作一个文本式录入表单的简单示例,通过这个表单可以同时向“数据1”数据库中的“网站信息表”和“附加信息表”这两个表中添加记录,并且对录入的数据可以选择“保存”、“添加”或“撤消”。这两个表的索引字段分别是“编号”和“网站编号”,这两个字段的内容是完全相同的,只是分别处于两个表中,并且两个表通过这两个字段发生关联。关于“数据1”数据库的情况已经在一文中给出,这里不再详述。
本例要点:在以前的例子中,我们介绍过可以在“数据环境”中拖动一个表的字段到表单上,系统会自动生成一个标签及一个文本框控件。不过本例要求对录入的数据可以选择“保存”、“添加”或“撤消”等操作,如果也这样设计的话,则录入的数据不管你是否保存了都会写入到表中,原因是文本框是从数据环境中拖动过来而生成的,它们的数据源(ControlSource)已经自动与表中的字段绑定了。这很明显与我们的设计要求不符。所以本例在设计时采取从“表单设计器”上手工向表单中添加文本框等控件,并且将添加上去的各个文本框的ControlSource属性值分别设置为临时表lsb中的字段,在表单的init事件中对“网站信息表”和“附加信息表”进行连接查询并将查询结果输出为临时表lsb。这样表单在启动时各个文本框就会显示临时表lsb当前记录的各个记录的值,同时命令按键“保存”和“取消”不可用,单击“第一条”等记录移动按钮可以依次显示lsb表的各条记录的值,如下图:

单击了“添加”按钮后,这个按钮本身及“第一条”~“最后一条”这四个记录移动按钮不可用,同时各个文本框被清零、等待接收数据,如下图:

此时单击“取消”按钮可以撤消此次操作,单击“保存”按钮后,则对表单上各个文本框的值进行校验,如果都不会空,才会依据表单上文本框的值分别在“网站信息表”和“附加信息表”这两个表中添加一条记录。
制作步骤:一、新建表单,并将其caption属性值设置为“设计文本式录入表单”,AutoCenter属性值设置为.t.,width属性值设置为375,height属性值设置为250,并将表单保存为“设计文本式录入表单.scx”。
补充:建好表单后,需要右击表单选“数据环境”命令,把“网站信息表”和“附加信息表”添加到数据环境中去(或者不使用数据环境、在表单的init事件中把这两个表打开也可以)。写制作过程时忘记写这一点,今天补充一下。二、向表单上添加5个label控件,将这些label控件的AutoSize属性值都设为.t.,caption属性值分别设置为“编号”、“网站名称”、“网站网址”、“网站类型”和“网站描述”。三、向表单上添加5个文本框控件(Text1~Text5),将这5个文本框控件(Text1~Text5)的ControlSource属性值依次设置为“lsb.编号”、“lsb.网站名称”、“lsb.网站网址”、“lsb.网站类型”和“lsb.网站描述”。四、向表单上再添加8个命令按钮控件。五、适当调整各控件的大小及它们在表单上的位置,调整后的表单设计器如下图:

六、将这8个命令按钮控件(command1~command8)的caption属性值依次设置为“第一条”、“上一条”、“下一条”、“最后一条”、“添加”、“保存”、“取消”和“退出”。七、添加事件代码:(一)表单的init事件:
select 网站信息表Select 编号,网站名称,网站网址,网站类型,网站描述; from 网站信息表 Inner Join 附加信息表;on 网站信息表.编号= 附加信息表.网站编号 into cursor lsbthisform.command6.enabled=.f.thisform.command7.enabled=.f.thisform.Text1.value=lsb.编号thisform.Text2.value=lsb.网站名称thisform.Text3.value=lsb.网站网址thisform.Text4.value=lsb.网站类型thisform.Text5.value=lsb.网站描述
(二)“第一条”按钮(command1)的click事件:
if bof()=.f. go topendifthisform.refresh
(三)“上一条”按钮(command2)的click事件:
if bof()=.f. skip -1endifthisform.refresh
(四)“下一条”按钮(command3)的click事件:
if eof()=.f.skipendifthisform.refresh
(五)“最后一条”按钮(command4)的click事件:
if eof()=.f. go bottomendifthisform.refresh
(六)“添加”按钮(command5)的click事件:
thisform.Text1.ControlSource=""thisform.Text2.ControlSource=""thisform.Text3.ControlSource=""thisform.Text4.ControlSource=""thisform.Text5.ControlSource=""thisform.Text1.value=""thisform.Text2.value=""thisform.Text3.value=""thisform.Text4.value=""thisform.Text5.value=""this.enabled=.f.thisform.command1.enabled=.f.thisform.command2.enabled=.f.thisform.command3.enabled=.f.thisform.command4.enabled=.f.thisform.command6.enabled=.t.thisform.command7.enabled=.t.
(七)“保存”按钮(command6)的click事件:
a=alltrim(thisform.Text1.value)b=alltrim(thisform.Text2.value)c=alltrim(thisform.Text3.value)d=alltrim(thisform.Text4.value)e=alltrim(thisform.Text5.value)if empty(a).or.empty(b).or.empty(c).or.empty(d).or.empty(e) messagebox("请输入完整信息") returnendifINSERT INTO 网站信息表; (编号,网站名称,网站网址) VALUES(a,b,c)INSERT INTO 附加信息表; (网站编号,网站类型,网站描述) VALUES(a,d,e)messagebox("保存记录成功!",64,"系统提示")this.enabled=.f.thisform.command7.enabled=.f.thisform.command1.enabled=.t.thisform.command2.enabled=.t.thisform.command3.enabled=.t.thisform.command4.enabled=.t.thisform.command5.enabled=.t.select 网站信息表Select 编号,网站名称,网站网址,网站类型,网站描述 from 网站信息表 Inner Join; 附加信息表 on 网站信息表.编号= 附加信息表.网站编号 into cursor lsbthisform.Text1.ControlSource="lsb.编号"thisform.Text2.ControlSource="lsb.网站名称"thisform.Text3.ControlSource="lsb.网站网址"thisform.Text4.ControlSource="lsb.网站类型"thisform.Text5.ControlSource="lsb.网站描述"thisform.refresh
(八)“取消”按钮(command7)的click事件:
this.enabled=.f.thisform.command6.enabled=.f.thisform.command1.enabled=.t.thisform.command2.enabled=.t.thisform.command3.enabled=.t.thisform.command4.enabled=.t.thisform.command5.enabled=.t.thisform.Text1.ControlSource="lsb.编号"thisform.Text2.ControlSource="lsb.网站名称"thisform.Text3.ControlSource="lsb.网站网址"thisform.Text4.ControlSource="lsb.网站类型"thisform.Text5.ControlSource="lsb.网站描述"thisform.refresh
(九)“退出”按钮(command8)的click事件:thisform.release八、运行“设计文本式录入表单.scx”。本例代码在Win2003+VFP6.0环境下调试通过。