论文部分内容阅读
摘 要:本文针对非计算机专业人员学习ACCESS程序设计的特点,阐述了数据窗体设计的基本技术,旨在用尽可能简便的手段设计出满足一般数据操纵需要的窗体,以便快速构建基本的应用模型,供学习者和教学者作参考。
关键词:ACCESS编程;数据窗体;记录源;数据操纵
ACCESS数据库管理系统是一个适合用户自行快速构建小型桌面管理信息系统的有效工具。数据窗体设计是ACCESS程序设计的主要部份。当窗体指定了记录源(RecordSource)属性的值后,记录源的字段值就可通过窗体主体上的各种数据控件显示出来,称这类窗体称为数据窗体。数据窗体设计的主要任务是根据用户的需求构建一个方便安全的对数据库数据进行数据操纵的界面,数据操纵包括对记录进行查询、添加、更新和删除。学会使用简捷、明了的手段快速构建数据窗体是快速构建应用原型的根本。
若能在窗体中得心应手地显示表中记录并反映记录间的相关关系,那么再加以对记录的筛选功能和定位功能就能实现对数据的查询;在实现了查询的基础上再加上一些控制功能就可实现对数据的添加、更改和删除。
1.显示记录的窗体
显示记录的窗体有纵栏式、表格式、数据表式和主/子窗体式四类。各类窗体的用途是:一次仅显示一条记录用纵栏式窗体;一次显示多条记录可用表格式窗体、数据表式窗体或主/子窗体式窗体(记录显示在子窗体,主窗体无记录源);要显示主/子相关表的记录用主/子窗体式窗体(主窗体显示主表记录,子窗体显示子表中与主窗体当前记录相关的记录)。
这几种窗体的设计用向导生成比较快速方便。如果是在设计视图下设计,注意窗体的类型(纵栏式、表格式、数据表式等)由窗体的“默认视图”属性决定。主/子窗体式窗体则是在一个纵栏式窗体中添加子窗体控件,然后在子窗体控件的“源对象”属性中加入一个数据表式窗体或表格式窗体构成。如果子窗体的源对象与主窗体的记录源有关联,还要在“连接主表”与“连接子表”的属性中设置连接字段。
引用和控制数据窗体的记录源属性是非常重要的。如果窗体或子窗体的记录源(RecordSource)属性用Selecte命令来充当,则可以显示多表连接以及分组统计等凡Select命令可实现的查询结果,还可以动态地改变此属性的值来实现对记录的筛选。在程序中引用引用本窗体的属性用:Me.属性名;引用本窗体的子窗体的属性用:Me.子窗体控件名.Form.属性名;引用另一个打开的窗体的属性用:form_窗体名.属性名。例如:引用本窗体的记录源属性用:Me.RecordSource;引用本窗体的子窗体的记录源属性用:Me.子窗体控件名.Form.RecourdSource;引用另一个已打开窗体的记录源属性用:Form_窗体名.RecordSource;引用另一个打开的窗体的子窗体的记录源属性用:Form_窗体名.子窗体控件名.Form.RecordSource
2.窗体中定位和查找记录的命令按钮
按顺序定位记录和按条件定位记录是最基本的记录定位手段,ACCESS已经提供了一些方便的功能,例如使用导航器或用向导生成记录导航命令按钮来实现。但是记住下面两条宏命令的用法有利于设计更具个性化的记录导航按钮,且在后续的编程中也会经常用到。
(1)按序定位记录的宏命令(GoToRecord)
例如:DoCmd.GoToRcord,,acNext
该命令定位至下一条记录。参数acNext还可以换成acPrevious、acFast、acLast和acNewRec分别表示定位到上一记录、首记录、尾记录和新的缓冲记录。
(2)按条件定位记录的宏命令(FindRecord)
在执行FindRecord宏命令前必须让显示要查找的那个字段的控件获得焦点。例如名为TextName的文本框绑定在记录源的姓名字段上,若要查找定位第一个姓“张”的记录,代码如下:
name="张"
Me.TextName.SetFocus
DoCmd.FindRecord name & "*",,,,,,True
如果要从当前记录向下找下一个姓张的记录,把最后一个参数True换成False。其它缺省的参数的用法见ACCESS帮助文档。
3.记录筛选
在窗体上进行记录筛选的原理很简单,就是根据筛选条件构建一条SQL查询命令文本赋值给窗体的记录源属性既可。实际应用中一般是安排一些控件(常用的有文本框、组合框等)接收用户输入筛选条件的关键数据,然后根据这些数据构成含筛选条件的SELECT命令文本赋值给窗体的记录源属性。例如将产地值存于变量place中,类别值存于class中,下面代码对本窗体中的一个child0子窗体的记录源进行筛选,筛出属于该产地该类别的商品记录:
Sqltxt="selecte * from商品 where产地= '"& place & "'and类别='"& "'"
Me.Child0.Form.RecordSource=sqltxt
Me.Child0.Form.ReQuery
第一行构建SQL命令文本,注意那些单引号和双引号的用法;第二行代码将命令文本赋值给子窗体的记录源属性;有些版本的ACCESS并不会及时改变原来已显示的记录,而需要第三行代码使子窗体以新的记录源重新从数据库抽取记录。
4.记录的更改与删除
记录的更改与删除有两种方法:第一种是按排一些控件接收用户输入的对表记录进行选择的条件及更新数据,通过执行SQL命令的宏实现对符合选择条件的记录进行更新及删除。第二种是设计相应的窗体让用户在窗体上直观地进行手工操作。
上述的第二种方法是在显示数据的体中设计一些对记录进行筛选及定位的控件,再配合用向导生成的记录操作命令按钮,就可实现对记录的更新及删除操作了。
此外若要设置窗体(或子窗体)中的记录是否可以更改或删除,可静态或动态地将窗体(或子窗体)的允许编辑(AllowEditions)和允许删除(AllowDeletions)属性的值设为True或False来控制;若仅需控制某些字段的值是否可以更改,可以将显示这些字段的控件的锁定(Lock)属性的值设为False或True来实现。
5.添加记录
(1)利用窗体的新缓冲新记录进行添加
该方案原理是当窗体的允许添加(AllowAdditions)属性值为True时窗体上记录的尾部总会出现一条空的缓冲记录供用户输入新增记录的内容,如果不输入任何内容该空记录是不会保存到表中的。但有时要求新添记录的一部份字段值由程序控制产生,另一部份才由用户输入,这就要作如下处理:
最初将窗体的的允许添加(AllowAdditions)属性值设为是(False),当要添加记录时通过事件驱动执行下面算法的代码:
Me.AllowAdditions=True
DoCmd.GoToRecord ,,acNewRec
计算出要赋值字段的值赋给相应字段所绑定的控件
Me. AllowAdditions=False
让需要用户输入的第一个字段所绑定的控件获得焦点
注意其中的第2行很重要,将记录定位在新的缓冲记录上才能保证新值赋到新记录上。这种方法用来程控产生新记录的主键值、外键值以及一些有特定编码规则的字段值很有效,可以避免由用户手工编码造成违背主键规则、参照完整性规则及其它的约束规则的情况。
(2)通过SQL_ Insert into命令添加
在窗体上安排一些控件来接收用户输入的新记录,对新记录进行预处理后构建一条添加记录的SQL命令文本,再用宏命令RunSQL执行该SQL命令把记录添加到表中。例如把新职工的姓名和性别值分别输入到文本框Textname和Textsex中,若输入的姓名非空且性别是“男”或“女”则将该记录添加到职工表中。代码如下:
If TextName<>"" and (TextSex="男"or TextSex="女") Then
Sqltext="Insert into职工(姓名,性别) select '"& textname & "','"& textsex & "'"
DoCmd.RunSQL(sqltext)
Msgbox("记录已添加")
Else
Msgbox("输入错误,未能添加")
Endif
6.读取及检测表中的数据
程序中经常需要读出表中的某项数据进行分析判别,譬如取出某记录的某一字段的值、取出表中的某类统计数、检测表是否存在符合某一条件的记录等。ACCESS提供了一组称为域函数的标准函数来实现这一功能。这些域函数是:Dlookup()、Davg()、Dcount()、Dsum()、Dmax()、Dmin()。它们的具体功能及用法可查阅ACCESS帮助文档。
例如:要从库存商品表中取出商品编号为“40001021”的商品的数量可用函数:Dlookup("数量","库存商品","商品编号='40001021'");若要从学生表中取出民族为“回族”的人数可用函数:Dcount("*","学生","民族='回族'");若要判断学生表中是否存在记录可根据函数Dcount("*","学生")的值是否为0来判断。
7.错误跟踪处理及数据类型检测
判断用户输入的数据是否符合某种数据类型的格式是经常要做的工作,编程的方法也很多,要求熟习字符串处理的运算及函数,但使用VAB的错误跟踪处理程序是最简单实用的手段。错误跟踪处理(On Error GoTo)及处理后的程序恢复运行语句(Resume)的配合使用,可以在程序运行中发生错误时进行相应的处理而不至于终止。当用向导生成一个指定功能的命令按钮后,在其自动生成的单击事件过程中可以看到这种错误跟踪处理程序在事件过程中的一种用例。下面是一个名为command0的命令按钮的单击事件过程中的错误跟踪代码的格式:
Private Sub Command0_Click()
On Error GoTo Err_Command0_Click
……
Exit_Command0_Click:
Exit Sub
Err_Command0_Click:
MsgBox Err.Description
Resume Exit_Command0_Click
End Sub
说明:第1行和最后行为过程的开始和结束;省略号部份为正式过程体代码;第2行的On Error GoTo语句设置当发生错误时转到Err_Command0_Click标号处去执行程序;而Err_Command0_Click标号处的函数MsgBox Err.Description用信息框显示Err.Description(错误对象的错误描述属性)的值,随后的Resume Exit_Command0_Click语句指定从标号Exit_Command0_Click处恢复程序运行;而Resume Exit_Command0_Click标号处的语句Exit Sub则是结束过程。
如果要检测用户向某个控件中输入的值是否符合某种数据类型的格式,可以在安排了错误跟踪的过程体中将该控件的值直接赋给一个该类型的变量即可,因为如果出错的话错误跟踪代码会去处理。
8.报表对象的记录源控制
数据窗体筛选出来的记录常常需要送报表打印。一般的书籍对报表对象的设计都讲述得很好,这里主要谈谈从窗体中运行一个报表时如何把控制报表记录源的选择条件传递给报表对象。
方法1:报表的记录源属性使用SQL_Seledt命令,其选择条件引用窗体的控件值或通用段定义的public变量值。例如一个名为win_1的窗体上的名为combox1的组合框控件中选中了一个年份值,要求报表对象能由销售明细表中输出该年份的销售清单,则报表的记录源可用命令文本:Select * from销售明细 where年=form_win_1.combox1.text
方法2:设计一个表作为报表的记录源,在窗体中调用该报表之前通过执行SQL命令的宏命令清空这个表,然后将需要的数据添加到这个表中再运行报表。
最后要记住运行报表的宏命令是:Docmd.OpenReport参数表
掌握前面所述的各类数据窗体的设计方法及调用报表的方法已经可以解决一般的常见数据操纵问题,设计出基本的系统模块。由于SQL的数据操纵命令不能对表中记录进行逐条访问处理,因而不能实现更高要求的数据统计和数据处理工作,为了实现这种处理可以过一步学习用于数据库存取的ADO(Active Data Object)对象的应用。通过ADO对象不但可以灵活地访问本数据库,还可以访问本数据库以处的其它数据库。
参考文献:
[1]数据库基础与ACCESS应用》陈恭和,高等教育出版社。
[2]CESS数据库程序设计》刘刚,陈克明,清华大学出版社。
关键词:ACCESS编程;数据窗体;记录源;数据操纵
ACCESS数据库管理系统是一个适合用户自行快速构建小型桌面管理信息系统的有效工具。数据窗体设计是ACCESS程序设计的主要部份。当窗体指定了记录源(RecordSource)属性的值后,记录源的字段值就可通过窗体主体上的各种数据控件显示出来,称这类窗体称为数据窗体。数据窗体设计的主要任务是根据用户的需求构建一个方便安全的对数据库数据进行数据操纵的界面,数据操纵包括对记录进行查询、添加、更新和删除。学会使用简捷、明了的手段快速构建数据窗体是快速构建应用原型的根本。
若能在窗体中得心应手地显示表中记录并反映记录间的相关关系,那么再加以对记录的筛选功能和定位功能就能实现对数据的查询;在实现了查询的基础上再加上一些控制功能就可实现对数据的添加、更改和删除。
1.显示记录的窗体
显示记录的窗体有纵栏式、表格式、数据表式和主/子窗体式四类。各类窗体的用途是:一次仅显示一条记录用纵栏式窗体;一次显示多条记录可用表格式窗体、数据表式窗体或主/子窗体式窗体(记录显示在子窗体,主窗体无记录源);要显示主/子相关表的记录用主/子窗体式窗体(主窗体显示主表记录,子窗体显示子表中与主窗体当前记录相关的记录)。
这几种窗体的设计用向导生成比较快速方便。如果是在设计视图下设计,注意窗体的类型(纵栏式、表格式、数据表式等)由窗体的“默认视图”属性决定。主/子窗体式窗体则是在一个纵栏式窗体中添加子窗体控件,然后在子窗体控件的“源对象”属性中加入一个数据表式窗体或表格式窗体构成。如果子窗体的源对象与主窗体的记录源有关联,还要在“连接主表”与“连接子表”的属性中设置连接字段。
引用和控制数据窗体的记录源属性是非常重要的。如果窗体或子窗体的记录源(RecordSource)属性用Selecte命令来充当,则可以显示多表连接以及分组统计等凡Select命令可实现的查询结果,还可以动态地改变此属性的值来实现对记录的筛选。在程序中引用引用本窗体的属性用:Me.属性名;引用本窗体的子窗体的属性用:Me.子窗体控件名.Form.属性名;引用另一个打开的窗体的属性用:form_窗体名.属性名。例如:引用本窗体的记录源属性用:Me.RecordSource;引用本窗体的子窗体的记录源属性用:Me.子窗体控件名.Form.RecourdSource;引用另一个已打开窗体的记录源属性用:Form_窗体名.RecordSource;引用另一个打开的窗体的子窗体的记录源属性用:Form_窗体名.子窗体控件名.Form.RecordSource
2.窗体中定位和查找记录的命令按钮
按顺序定位记录和按条件定位记录是最基本的记录定位手段,ACCESS已经提供了一些方便的功能,例如使用导航器或用向导生成记录导航命令按钮来实现。但是记住下面两条宏命令的用法有利于设计更具个性化的记录导航按钮,且在后续的编程中也会经常用到。
(1)按序定位记录的宏命令(GoToRecord)
例如:DoCmd.GoToRcord,,acNext
该命令定位至下一条记录。参数acNext还可以换成acPrevious、acFast、acLast和acNewRec分别表示定位到上一记录、首记录、尾记录和新的缓冲记录。
(2)按条件定位记录的宏命令(FindRecord)
在执行FindRecord宏命令前必须让显示要查找的那个字段的控件获得焦点。例如名为TextName的文本框绑定在记录源的姓名字段上,若要查找定位第一个姓“张”的记录,代码如下:
name="张"
Me.TextName.SetFocus
DoCmd.FindRecord name & "*",,,,,,True
如果要从当前记录向下找下一个姓张的记录,把最后一个参数True换成False。其它缺省的参数的用法见ACCESS帮助文档。
3.记录筛选
在窗体上进行记录筛选的原理很简单,就是根据筛选条件构建一条SQL查询命令文本赋值给窗体的记录源属性既可。实际应用中一般是安排一些控件(常用的有文本框、组合框等)接收用户输入筛选条件的关键数据,然后根据这些数据构成含筛选条件的SELECT命令文本赋值给窗体的记录源属性。例如将产地值存于变量place中,类别值存于class中,下面代码对本窗体中的一个child0子窗体的记录源进行筛选,筛出属于该产地该类别的商品记录:
Sqltxt="selecte * from商品 where产地= '"& place & "'and类别='"& "'"
Me.Child0.Form.RecordSource=sqltxt
Me.Child0.Form.ReQuery
第一行构建SQL命令文本,注意那些单引号和双引号的用法;第二行代码将命令文本赋值给子窗体的记录源属性;有些版本的ACCESS并不会及时改变原来已显示的记录,而需要第三行代码使子窗体以新的记录源重新从数据库抽取记录。
4.记录的更改与删除
记录的更改与删除有两种方法:第一种是按排一些控件接收用户输入的对表记录进行选择的条件及更新数据,通过执行SQL命令的宏实现对符合选择条件的记录进行更新及删除。第二种是设计相应的窗体让用户在窗体上直观地进行手工操作。
上述的第二种方法是在显示数据的体中设计一些对记录进行筛选及定位的控件,再配合用向导生成的记录操作命令按钮,就可实现对记录的更新及删除操作了。
此外若要设置窗体(或子窗体)中的记录是否可以更改或删除,可静态或动态地将窗体(或子窗体)的允许编辑(AllowEditions)和允许删除(AllowDeletions)属性的值设为True或False来控制;若仅需控制某些字段的值是否可以更改,可以将显示这些字段的控件的锁定(Lock)属性的值设为False或True来实现。
5.添加记录
(1)利用窗体的新缓冲新记录进行添加
该方案原理是当窗体的允许添加(AllowAdditions)属性值为True时窗体上记录的尾部总会出现一条空的缓冲记录供用户输入新增记录的内容,如果不输入任何内容该空记录是不会保存到表中的。但有时要求新添记录的一部份字段值由程序控制产生,另一部份才由用户输入,这就要作如下处理:
最初将窗体的的允许添加(AllowAdditions)属性值设为是(False),当要添加记录时通过事件驱动执行下面算法的代码:
Me.AllowAdditions=True
DoCmd.GoToRecord ,,acNewRec
计算出要赋值字段的值赋给相应字段所绑定的控件
Me. AllowAdditions=False
让需要用户输入的第一个字段所绑定的控件获得焦点
注意其中的第2行很重要,将记录定位在新的缓冲记录上才能保证新值赋到新记录上。这种方法用来程控产生新记录的主键值、外键值以及一些有特定编码规则的字段值很有效,可以避免由用户手工编码造成违背主键规则、参照完整性规则及其它的约束规则的情况。
(2)通过SQL_ Insert into命令添加
在窗体上安排一些控件来接收用户输入的新记录,对新记录进行预处理后构建一条添加记录的SQL命令文本,再用宏命令RunSQL执行该SQL命令把记录添加到表中。例如把新职工的姓名和性别值分别输入到文本框Textname和Textsex中,若输入的姓名非空且性别是“男”或“女”则将该记录添加到职工表中。代码如下:
If TextName<>"" and (TextSex="男"or TextSex="女") Then
Sqltext="Insert into职工(姓名,性别) select '"& textname & "','"& textsex & "'"
DoCmd.RunSQL(sqltext)
Msgbox("记录已添加")
Else
Msgbox("输入错误,未能添加")
Endif
6.读取及检测表中的数据
程序中经常需要读出表中的某项数据进行分析判别,譬如取出某记录的某一字段的值、取出表中的某类统计数、检测表是否存在符合某一条件的记录等。ACCESS提供了一组称为域函数的标准函数来实现这一功能。这些域函数是:Dlookup()、Davg()、Dcount()、Dsum()、Dmax()、Dmin()。它们的具体功能及用法可查阅ACCESS帮助文档。
例如:要从库存商品表中取出商品编号为“40001021”的商品的数量可用函数:Dlookup("数量","库存商品","商品编号='40001021'");若要从学生表中取出民族为“回族”的人数可用函数:Dcount("*","学生","民族='回族'");若要判断学生表中是否存在记录可根据函数Dcount("*","学生")的值是否为0来判断。
7.错误跟踪处理及数据类型检测
判断用户输入的数据是否符合某种数据类型的格式是经常要做的工作,编程的方法也很多,要求熟习字符串处理的运算及函数,但使用VAB的错误跟踪处理程序是最简单实用的手段。错误跟踪处理(On Error GoTo)及处理后的程序恢复运行语句(Resume)的配合使用,可以在程序运行中发生错误时进行相应的处理而不至于终止。当用向导生成一个指定功能的命令按钮后,在其自动生成的单击事件过程中可以看到这种错误跟踪处理程序在事件过程中的一种用例。下面是一个名为command0的命令按钮的单击事件过程中的错误跟踪代码的格式:
Private Sub Command0_Click()
On Error GoTo Err_Command0_Click
……
Exit_Command0_Click:
Exit Sub
Err_Command0_Click:
MsgBox Err.Description
Resume Exit_Command0_Click
End Sub
说明:第1行和最后行为过程的开始和结束;省略号部份为正式过程体代码;第2行的On Error GoTo语句设置当发生错误时转到Err_Command0_Click标号处去执行程序;而Err_Command0_Click标号处的函数MsgBox Err.Description用信息框显示Err.Description(错误对象的错误描述属性)的值,随后的Resume Exit_Command0_Click语句指定从标号Exit_Command0_Click处恢复程序运行;而Resume Exit_Command0_Click标号处的语句Exit Sub则是结束过程。
如果要检测用户向某个控件中输入的值是否符合某种数据类型的格式,可以在安排了错误跟踪的过程体中将该控件的值直接赋给一个该类型的变量即可,因为如果出错的话错误跟踪代码会去处理。
8.报表对象的记录源控制
数据窗体筛选出来的记录常常需要送报表打印。一般的书籍对报表对象的设计都讲述得很好,这里主要谈谈从窗体中运行一个报表时如何把控制报表记录源的选择条件传递给报表对象。
方法1:报表的记录源属性使用SQL_Seledt命令,其选择条件引用窗体的控件值或通用段定义的public变量值。例如一个名为win_1的窗体上的名为combox1的组合框控件中选中了一个年份值,要求报表对象能由销售明细表中输出该年份的销售清单,则报表的记录源可用命令文本:Select * from销售明细 where年=form_win_1.combox1.text
方法2:设计一个表作为报表的记录源,在窗体中调用该报表之前通过执行SQL命令的宏命令清空这个表,然后将需要的数据添加到这个表中再运行报表。
最后要记住运行报表的宏命令是:Docmd.OpenReport参数表
掌握前面所述的各类数据窗体的设计方法及调用报表的方法已经可以解决一般的常见数据操纵问题,设计出基本的系统模块。由于SQL的数据操纵命令不能对表中记录进行逐条访问处理,因而不能实现更高要求的数据统计和数据处理工作,为了实现这种处理可以过一步学习用于数据库存取的ADO(Active Data Object)对象的应用。通过ADO对象不但可以灵活地访问本数据库,还可以访问本数据库以处的其它数据库。
参考文献:
[1]数据库基础与ACCESS应用》陈恭和,高等教育出版社。
[2]CESS数据库程序设计》刘刚,陈克明,清华大学出版社。