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