黃 崑 劉曉娟
摘 要:針對中小學成績管理的現(xiàn)實需求,本文探討了基于Access查詢對象和VBA編程進行成績查詢與通知單打印管理的系統(tǒng)設(shè)計與實現(xiàn)的方案,并重點介紹了采用VBA ADO方法連接和讀寫數(shù)據(jù)庫的實現(xiàn)原理,以及基于交叉表查詢和VBA編程的成績單打印原理。
關(guān)鍵詞:Access;ADO;成績查詢;批量打印;郵件合并
中圖分類號:TP311.1 文獻標識碼:A 文章編號:1673-8454(2009)16-0069-03
一、 問題提出
隨著計算機技術(shù)與網(wǎng)絡技術(shù)的快速發(fā)展,中小學教務管理工作的信息化建設(shè)也具備了更廣闊的發(fā)展空間。教務管理的信息化建設(shè)有助于提高工作效率和管理水平。在中小學的教務管理工作中,學生成績的管理是非?;A(chǔ)而又相對繁瑣的工作之一。為了提高成績輸入、處理、保存與輸出的效率,可以借助目前流行的軟件和工具實現(xiàn)。從技術(shù)層面上看,成績管理的基礎(chǔ)是數(shù)據(jù)庫技術(shù),MS Access就是使用極為普遍的一款桌面型關(guān)系數(shù)據(jù)庫管理系統(tǒng)。
本系統(tǒng)主要面向中小學成績管理的需求,基于Access查詢對象和VBA編程設(shè)計并實現(xiàn)一個用于增、刪、改、查的成績管理系統(tǒng),該系統(tǒng)提供以報表和Word文檔方式的學生成績通知單的打印輸出功能。本系統(tǒng)主要應用的技術(shù)包括Access 交叉表查詢、VBA程序設(shè)計以及Word郵件合并技術(shù)。通過這幾種技術(shù)的綜合運用,實現(xiàn)服務于查詢和打印目的的Access、Excel、Word的集成聯(lián)動系統(tǒng)。
二、 基本思路
為了實現(xiàn)本系統(tǒng)的目標,主要解決以下三方面問題:
(1)多門課程的一次性輸入問題:根據(jù)成績關(guān)系模型的特點,學生信息、成績信息與課程信息會獨立分成三張數(shù)據(jù)表進行設(shè)計。如果以Access的交互式設(shè)計視圖創(chuàng)建成績登記窗體,只能夠逐科進行分數(shù)的登記,無法一次性輸入多門課程。為了解決這一問題,可以采用VBA提供的ActiveX Data Object(簡稱ADO),它是一個用于存取數(shù)據(jù)源的COM組件,它提供了編程語言和統(tǒng)一數(shù)據(jù)訪問方式OLE DB的一個中間層。利用ADO可以在代碼級實現(xiàn)對數(shù)據(jù)的批量讀取和寫入操作。
(2)將關(guān)于成績的交叉表查詢結(jié)果輸出到報表的問題:Access提供數(shù)據(jù)的報表呈現(xiàn)方式,但前提是將查詢結(jié)果指定為報表的數(shù)據(jù)源。然而,交叉表無法被直接指定為窗體、子窗體、報表等對象的數(shù)據(jù)源,需要進行動態(tài)列到固定列的轉(zhuǎn)換。為了解決這一問題,需要結(jié)合Access提供的交叉表查詢和VBA編程,將交叉表查詢的標題屬性設(shè)置為確定的列數(shù),則其查詢結(jié)果將轉(zhuǎn)化為固定列方式,之后就可以將交叉表查詢結(jié)果設(shè)置為報表的數(shù)據(jù)源。
(3)將關(guān)于成績的交叉表查詢結(jié)果自動輸出到自定義Word文檔的問題: 鑒于報表在格式設(shè)計、文字排版方面不如專門的文字處理軟件Word方便、友好,如果可以根據(jù)成績查詢結(jié)果,將其作為輸出的數(shù)據(jù)源輸出到Word文檔中,對于用戶而言會非常便利。因此,可提前設(shè)計好成績通知單的郵件合并文檔,然后將查詢結(jié)果指定為該文檔的數(shù)據(jù)源。但交叉表查詢結(jié)果無法被直接用作Word郵件合并的數(shù)據(jù)源。為了解決這一問題,可以將查詢結(jié)果轉(zhuǎn)化為Excel文件,再將生成的Excel文件指定為Word郵件合并的數(shù)據(jù)源。Access VBA編程中提供了Docmd對象,它的OutputTo方法可將交叉表查詢結(jié)果輸出為Excel、RTF等若干種輸出格式。然后,再使用Shell函數(shù),啟動Word應用程序以最終實現(xiàn)數(shù)據(jù)輸出。
三、 系統(tǒng)的設(shè)計
1. 系統(tǒng)功能設(shè)計
根據(jù)設(shè)計目標,本系統(tǒng)主要實現(xiàn)以下功能:
(1) 成績管理:按照學生、按照科目進行成績的登記,按照科目進行成績的修改,對某科成績或者某位同學的成績進行刪除。
(2) 成績查詢與打印:按照學號、班級編號、姓名進行查詢,并可以將查詢結(jié)果打印輸出為報表方式和Word文檔方式的成績通知單。
2. 數(shù)據(jù)庫設(shè)計
根據(jù)學生與課程之間多對多的選課關(guān)系,即一位同學可以選修多門課程,一門課程也可以被多位學生選修,可以得到如圖1所示的數(shù)據(jù)庫結(jié)構(gòu)。
四、 系統(tǒng)的實現(xiàn)
1. 成績管理模塊的實現(xiàn)
成績管理模塊的實現(xiàn)主要利用VBA ADO編程實現(xiàn),基于ADO的數(shù)據(jù)訪問流程一般為:首先在VBE的工程菜單中設(shè)置ADO庫的引用;然后,建立數(shù)據(jù)庫連接、打開數(shù)據(jù)集、打開數(shù)據(jù)庫、構(gòu)造SQL語句、執(zhí)行SQL語句并更新數(shù)據(jù)集,最后關(guān)閉數(shù)據(jù)集和數(shù)據(jù)庫完成操作。其中,建立數(shù)據(jù)庫連接的代碼為:
Dim SQL As String
Dim connstr As String
Dim conn As ADODB.Connection‘定義數(shù)據(jù)庫連接對象conn
connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurrentProject.Path & "school.mdb" ‘打開指定的數(shù)據(jù)庫文件school.mdb
Set conn = New ADODB.Connection‘初始化數(shù)據(jù)庫連接對象conn
conn.Open connstr ‘打開數(shù)據(jù)庫連接
以成績登記為例,操作界面如圖2所示,登記的流程為:
首先從“班級”組合框中選擇班級編號,然后根據(jù)班級編號確定學號組合框的學生顯示列表。在“班級”組合框的單擊事件中添加一段VBA代碼,用于指定“學生”組合框中的顯示內(nèi)容。這段代碼為:
學號.RowSourceType = "Table/Query"‘設(shè)置“學號”組合框的行來源類型
學號.RowSource = "SELECT 學號, 姓名 FROM 學生信息表 WHERE 班級編號=班級"‘設(shè)置“學號”組合框的行來源
然后,針對所選擇的學生,在隨后的八個文本框中輸入各門課程的分數(shù),單擊命令按鈕“保存”,將輸入的數(shù)據(jù)寫入數(shù)據(jù)庫。寫入的代碼為:
For i = 1 To 8
SQL = "INSERT INTO 學生成績表(課程編號,學號,成績) VALUES('c10" & i & "','" & 學號.Value & "'," & Me.Controls("txt" & i) & ")"
conn.Execute SQL ‘執(zhí)行conn的Execute方法,用于執(zhí)行SQL語句
Next i
對成績數(shù)據(jù)進行修改和刪除操作,只需修改SQL語句部分,應分別使用Update命令和Delete命令。
2. 成績查詢與打印的實現(xiàn)
成績查詢提供按照班級和學號的成績查詢。在Access中,可以利用交叉表查詢快速實現(xiàn)對某位同學各科成績的數(shù)據(jù)顯示。在查看數(shù)據(jù)無誤后,可以將查詢到的一位或者若干位學生的成績進行打印輸出。下面就交叉表查詢的實現(xiàn)、單個學生成績查詢與輸出、批量輸出進行說明,共計要設(shè)計1個交叉表查詢“按照學號查詢學生成績”,1個窗體“學生成績打印”。
(1)交叉表查詢的實現(xiàn):在交叉表查詢“按照學號查詢成績”的設(shè)計視圖進行行標題、列標題和值的設(shè)計,如圖3所示。
鑒于交叉表無法直接用作報表的數(shù)據(jù)源,需要將交叉表中列標題的屬性“列標題”設(shè)置為具體的課程名稱,以轉(zhuǎn)化為固定列查詢。然后就可以將該查詢設(shè)置為輸出報表的數(shù)據(jù)源,如圖3箭頭指向的屬性表所示。
為了讓這一查詢可同時滿足單個和多個學生成績查詢需求,對學號設(shè)置參數(shù)查詢條件為:
[Forms]![學生成績打印]![學號] Or Between [Forms]![學生成績打印]![起始學號] And [Forms]![學生成績打印]![終止學號]
在交叉表中建立參數(shù)查詢,要為條件表達式中三個來源于窗體的參數(shù)指定數(shù)據(jù)類型,否則交叉表查詢運行時會報錯。
(2)單個學生成績的查詢與打印:首先選擇班級編號,然后從學生列表中選擇某個學生。當僅選班級而還未選學生時,在右邊的列表框顯示班級所有學生的成績信息。在選擇了某個學生之后,可以對當前選定學生的各科成績進行打印。
單擊“報表打印”命令按鈕,利用Docmd對象的OpenReport功能打開已經(jīng)設(shè)計好的報表。這段代碼為:
Docmd.OpenReport “學生成績通知單“
單擊“Word文檔打印”命令按鈕,可以打開預先制作好的郵件合并模板,將當前查詢學生的成績輸出到Word文檔中。根據(jù)前面的分析,需要將交叉表查詢結(jié)果保存為Excel文件,這段代碼為:
DoCmd.OutputTo acOutputQuery, "按照學號查詢學生成績", acFormatXLS, CurrentProject.Path & "學生成績查詢結(jié)果.xls", False
然后,調(diào)用shell函數(shù)自動運行Word郵件合并文檔,Word郵件合并文檔會自動連接生成的Excel文件。這段代碼為:
Call Shell("C:Program Files MicrosoftOfficeOffice12winword. exe" & " " & CurrentProject.Path & "星光中學成績通知單.doc")
執(zhí)行后,即可調(diào)用Word打開已經(jīng)制作好的郵件合并文檔“星光中學成績通知單.doc”,該文檔的外部數(shù)據(jù)源已預設(shè)為“學生成績查詢結(jié)果.xls”文件。報表與Word文檔打印的效果如圖5所示。
(3)批量打印:批量打印允許根據(jù)給定的學號范圍進行打印,如圖6所示。此前交叉表查詢“按照學號查詢學生成績”已經(jīng)考慮到批量生成的需求。因此,命令按鈕“批量打印報表”和 “批量打印Word文檔”只需分別在它們的單擊事件中調(diào)用命令按鈕“報表打印”和“Word文檔打印”的單擊事件,即可完成批量數(shù)據(jù)的輸出。
五、 小結(jié)
本系統(tǒng)綜合考慮了Access VBA編程與交叉表查詢在操縱數(shù)據(jù)方面各自的特點,并結(jié)合報表輸出和Word文檔輸出的特色,將其有機地結(jié)合在查詢與打印系統(tǒng)中。并且,本系統(tǒng)的開發(fā)工具只需要使用Access,相比使用專門的程序開發(fā)工具和后臺數(shù)據(jù)庫的模式,實現(xiàn)更為簡單快捷,滿足中小學教師日常成績的管理和打印需求更加經(jīng)濟有效,提高教師成績管理工作的效率,促進教務整體的信息化水平。
參考文獻:
[1] 李春葆, 曾平. Access數(shù)據(jù)庫程序設(shè)計[M].北京:清華大學出版社.2007.
[2] 求是科技.Access信息管理系統(tǒng)開發(fā)實例導航[M].北京:人民郵電出版社.2005.
[3] 陳可欣.Access VBA數(shù)據(jù)庫高效開發(fā)范例應用[M].北京:中國青年出版社.2005.
(編輯:隗爽)