劉 萍,何 青
(桂林醫學院信息中心計算機教研室,廣西 桂林 541004)
醫學生“程序設計”課程教學中若干問題討論
劉 萍,何 青
(桂林醫學院信息中心計算機教研室,廣西 桂林 541004)
由于醫學生與工科計算機專業學生邏輯思維上的差異,程序設計對于醫學生而言,是較難學習的一門課程,在教學中常常會遇到一些難于理解的問題,使學生難于準確掌握及正確使用。本文總結教學中出現的若干問題,著重討論了空值Null、BOF和 EOF屬性以及聚合函數的特點及在程序中的正確使用和教學方法。
醫學生程序設計教學;空值Null、BOF、EOF屬性;聚合函數;探討
VisualBasic forApplications(簡稱VBA)是新一代標準宏語言,是基于 Visual Basic forW indows發展而來的。VBA提供了面向對象的程序設計方法及相當完整的程序設計語言,對于非計算機專業的醫學生來說易于學習和掌握。因此,對于日后在工作中需要經常使用Office套裝軟件來解決工作中需要解決的問題的醫學大學生,學習VBA程序設計將有助于使工作自動化,提高工作效率。
所以,從目前高校數據庫課程開設的情況來看,大部分學校都將 Access數據庫系統作為非計算機專業學生學習的課程之一,同時Access近年來也成為全國高校計算機二級等級考試參考人數最多的科目之一。為此,我們教研室也為醫學生開設了“Access數據庫VBA程序設計”這門選修課。由于醫學生與工科計算機專業學生邏輯思維上的差異,如何提高該課程的教學質量和教學效果,是我們任課教師一直探討的問題。由于VBA不是一門獨立的編程語言,是基于VB擴展而來的,它在語法規則上基本遵循VB的語法,但基于 Access數據庫的使用特點,在個別使用上又有其特點。
在VBA中,Null、Empty、和Nothing表示的都是空值,但它們又有所區別。Nothing:是用于對象變量的,當對象變量被設為 Nothing(set rs=Nothing)時,系統便會釋放該對象所占用的內存資源,此時該對象變量指向空對象。Empty:表示的是一個有效空值,當一個變量 x被聲明為變體類型而從未賦值時,其值就是 Empty,是由系統自動賦予的,表示變量 x尚未初始化,此時的 x的值可以是數值型的初始值 0,也可以是字符型的初始值空字串"",此時語句 If x=0 Then或 if x=""Then或 If IsEmpty(x) Then的判斷結果都為 True。Null:表示的是一個無效數據,一般用于表示記錄中某字段數據暫不確定時的數據值,比如,在通過程序添加記錄時,對于某個字段的值暫不確定,就可以用Null來表示。在程序中當 x=Null時,則表示 x不包含有效數據,此時的 x的值不能在程序中直接使用。對于值為 Null的數據只能通過 IsNull()函數來判斷,例如:IF Is-Null(x)=true Then,而不能用 If x=Null Then,因為含有 Null值的運算式其結果永遠是Null。
空值Null雖然不能在程序中直接使用,但它卻是完全合法的數據庫錄入項,我們在編程時不能因為空值Null是無效數據,在數據錄入時就一律拒絕空值,如果完全回避空值,那么,在你創建一條記錄時,如果某個字段的數據暫時不確定,就無法創建該記錄。要求所有數據都必須是已知的,在實際使用當中是不現實的。以醫院急診室的數據庫系統為例,不能因為數據錄入時不確定一個急診病人的年齡,系統就拒絕為其創建一條記錄。所以,我們不能完全回避空值,而應在實際應用中正確認識及合理使用空值。
在教學中,發現學生對 Null空值較難理解,可通過一些實例講解使學生加深對空值的理解。例如:在盤點藥品庫存時,發現某種藥品用完了,那么在它的數量一欄里我們應該輸入 0,代表這種藥品已盤點過,數量是 0,而另一種藥品我們還沒來得及清點,數量暫時未知,那么此時它的數量一欄是空的,也就是我們所說的空值Null,這種空值告訴我們該藥品的盤點工作尚未完成,數量暫不確定。通過0和Null的實例比較,我們可以很清楚地看到,0和Null反應的是事物的兩種完全不同的狀態。從而進一步加深了對空值Null的正確認知,并認識到空值是無法避免的,正確的做法就是如何正確處理它們,確保它們不會導致程序錯誤。當空值在表達式中使用之前,可以用 IsNull函數捕捉空值或用Nz函數來處理空值,因為空值經常會返回錯誤而使程序無法正常運行。
前面討論的Null值不能在程序中直接使用,否則程序會返回出錯信息而使程序無法正常運行。但當Null出現在 IF語句的條件表達式中時,程序不會返回錯誤信息,并且可運行,只是運行結果不正確。例如下面的程序段,學生在編程時,由于對于未初始化的文本框控件的Value屬性初始值為Null這一特征的掌握不準確,時常會誤用其空值Null:
IfMe.賬號="" Or Me.密碼="" Then MsgBox"賬號、密碼不能為空"
ElseIfMe.賬號 <>"1234567"Then
MsgBox"賬號錯誤,請重新輸入"
ElseIfMe.密碼 <>"gyjsj"Then
MsgBox"密碼錯誤,請重新輸入"
Else
MsgBox"登錄成功!"
:
:
End If
在程序首次運行時,如果“賬號”和“密碼”文本框不輸入任何數據 (即未初始化),此時引用“賬號”、“密碼”文本框的Value屬性為空值 Null,程序運行時不是像程序設計者預想的那樣,執行MsgBox“賬號、密碼不能為空”語句,也不執行MsgBox“賬號錯誤,請重新輸入”和MsgBox“密碼錯誤,請重新輸入”語句,同時又不返回錯誤使用Null值的信息,而是執行MsgBox“登錄成功!”語句(此時 if語句的前 3個分支都出現了 Null空值)。雖然教科書明確指出不能在程序中直接使用空值Null,可問題出現,老師應給學生一個合理的解釋。那么程序對于條件表達式出現空值 Null的情況是如何判斷的呢?通過查證Access幫助信息提示是判為 False,假設 判 斷 為 False,則 Not(Me.賬 號 = ""OrMe.密碼 ="")=True應該成立,實際運行情況表明該假設不成立,程序執行結果仍是運行MsgBox“登錄成功!”。由此可見,程序對于條件表達式出現空值Null的情況是既不返回錯誤信息,也不判斷為 False。即,不做任何邏輯判斷,而是忽略跳過所有含Null值的條件分支,轉入后續分支判斷執行。由于 Null出現在 If語句中程序可運行而系統又不提示出錯信息,使學生誤用后很難發現錯誤。所以在教學中,應通過實例詳細闡述 Null的特點、正確使用及合理規避,可通過對文本框初始化的方法盡量避免使用 Null空值。也可把第一條語句改為:IF Nz(Me.賬號)=""Or Nz(Me.密碼)= ""Then或 IF Is Null(Me.賬號)=True or IsNull (Me.密碼)=True Then。
在VBA的ADO數據庫操作程序中,經常會用到 SQL select查詢語句,下面有兩個查詢語句:
Select姓名,年齡 from tEmp where黨員否Select avg(年齡)from tEmp where黨員否
第一條語句的查詢結果是黨員的姓名,年齡字段數據集,如果沒有黨員記錄,則查詢結果集為 0條記錄。而第二條語句的查詢結果是黨員的平均年齡,即查詢結果是一個集函數返回值,其特點是:無論是否有黨員記錄,結果集中都會有一條固定的記錄,(該結論可通過在程序中添加語句:MsgBox rs.RecordCount得到驗證),只是記錄的值不同。當有黨員記錄時,集函數返回值為一個有效的確定值,而當無黨員記錄時,集函數返回值為一個無效的空值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"無黨員職工的年齡數據"
sage=0
Exit Sub
Else
sage=rs.Fields(0)
Me.Text1=sage
End If
:
:
End Sub
在判斷查詢結果集中是否有黨員平均年齡時,程序使用的方法是用記錄集的 EOF屬性,該屬性當記錄集中無記錄時,rs.EOF=TRUE,此方法用于判斷普通字段數據查詢結果集是可以的,但該題判斷的結果集是一個集函數返回值,無論黨員條件是否為真都會有一條固定的記錄,既然有記錄,那么其rs.EOF=FALSE。所以當模擬無黨員記錄運行該程序時,程序并未按設計者的想法運行MsgBox"無黨員職工的年齡數據"語句,而是運行 sage= rs.Fields(0),同時提示錯誤信息:

因為此時查詢結果集中的 rs.Fields(0)的值為Null。所以該程序不適合用 rs.EOF來判斷。
解決方法:可以利用查詢結果集中固定記錄的值的不同來作為判斷條件。為避免使用無效空值Null,可使用 Is Null()函數來判斷空值,或者用Nz()函數將無效空值 Null轉換為有效值,可將程序改為:

MsgBox"無黨員職工的年齡數據"
sage=0
Exit Sub
Else
sage=rs.Fields(0)
Me.Text1=sage
End If
:
:
End sub
此時,無論是否有黨員記錄,程序都能正常運行了。
程序設計對于非計算機專業的醫學生來說,是較難學習和掌握的一門課程,學習中常常會遇到一些難以理解和掌握的知識點,而有限的教科書又無從查證,甚至一些輔助教材還會出現一些錯誤內容,這就需要我們老師去深入探討及結合實驗驗證來給學生作詳細的講解,從而使學生能正確認知和使用。在以后的教學中還會遇到很多類似的問題需要我們進一步的不斷探討。
[1] 王 晟,韓澤坤.Access數據庫開發經典案例解析[M].北京:清華大學出版社,2006.336-380
[2] 蔣加伏,張林峰.VisualBasic程序設計教程[M].北京:北京郵電大學出版社,2004.312-316
[3] 何勝利.Access數據庫應用技術教程[M].北京:中國鐵道出版社,2008.182-232
[4] 教育部考試中心.全國計算機等級考試二級教程—Access數據庫程序設計[M].北京:高等教育出版社,2004.247-293
(學術編輯:周 敏)
1005-3697(2010)05-0506-03
G642.4
B
2010-07-01