基于Access VBA的成绩查询与打印系统的设计与实现

2009-09-29 08:16刘晓娟
中国教育信息化·基础教育 2009年8期

黄 崑 刘晓娟

摘 要:针对中小学成绩管理的现实需求,本文探讨了基于Access查询对象和VBA编程进行成绩查询与通知单打印管理的系统设计与实现的方案,并重点介绍了采用VBA ADO方法连接和读写数据库的实现原理,以及基于交叉表查询和VBA编程的成绩单打印原理。

关键词:Access;ADO;成绩查询;批量打印;邮件合并

中图分类号:TP311.1 文献标识码:A 文章编号:1673-8454(2009)16-0069-03

一、 问题提出

随着计算机技术与网络技术的快速发展,中小学教务管理工作的信息化建设也具备了更广阔的发展空间。教务管理的信息化建设有助于提高工作效率和管理水平。在中小学的教务管理工作中,学生成绩的管理是非常基础而又相对繁琐的工作之一。为了提高成绩输入、处理、保存与输出的效率,可以借助目前流行的软件和工具实现。从技术层面上看,成绩管理的基础是数据库技术,MS Access就是使用极为普遍的一款桌面型关系数据库管理系统。

本系统主要面向中小学成绩管理的需求,基于Access查询对象和VBA编程设计并实现一个用于增、删、改、查的成绩管理系统,该系统提供以报表和Word文档方式的学生成绩通知单的打印输出功能。本系统主要应用的技术包括Access 交叉表查询、VBA程序设计以及Word邮件合并技术。通过这几种技术的综合运用,实现服务于查询和打印目的的Access、Excel、Word的集成联动系统。

二、 基本思路

为了实现本系统的目标,主要解决以下三方面问题:

(1)多门课程的一次性输入问题:根据成绩关系模型的特点,学生信息、成绩信息与课程信息会独立分成三张数据表进行设计。如果以Access的交互式设计视图创建成绩登记窗体,只能够逐科进行分数的登记,无法一次性输入多门课程。为了解决这一问题,可以采用VBA提供的ActiveX Data Object(简称ADO),它是一个用于存取数据源的COM组件,它提供了编程语言和统一数据访问方式OLE DB的一个中间层。利用ADO可以在代码级实现对数据的批量读取和写入操作。

(2)将关于成绩的交叉表查询结果输出到报表的问题:Access提供数据的报表呈现方式,但前提是将查询结果指定为报表的数据源。然而,交叉表无法被直接指定为窗体、子窗体、报表等对象的数据源,需要进行动态列到固定列的转换。为了解决这一问题,需要结合Access提供的交叉表查询和VBA编程,将交叉表查询的标题属性设置为确定的列数,则其查询结果将转化为固定列方式,之后就可以将交叉表查询结果设置为报表的数据源。

(3)将关于成绩的交叉表查询结果自动输出到自定义Word文档的问题: 鉴于报表在格式设计、文字排版方面不如专门的文字处理软件Word方便、友好,如果可以根据成绩查询结果,将其作为输出的数据源输出到Word文档中,对于用户而言会非常便利。因此,可提前设计好成绩通知单的邮件合并文档,然后将查询结果指定为该文档的数据源。但交叉表查询结果无法被直接用作Word邮件合并的数据源。为了解决这一问题,可以将查询结果转化为Excel文件,再将生成的Excel文件指定为Word邮件合并的数据源。Access VBA编程中提供了Docmd对象,它的OutputTo方法可将交叉表查询结果输出为Excel、RTF等若干种输出格式。然后,再使用Shell函数,启动Word应用程序以最终实现数据输出。

三、 系统的设计

1. 系统功能设计

根据设计目标,本系统主要实现以下功能:

(1) 成绩管理:按照学生、按照科目进行成绩的登记,按照科目进行成绩的修改,对某科成绩或者某位同学的成绩进行删除。

(2) 成绩查询与打印:按照学号、班级编号、姓名进行查询,并可以将查询结果打印输出为报表方式和Word文档方式的成绩通知单。

2. 数据库设计

根据学生与课程之间多对多的选课关系,即一位同学可以选修多门课程,一门课程也可以被多位学生选修,可以得到如图1所示的数据库结构。

四、 系统的实现

1. 成绩管理模块的实现

成绩管理模块的实现主要利用VBA ADO编程实现,基于ADO的数据访问流程一般为:首先在VBE的工程菜单中设置ADO库的引用;然后,建立数据库连接、打开数据集、打开数据库、构造SQL语句、执行SQL语句并更新数据集,最后关闭数据集和数据库完成操作。其中,建立数据库连接的代码为:

Dim SQL As String

Dim connstr As String

Dim conn As ADODB.Connection‘定义数据库连接对象conn

connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurrentProject.Path & "school.mdb" ‘打开指定的数据库文件school.mdb

Set conn = New ADODB.Connection‘初始化数据库连接对象conn

conn.Open connstr ‘打开数据库连接

