劉 萍,何 青
(桂林醫(yī)學(xué)院信息中心計算機教研室,廣西 桂林 541004)
醫(yī)學(xué)生“程序設(shè)計”課程教學(xué)中若干問題討論
劉 萍,何 青
(桂林醫(yī)學(xué)院信息中心計算機教研室,廣西 桂林 541004)
由于醫(yī)學(xué)生與工科計算機專業(yè)學(xué)生邏輯思維上的差異,程序設(shè)計對于醫(yī)學(xué)生而言,是較難學(xué)習(xí)的一門課程,在教學(xué)中常常會遇到一些難于理解的問題,使學(xué)生難于準(zhǔn)確掌握及正確使用。本文總結(jié)教學(xué)中出現(xiàn)的若干問題,著重討論了空值Null、BOF和 EOF屬性以及聚合函數(shù)的特點及在程序中的正確使用和教學(xué)方法。
醫(yī)學(xué)生程序設(shè)計教學(xué);空值Null、BOF、EOF屬性;聚合函數(shù);探討
VisualBasic forApplications(簡稱VBA)是新一代標(biāo)準(zhǔn)宏語言,是基于 Visual Basic forW indows發(fā)展而來的。VBA提供了面向?qū)ο蟮某绦蛟O(shè)計方法及相當(dāng)完整的程序設(shè)計語言,對于非計算機專業(yè)的醫(yī)學(xué)生來說易于學(xué)習(xí)和掌握。因此,對于日后在工作中需要經(jīng)常使用Office套裝軟件來解決工作中需要解決的問題的醫(yī)學(xué)大學(xué)生,學(xué)習(xí)VBA程序設(shè)計將有助于使工作自動化,提高工作效率。
所以,從目前高校數(shù)據(jù)庫課程開設(shè)的情況來看,大部分學(xué)校都將 Access數(shù)據(jù)庫系統(tǒng)作為非計算機專業(yè)學(xué)生學(xué)習(xí)的課程之一,同時Access近年來也成為全國高校計算機二級等級考試參考人數(shù)最多的科目之一。為此,我們教研室也為醫(yī)學(xué)生開設(shè)了“Access數(shù)據(jù)庫VBA程序設(shè)計”這門選修課。由于醫(yī)學(xué)生與工科計算機專業(yè)學(xué)生邏輯思維上的差異,如何提高該課程的教學(xué)質(zhì)量和教學(xué)效果,是我們?nèi)握n教師一直探討的問題。由于VBA不是一門獨立的編程語言,是基于VB擴展而來的,它在語法規(guī)則上基本遵循VB的語法,但基于 Access數(shù)據(jù)庫的使用特點,在個別使用上又有其特點。
在VBA中,Null、Empty、和Nothing表示的都是空值,但它們又有所區(qū)別。Nothing:是用于對象變量的,當(dāng)對象變量被設(shè)為 Nothing(set rs=Nothing)時,系統(tǒng)便會釋放該對象所占用的內(nèi)存資源,此時該對象變量指向空對象。Empty:表示的是一個有效空值,當(dāng)一個變量 x被聲明為變體類型而從未賦值時,其值就是 Empty,是由系統(tǒng)自動賦予的,表示變量 x尚未初始化,此時的 x的值可以是數(shù)值型的初始值 0,也可以是字符型的初始值空字串"",此時語句 If x=0 Then或 if x=""Then或 If IsEmpty(x) Then的判斷結(jié)果都為 True。Null:表示的是一個無效數(shù)據(jù),一般用于表示記錄中某字段數(shù)據(jù)暫不確定時的數(shù)據(jù)值,比如,在通過程序添加記錄時,對于某個字段的值暫不確定,就可以用Null來表示。在程序中當(dāng) x=Null時,則表示 x不包含有效數(shù)據(jù),此時的 x的值不能在程序中直接使用。對于值為 Null的數(shù)據(jù)只能通過 IsNull()函數(shù)來判斷,例如:IF Is-Null(x)=true Then,而不能用 If x=Null Then,因為含有 Null值的運算式其結(jié)果永遠(yuǎn)是Null。
空值Null雖然不能在程序中直接使用,但它卻是完全合法的數(shù)據(jù)庫錄入項,我們在編程時不能因為空值Null是無效數(shù)據(jù),在數(shù)據(jù)錄入時就一律拒絕空值,如果完全回避空值,那么,在你創(chuàng)建一條記錄時,如果某個字段的數(shù)據(jù)暫時不確定,就無法創(chuàng)建該記錄。要求所有數(shù)據(jù)都必須是已知的,在實際使用當(dāng)中是不現(xiàn)實的。以醫(yī)院急診室的數(shù)據(jù)庫系統(tǒng)為例,不能因為數(shù)據(jù)錄入時不確定一個急診病人的年齡,系統(tǒng)就拒絕為其創(chuàng)建一條記錄。所以,我們不能完全回避空值,而應(yīng)在實際應(yīng)用中正確認(rèn)識及合理使用空值。
在教學(xué)中,發(fā)現(xiàn)學(xué)生對 Null空值較難理解,可通過一些實例講解使學(xué)生加深對空值的理解。例如:在盤點藥品庫存時,發(fā)現(xiàn)某種藥品用完了,那么在它的數(shù)量一欄里我們應(yīng)該輸入 0,代表這種藥品已盤點過,數(shù)量是 0,而另一種藥品我們還沒來得及清點,數(shù)量暫時未知,那么此時它的數(shù)量一欄是空的,也就是我們所說的空值Null,這種空值告訴我們該藥品的盤點工作尚未完成,數(shù)量暫不確定。通過0和Null的實例比較,我們可以很清楚地看到,0和Null反應(yīng)的是事物的兩種完全不同的狀態(tài)。從而進(jìn)一步加深了對空值Null的正確認(rèn)知,并認(rèn)識到空值是無法避免的,正確的做法就是如何正確處理它們,確保它們不會導(dǎo)致程序錯誤。當(dāng)空值在表達(dá)式中使用之前,可以用 IsNull函數(shù)捕捉空值或用Nz函數(shù)來處理空值,因為空值經(jīng)常會返回錯誤而使程序無法正常運行。
前面討論的Null值不能在程序中直接使用,否則程序會返回出錯信息而使程序無法正常運行。但當(dāng)Null出現(xiàn)在 IF語句的條件表達(dá)式中時,程序不會返回錯誤信息,并且可運行,只是運行結(jié)果不正確。例如下面的程序段,學(xué)生在編程時,由于對于未初始化的文本框控件的Value屬性初始值為Null這一特征的掌握不準(zhǔn)確,時常會誤用其空值Null:
IfMe.賬號="" Or Me.密碼="" Then MsgBox"賬號、密碼不能為空"
ElseIfMe.賬號 <>"1234567"Then
MsgBox"賬號錯誤,請重新輸入"
ElseIfMe.密碼 <>"gyjsj"Then
MsgBox"密碼錯誤,請重新輸入"
Else
MsgBox"登錄成功!"
:
:
End If
在程序首次運行時,如果“賬號”和“密碼”文本框不輸入任何數(shù)據(jù) (即未初始化),此時引用“賬號”、“密碼”文本框的Value屬性為空值 Null,程序運行時不是像程序設(shè)計者預(yù)想的那樣,執(zhí)行MsgBox“賬號、密碼不能為空”語句,也不執(zhí)行MsgBox“賬號錯誤,請重新輸入”和MsgBox“密碼錯誤,請重新輸入”語句,同時又不返回錯誤使用Null值的信息,而是執(zhí)行MsgBox“登錄成功!”語句(此時 if語句的前 3個分支都出現(xiàn)了 Null空值)。雖然教科書明確指出不能在程序中直接使用空值Null,可問題出現(xiàn),老師應(yīng)給學(xué)生一個合理的解釋。那么程序?qū)τ跅l件表達(dá)式出現(xiàn)空值 Null的情況是如何判斷的呢?通過查證Access幫助信息提示是判為 False,假設(shè) 判 斷 為 False,則 Not(Me.賬 號 = ""OrMe.密碼 ="")=True應(yīng)該成立,實際運行情況表明該假設(shè)不成立,程序執(zhí)行結(jié)果仍是運行MsgBox“登錄成功!”。由此可見,程序?qū)τ跅l件表達(dá)式出現(xiàn)空值Null的情況是既不返回錯誤信息,也不判斷為 False。即,不做任何邏輯判斷,而是忽略跳過所有含Null值的條件分支,轉(zhuǎn)入后續(xù)分支判斷執(zhí)行。由于 Null出現(xiàn)在 If語句中程序可運行而系統(tǒng)又不提示出錯信息,使學(xué)生誤用后很難發(fā)現(xiàn)錯誤。所以在教學(xué)中,應(yīng)通過實例詳細(xì)闡述 Null的特點、正確使用及合理規(guī)避,可通過對文本框初始化的方法盡量避免使用 Null空值。也可把第一條語句改為:IF Nz(Me.賬號)=""Or Nz(Me.密碼)= ""Then或 IF Is Null(Me.賬號)=True or IsNull (Me.密碼)=True Then。
在VBA的ADO數(shù)據(jù)庫操作程序中,經(jīng)常會用到 SQL select查詢語句,下面有兩個查詢語句:
Select姓名,年齡 from tEmp where黨員否Select avg(年齡)from tEmp where黨員否
第一條語句的查詢結(jié)果是黨員的姓名,年齡字段數(shù)據(jù)集,如果沒有黨員記錄,則查詢結(jié)果集為 0條記錄。而第二條語句的查詢結(jié)果是黨員的平均年齡,即查詢結(jié)果是一個集函數(shù)返回值,其特點是:無論是否有黨員記錄,結(jié)果集中都會有一條固定的記錄,(該結(jié)論可通過在程序中添加語句:MsgBox rs.RecordCount得到驗證),只是記錄的值不同。當(dāng)有黨員記錄時,集函數(shù)返回值為一個有效的確定值,而當(dāng)無黨員記錄時,集函數(shù)返回值為一個無效的空值Null。下面的程序段是全國計算機二級等級考試的一道程序題:
Private Sub bt_Click()
Dim cn AsNew ADODB.Connection
Dim rsAsNew ADODB.Recordset
Dim strSQL As String
Dim sage As Single
Set cn=CurrentProject.Connection
strSQL="select avg(年齡)from tEmp where黨員否"
rs.Open strSQL,cn,adOpenKeyset,adLock-Optimistic
If rs.EOF Then
MsgBox"無黨員職工的年齡數(shù)據(jù)"
sage=0
Exit Sub
Else
sage=rs.Fields(0)
Me.Text1=sage
End If
:
:
End Sub
在判斷查詢結(jié)果集中是否有黨員平均年齡時,程序使用的方法是用記錄集的 EOF屬性,該屬性當(dāng)記錄集中無記錄時,rs.EOF=TRUE,此方法用于判斷普通字段數(shù)據(jù)查詢結(jié)果集是可以的,但該題判斷的結(jié)果集是一個集函數(shù)返回值,無論黨員條件是否為真都會有一條固定的記錄,既然有記錄,那么其rs.EOF=FALSE。所以當(dāng)模擬無黨員記錄運行該程序時,程序并未按設(shè)計者的想法運行MsgBox"無黨員職工的年齡數(shù)據(jù)"語句,而是運行 sage= rs.Fields(0),同時提示錯誤信息:
因為此時查詢結(jié)果集中的 rs.Fields(0)的值為Null。所以該程序不適合用 rs.EOF來判斷。
解決方法:可以利用查詢結(jié)果集中固定記錄的值的不同來作為判斷條件。為避免使用無效空值Null,可使用 Is Null()函數(shù)來判斷空值,或者用Nz()函數(shù)將無效空值 Null轉(zhuǎn)換為有效值,可將程序改為:
MsgBox"無黨員職工的年齡數(shù)據(jù)"
sage=0
Exit Sub
Else
sage=rs.Fields(0)
Me.Text1=sage
End If
:
:
End sub
此時,無論是否有黨員記錄,程序都能正常運行了。
程序設(shè)計對于非計算機專業(yè)的醫(yī)學(xué)生來說,是較難學(xué)習(xí)和掌握的一門課程,學(xué)習(xí)中常常會遇到一些難以理解和掌握的知識點,而有限的教科書又無從查證,甚至一些輔助教材還會出現(xiàn)一些錯誤內(nèi)容,這就需要我們老師去深入探討及結(jié)合實驗驗證來給學(xué)生作詳細(xì)的講解,從而使學(xué)生能正確認(rèn)知和使用。在以后的教學(xué)中還會遇到很多類似的問題需要我們進(jìn)一步的不斷探討。
[1] 王 晟,韓澤坤.Access數(shù)據(jù)庫開發(fā)經(jīng)典案例解析[M].北京:清華大學(xué)出版社,2006.336-380
[2] 蔣加伏,張林峰.VisualBasic程序設(shè)計教程[M].北京:北京郵電大學(xué)出版社,2004.312-316
[3] 何勝利.Access數(shù)據(jù)庫應(yīng)用技術(shù)教程[M].北京:中國鐵道出版社,2008.182-232
[4] 教育部考試中心.全國計算機等級考試二級教程—Access數(shù)據(jù)庫程序設(shè)計[M].北京:高等教育出版社,2004.247-293
(學(xué)術(shù)編輯:周 敏)
1005-3697(2010)05-0506-03
G642.4
B
2010-07-01