以成绩登记为例,操作界面如图2所示,登记的流程为:

首先从“班级”组合框中选择班级编号,然后根据班级编号确定学号组合框的学生显示列表。在“班级”组合框的单击事件中添加一段VBA代码,用于指定“学生”组合框中的显示内容。这段代码为:

学号.RowSourceType = "Table/Query"‘设置“学号”组合框的行来源类型

学号.RowSource = "SELECT 学号, 姓名 FROM 学生信息表 WHERE 班级编号=班级"‘设置“学号”组合框的行来源

然后,针对所选择的学生,在随后的八个文本框中输入各门课程的分数,单击命令按钮“保存”,将输入的数据写入数据库。写入的代码为:

For i = 1 To 8

SQL = "INSERT INTO 学生成绩表(课程编号,学号,成绩) VALUES('c10" & i & "','" & 学号.Value & "'," & Me.Controls("txt" & i) & ")"

conn.Execute SQL ‘执行conn的Execute方法,用于执行SQL语句

Next i

对成绩数据进行修改和删除操作,只需修改SQL语句部分,应分别使用Update命令和Delete命令。

2. 成绩查询与打印的实现

成绩查询提供按照班级和学号的成绩查询。在Access中,可以利用交叉表查询快速实现对某位同学各科成绩的数据显示。在查看数据无误后,可以将查询到的一位或者若干位学生的成绩进行打印输出。下面就交叉表查询的实现、单个学生成绩查询与输出、批量输出进行说明,共计要设计1个交叉表查询“按照学号查询学生成绩”,1个窗体“学生成绩打印”。

(1)交叉表查询的实现:在交叉表查询“按照学号查询成绩”的设计视图进行行标题、列标题和值的设计,如图3所示。

鉴于交叉表无法直接用作报表的数据源,需要将交叉表中列标题的属性“列标题”设置为具体的课程名称,以转化为固定列查询。然后就可以将该查询设置为输出报表的数据源,如图3箭头指向的属性表所示。

为了让这一查询可同时满足单个和多个学生成绩查询需求,对学号设置参数查询条件为:

[Forms]![学生成绩打印]![学号] Or Between [Forms]![学生成绩打印]![起始学号] And [Forms]![学生成绩打印]![终止学号]

在交叉表中建立参数查询,要为条件表达式中三个来源于窗体的参数指定数据类型,否则交叉表查询运行时会报错。

(2)单个学生成绩的查询与打印:首先选择班级编号,然后从学生列表中选择某个学生。当仅选班级而还未选学生时,在右边的列表框显示班级所有学生的成绩信息。在选择了某个学生之后,可以对当前选定学生的各科成绩进行打印。

单击“报表打印”命令按钮,利用Docmd对象的OpenReport功能打开已经设计好的报表。这段代码为:

Docmd.OpenReport “学生成绩通知单“

单击“Word文档打印”命令按钮,可以打开预先制作好的邮件合并模板,将当前查询学生的成绩输出到Word文档中。根据前面的分析,需要将交叉表查询结果保存为Excel文件,这段代码为:

DoCmd.OutputTo acOutputQuery, "按照学号查询学生成绩", acFormatXLS, CurrentProject.Path & "学生成绩查询结果.xls", False

然后,调用shell函数自动运行Word邮件合并文档,Word邮件合并文档会自动连接生成的Excel文件。这段代码为:

Call Shell("C:Program Files MicrosoftOfficeOffice12winword. exe" & " " & CurrentProject.Path & "星光中学成绩通知单.doc")

执行后,即可调用Word打开已经制作好的邮件合并文档“星光中学成绩通知单.doc”,该文档的外部数据源已预设为“学生成绩查询结果.xls”文件。报表与Word文档打印的效果如图5所示。

(3)批量打印:批量打印允许根据给定的学号范围进行打印,如图6所示。此前交叉表查询“按照学号查询学生成绩”已经考虑到批量生成的需求。因此,命令按钮“批量打印报表”和 “批量打印Word文档”只需分别在它们的单击事件中调用命令按钮“报表打印”和“Word文档打印”的单击事件,即可完成批量数据的输出。

五、 小结

本系统综合考虑了Access VBA编程与交叉表查询在操纵数据方面各自的特点,并结合报表输出和Word文档输出的特色,将其有机地结合在查询与打印系统中。并且,本系统的开发工具只需要使用Access,相比使用专门的程序开发工具和后台数据库的模式,实现更为简单快捷,满足中小学教师日常成绩的管理和打印需求更加经济有效,提高教师成绩管理工作的效率,促进教务整体的信息化水平。

参考文献:

[1] 李春葆, 曾平. Access数据库程序设计[M].北京:清华大学出版社.2007.

[2] 求是科技.Access信息管理系统开发实例导航[M].北京:人民邮电出版社.2005.

[3] 陈可欣.Access VBA数据库高效开发范例应用[M].北京:中国青年出版社.2005.

(编辑:隗爽)