[收稿日期]2008-12-20
[摘 要]本文以會計科目的查詢與修改操作為例,詳細分析與探討了利用Visual FoxPro設計與實施管理信息系統(tǒng)數(shù)據(jù)查詢與修改模塊的基本原理、方法和步驟,并提供了相應的程序代碼。
[關鍵詞]管理信息系統(tǒng);會計科目;數(shù)據(jù)查詢;數(shù)據(jù)修改;Visual FoxPro程序設計
doi:10.3969/j.issn.1673-0194.2009.13.001
[中圖分類號]F232[文獻標識碼]A[文章編號]1673-0194(2009)13-0004-04
數(shù)據(jù)查詢與修改操作是管理信息系統(tǒng)必不可少的基本操作,查詢與修改模塊則是管理信息系統(tǒng)中極其重要的功能模塊。數(shù)據(jù)查詢與修改處理的基本原理是:先提供查詢條件,然后在數(shù)據(jù)表中查詢符合條件的記錄,再以只讀方式顯示出查詢結果。如果只進行查詢操作,則不允許對查詢結果進行修改;如果要在所顯示的查詢結果中修改數(shù)據(jù),則需要先將顯示結果變?yōu)榉侵蛔x方式,然后進行修改,待相關數(shù)據(jù)修改完畢后,仍需將顯示結果再變?yōu)橹蛔x方式。本文以Visual FoxPro為關系數(shù)據(jù)庫管理系統(tǒng),以會計科目的查詢與修改為例,分析與探討管理信息系統(tǒng)數(shù)據(jù)查詢與修改模塊的實現(xiàn)方法。本文所提供的程序代碼已通過上機驗證。
1 數(shù)據(jù)表的結構
由于查詢與修改操作是對相應數(shù)據(jù)表中的相關數(shù)據(jù)進行查詢與修改處理,所以,必須首先弄清楚相應數(shù)據(jù)表的結構。假設會計科目相關信息保存在會計科目表中,會計科目表的數(shù)據(jù)結構如表1所示,其文件名為kjkm.dbf,存儲在默認目錄下??梢詫嬁颇勘砦募jkm.dbf添加到相應的賬務處理數(shù)據(jù)庫中加以管理。
2 查詢與修改表單界面的設計
根據(jù)表1所示的會計科目表的結構,在Visual FoxPro的表單設計器中設計如圖1所示的查詢與修改表單。其中,矩形對應于一個容器控件,該容器控件之上放置有標簽、組合框、文本框等對象,“查詢條件”、“待選項目:”、“比較符:”、“值:”是為各標簽設置的Caption屬性,Combo 1、Combo 2是各組合框的默認的Name屬性,Text 1、Text 2是各文本框的默認的Name屬性。而“查詢”、“修改”、“退出”是為各命令按鈕控件設置的Caption屬性。另外,“查詢與修改項目”是為表單設置的Caption屬性。以上控件或對象都是借助“表單控件”工具欄畫出的,各控件的Caption屬性通過相應的“屬性”對話框進行設置。
需要說明的是,Text 1和Text 2文本框實際是重疊在一起的,并與Combo 1及Combo 2組合框水平對齊,運行時同一時刻只能顯示其中一個文本框,感覺上就像只有一個文本框一樣。這里只是為了方便描述和便于理解,才以圖1中所示的呈現(xiàn)形式進行布局。
表單的下方是一個表格控件,設計該表格控件的步驟和方法是:①在“表單控件”工具欄選中“表格”控件,再在表單上適當?shù)奈恢卯嬕粋€大小適中的表格,其Name屬性默認為Grid 1;②用鼠標右鍵單擊Grid 1表格,再在彈出的快捷菜單中選擇“生成器”,則出現(xiàn)表格生成器對話框,可在其“表格項”選項卡選擇或設置此表格關聯(lián)的數(shù)據(jù)表kjkm(或選擇文件kjkm.dbf),并選定該表格關聯(lián)的全部字段,再在“布局”選項卡將表格各欄對應的標題設定為圖1中表格的標題,最后單擊表格生成器的“確定”按鈕即可。這樣設置后,就為表單建立了數(shù)據(jù)環(huán)境,且數(shù)據(jù)環(huán)境設計器中對應的數(shù)據(jù)表就是kjkm,數(shù)據(jù)環(huán)境和kjkm數(shù)據(jù)表的Name屬性分別為Dataenvironment和Cursor1。
3 查詢與修改模塊的功能目標
數(shù)據(jù)庫或數(shù)據(jù)表中的數(shù)據(jù)量一般都比較大,無論是進行數(shù)據(jù)查詢還是進行數(shù)據(jù)修改,都需要指定相應的查詢或修改條件,再進行相應的操作。因此,要實現(xiàn)查詢與修改功能,應能通過其表單界面指定查詢條件,并執(zhí)行相應的查詢或修改操作,操作完畢后應使表單能夠退出內(nèi)存。具體來說,查詢與與修改模塊就是要實現(xiàn)以下功能目標:
(1)指定查詢條件。圖1所示的表單運行后,組合框Combo 1是一個下拉列表框,可以從其下拉列表項“科目編號”、“科目名稱”、“借貸方向”、“期初余額”中任意選擇其中一項,默認的選項為“科目名稱”。同樣,Combo 2也是一個下拉列表框,可以在其下拉列表中分別選擇以下比較運算符:<、<=、=、==、>=、>、<>,默認的比較符選項為=。當從Combo 1下拉列表中選擇“科目編號”、“科目名稱”或“借貸方向”時,Text 2文本框隱藏,而Text 1文本框顯示并獲得焦點,對應的字符型數(shù)據(jù)可在Text 1文本框內(nèi)輸入;否則,當從Combo 1下拉列表中選擇“期初余額”時,Text 1文本框隱藏,同時Text 2文本框顯示并獲得焦點,可將對應的數(shù)值型數(shù)據(jù)輸入到Text 2文本框。這樣,由Combo 1、Combo 2中選擇的內(nèi)容與Text 1或Text 2中指定的內(nèi)容就構成了一個條件。
(2)進行查詢或修改操作。表單運行后,表格Grid 1中起初并不顯示任何數(shù)據(jù),只有單擊“查詢”按鈕時,才將滿足查詢條件的全部記錄顯示在表格中,顯示結果不允許修改,只有單擊“修改”按鈕后才能修改表格中顯示的數(shù)據(jù)。焦點離開表格至再次單擊“修改”按鈕前,表格中的數(shù)據(jù)禁止被修改。
(3)退出。單擊“退出”按鈕,表單退出內(nèi)存。
4 查詢與修改模塊功能的實現(xiàn)
4.1 “指定查詢條件”功能的實現(xiàn)
4.1.1 定義表單的Load事件與Unload事件
表單的Load事件是表單對象建立之前引發(fā)的事件,而Unload事件則是表單對象釋放時最后一個要引發(fā)的事件。可在表單的Load事件中使用Public聲明含4個元素的數(shù)組xiangmu和含7個元素的數(shù)組bijiao,其中數(shù)組xiangmu各元素分別保存Combo 1下拉列表框中的待選項目,包括科目編號、科目名稱、借貸方向、期初余額;數(shù)組bijiao各元素分別保存比較運算符,包括小于(<)、小于或等于(<=)、等于(=)、全等于(==)、大于或等于(>=)、大于(>)、不等于(<>)。另外,為使表單運行后能采用精確匹配方式進行字符串比較,還應在Load事件的開始添加set exact on語句。表單的Load事件的程序代碼對應如下:
set exact on
public xiangmu(4),bijiao(7)
xiangmu(1)=\"科目編號\"
xiangmu(2)=\"科目名稱\"
xiangmu(3)=\"借貸方向\"
xiangmu(4)=\"期初余額\"
bijiao(1)=\"<\"
bijiao(2)=\"<=\"
bijiao(3)=\"=\"
bijiao(4)=\"==\"
bijiao(5)=\">=\"
bijiao(6)=\">\"
bijiao(7)=\"<>\"
由于在Load事件中使用了set exact on語句,因而需要定義表單的Unload事件,并將其Unload事件的程序代碼設置為set exact off,以便退出表單時將Visual FoxPro設置為默認的字符串比較方式。
如果在表單的Load事件中不包含set exact on語句,就表明程序中采用默認的set exact off方式進行字符串的比較,此時便不需要專門為表單的Unload事件設置相應的程序代碼。但在采用set exact off方式進行字符串的比較運算時,只要關系表達式中比較運算符“=”、“<=”或“>=”右邊的字符串與其左邊字符串前面的部分內(nèi)容相匹配,即可得到邏輯真#8226;T#8226;的結果。
4.1.2 指定Combo 1和Combo 2關聯(lián)的數(shù)據(jù)源
由于Combo 1是一種下拉列表框形式的組合框,其下拉列表項分別為科目編號、科目名稱、借貸方向和期初余額,對應于數(shù)組xiangmu中各元素的值,因此可依次將Combo 1組合框的RowSourceTye、RowSource和Style屬性分別設定為5-數(shù)組、xiangmu、2-下拉列表框,這樣就分別設定了該組合框控件中數(shù)據(jù)值的源的類型、數(shù)據(jù)值的源及組合框的類型。同樣,可將Combo 2的RowSourceTye、RowSource和Style屬性分別設定為5-數(shù)組、bijiao、2-下拉列表框。
這樣設置并運行后,Combo 1下拉列表框中就會包含科目編號、科目名稱、借貸方向和期初余額等列表項,而Combo 2下拉列表框中包含<、<=、=、==、>=、>、<>等列表項,可供選擇。
4.1.3 定義表單的Init事件
Init事件是在對象建立時引發(fā)的事件。要使表單啟動后,Combo 1默認選擇為“科目名稱”,Combo 2默認選擇為等號“=”,可在表單的Init事件中分別使Combo 1、Combo 2的listindex屬性設置為2和3,其中2對應于4.1.1節(jié)中定義的數(shù)組xiangmu第二個元素xiangmu(2)的值,3對應于數(shù)組bijiao的第三個元素bijiao(3)的值。為確保顯示在表格中的數(shù)據(jù)不能被隨意修改(除非單擊“修改”按鈕),可使表格Grid 1的ReadOnly屬性設置為#8226;t#8226;以使表格只讀。另外,當Combo 1中選擇“期初余額”時,應將Text 1的visible屬性設置為#8226;f#8226;,以使Text 1隱藏;同時將Text 2的visible屬性設置為#8226;t#8226;,以使Text 2顯式顯示,應利用setfocus方法使Text 2獲得焦點,以便于數(shù)值型數(shù)據(jù)的輸入。否則,當Combo 1中選擇了“科目編號”、“科目名稱”或“借貸方向”時,應使采用同樣的方法使Text 2隱藏,使Text 1可見并獲得焦點,以便于字符型數(shù)據(jù)的輸入。表單的Init事件的程序代碼對應如下:
thisform.Combo 1.listindex=2
thisform.Combo 2.listindex=3
thisform.grid1.readonly=#8226;t#8226;
if thisform.Combo 1.value=\"期初余額\"
thisform.Text 1.visible=#8226;f#8226;
thisform.Text 2.visible=#8226;t#8226;
thisform.Text 2.setfocus
else
thisform.Text 2.visible=#8226;f#8226;
thisform.Text 1.visible=#8226;t#8226;
thisform.Text 1.setfocus
endif
4.1.4 定義Combo 1的InteractiveChange事件
表單運行后,經(jīng)常在Combo 1和Combo 2中選擇下拉列表項,根據(jù)Combo 1中選擇的內(nèi)容是否為“期初余額”,需要確定是在Text 2中還是在Text 1中輸入數(shù)據(jù)。當Combo 1中選擇的內(nèi)容改變時,如果變?yōu)椤捌诔跤囝~”,則應使Text 1隱藏,Text 2可見并獲得焦點,以便于輸入數(shù)值型數(shù)據(jù);否則,如果Combo 1中的內(nèi)容變?yōu)槠渌棧颇烤幪?、科目名稱、借貸方向),則Text 2不可見,Text 1可見并獲得焦點,以便于輸入字符型數(shù)據(jù)。可在Combo 1的InteractiveChange事件中設置相關代碼,當用戶使用鍵盤或鼠標更改此控件的值時,其InteractiveChange事件中的代碼被立即執(zhí)行。Combo 1的InteractiveChange事件的程序代碼對應如下:
if this.value=\"期初余額\"
thisform.Text 1.visible=#8226;f#8226;
thisform.Text 2.visible=#8226;t#8226;
thisform.Text 2.setfocus
else
thisform.Text 2.visible=#8226;f#8226;
thisform.Text 1.visible=#8226;t#8226;
thisform.Text 1.setfocus
endif
同樣,Combo 2中選擇的比較符發(fā)生改變時,如果Combo 1中選擇的是“期初余額”,則使Text 2獲得焦點;否則,如果Combo 1中選擇的是“科目編號”、“科目名稱”或“借貸方向”,則使Text 1獲得焦點,以便于在對應的文本框內(nèi)輸入對應待選項目的相關數(shù)據(jù)??稍贑ombo 2的InteractiveChange事件中設置相關代碼,Combo 2的InteractiveChange事件的程序代碼對應如下:
if thisform.Combo 1.value=\"期初余額\"
thisform.Text 2.setfocus
else
thisform.Text 1.setfocus
endif
4.1.5 設置Text 2的數(shù)據(jù)類型和輸入掩碼
由于Text 2文本框用于輸入期初余額,對應于數(shù)值型數(shù)據(jù),所以應將其數(shù)據(jù)類型設置為數(shù)值型,并且最好指定其輸入掩碼,使輸入的數(shù)值型數(shù)據(jù)符合表1中qcye字段(即期初余額字段)的寬度與小數(shù)位數(shù)。設置方法是:在表單設計器,用鼠標右鍵單擊Text 2控件,在彈出的快捷菜單中選擇“生成器”選項,則出現(xiàn)“文本框生成器”對話框,可在“格式”選項卡將數(shù)值類型設定為“數(shù)值型”,并將輸入掩碼設置為999999999.99,再單擊“文本框生成器”對話框中的“確定”按鈕即可。
另外,由于Text 1文本框用于輸入科目編號、科目名稱或借貸方向等字符型數(shù)據(jù),而Text 1默認的數(shù)據(jù)類型正好為字符型,所以不需專門對Text 1控件的數(shù)據(jù)類型進行設置。
4.1.6 定義Text 1和Text 2的Click事件
由于多次操作,Text 1及Text 2中可能保留有上次輸入的內(nèi)容。如果單擊Text 1時,能使Text 1中的字符型數(shù)據(jù)自動被清空,或者單擊Text 2時,能使Text 2中的數(shù)值型數(shù)據(jù)自動置零,則輸入操作將變得更加方便??梢苑謩e在Text 1和Text 2的Click事件中將其Value屬性值對應設置為space(0)和0.00,其中space(0)表示由0個空格組成的空字符串。這樣,Text 1的Click事件的程序代碼為:this.value=space(0);而Text 2的Click事件的程序代碼為:this.value=0.00。
4.2 “查詢與修改”功能的實現(xiàn)
4.2.1 設置Cursor 1的Filter屬性與Combo 2的ControlSource屬性
Cursor 1是數(shù)據(jù)環(huán)境Dataenvironment中對應于會計科目表kjkm的游標的默認Name屬性(參見第2節(jié)所做的設置),它與表單上的Grid 1表格控件相互關聯(lián)。為了使表單初始運行后,表格Grid 1中不顯示任何初始數(shù)據(jù),可在屬性窗口將Cursor 1的Filter屬性設置為.F.,F(xiàn)ilter屬性的功能就是使對應于Cursor 1的表格顯示Filter屬性值為真的記錄,當設置為邏輯假值時,所關聯(lián)的表格就不會顯示任何數(shù)據(jù)了。
Combo 2下拉列表框的可選項是比較運算符對應的字符串,如“<”、“<=”等,為了使在Combo 2中選擇的列表項對應于真正意義的比較運算符,而不是字符串,就需要首先設置其ControlSource屬性,以便與某個字符型變量綁定,然后再用宏替換函數(shù)表示該字符型變量對應的比較運算符。假設在表單設計器的屬性窗口將Combo 2的ControlSource屬性設置為bj,則可以用bj.表示從Combo 2中選擇的列表項對應的比較運行符,其中表示宏替換函數(shù)。例如,從Combo 2中選擇<,則bj的值為字符串“<”,而bj.則表示小于號<,而不是字符串“<”。這樣設置,主要是為了縮短查詢程序代碼的長度。
4.2.2 定義“查詢”按鈕的Click事件
當在Combo 1、Combo 2下拉列表框中選擇待查詢項目和比較運算符,且在Text 1或Text 2輸入對應的數(shù)據(jù)后,如果單擊“查詢”按鈕,則查詢結果應能夠以只讀方式顯示在表格Grid 1中。因此,“查詢”按鈕的Click事件的程序代碼應依次執(zhí)行以下功能:①使表格Grid 1只讀;②表示出從Combo 1下拉列表中選擇不同項時對應的查詢條件;③將數(shù)據(jù)環(huán)境Dataenvironment中對應于會計科目表kjkm的游標Cursor1的Filter屬性設置為對應的查詢條件;④根據(jù)Combo 1中選擇的項是否“期初余額”來決定是Text 2還是Text 1獲得焦點;⑤刷新表單。這樣,“查詢”按鈕的Click事件的程序代碼對應如下:
thisform.grid1.readonly=.t.
do case
case thisform.Combo 1.value=\"科目編號\"
tj=\"allt(kmbh)bj.'\"+allt(thisform.Text 1.value) + \"'\"
case thisform.Combo 1.value=\"科目名稱\"
tj=\"allt(kmmc)bj.'\"+allt(thisform.Text 1.value)+\"'\"
case thisform.Combo 1.value=\"借貸方向\"
tj=\"allt(jdfx)bj.'\"+allt(thisform.Text 1.value)+\"'\"
case thisform.Combo 1.value=\"期初余額\"
tj=\"qcyebj.thisform.Text 2.value\"
endcase
thisform.dataenvironment.cursor1.filter=tj
if thisform.Combo 1.value=\"期初余額\"
thisform.Text 2.setfocus
else
thisform.Text 1.setfocus
endif
thisform.refresh
上述代碼的相關說明對應如下:
(1)thisform.grid1.readonly=#8226;t#8226;是將表格Grid 1的只讀屬性設置為邏輯真值,使表格中的數(shù)據(jù)不允許被修改。
(2)分支語句do case…… endcase用于定義從Combo 1選擇不同列表項時對應的查詢條件,并用變量tj表示。例如:當從Combo 1選擇“科目編號”時,tj=\"allt(kmbh)bj.' \"+allt(thisform.Text 1.value) + \"' \",其中bj.表示與從Combo 2中選擇的項相對應的比較運算符,allt()的作用是將字符串的前導和末尾空格去掉;此時,當從Combo 2中選擇<=、在Text 1中輸入201時,tj=\"allt(kmbh)<='201'\"。同理,當從Combo 1選擇“期初余額”、Combo 2中選擇<=、在Text 2中輸入1 000時,tj=\"qcye<=1 000.00\"。
(3)語句thisform.dataenvironment.cursor1.filter=tj就是將Cursor1的Filter屬性設置為tj對應的查詢條件,例如:thisform.dataenvironment.cursor1.filter=\"allt(kmbh)<=' 201' \"。
(4)選擇語句if…… else…… endif的作用是,如果Combo 1中選擇了“期初余額”,則使Text 2獲得焦點以便于輸入數(shù)值型數(shù)據(jù),否則(表示選擇了“科目編號”、“科目名稱”或“借貸方向”),則使Text 1獲得焦點以便于輸入字符型數(shù)據(jù)。由于表單的Init事件和Combo 1的InteractiveChange事件的程序代碼規(guī)定了,如果在Combo 1中選擇列表項“期初余額”,則使Text 1隱藏、Text 2可見;否則,會使Text 2隱藏、Text 1可見,因此,在任何時候,只要Combo 1中選擇了“期初余額”,就只可能在可見的Text 2中輸入數(shù)據(jù),而不能在隱藏的Text 1中輸入數(shù)據(jù);同樣,只要Combo 1中選擇的不是“期初余額”,就不能在隱藏的Text 2中輸入數(shù)據(jù)。這樣,就不必擔心數(shù)據(jù)輸錯文本框的問題。
(5)thisform.refresh的功能是刷新表單,以便在表格Grid 1中顯示出滿足查詢條件的記錄。
4.2.3 修改功能的實現(xiàn)
單擊“修改”按鈕時,表格Grid 1控件中顯示的數(shù)據(jù)應能夠被修改。因此,可在“修改”按鈕的Click事件中將Grid 1的ReadOnly屬性設置為#8226;f#8226;,并使Grid 1獲得焦點,就允許對表格中顯示的數(shù)據(jù)進行修改了?!靶薷摹卑粹o的Click事件的程序代碼對應如下:
thisform.grid1.readonly=#8226;f#8226;
thisform.grid1.setfocus
當使用鼠標或鍵盤使焦點移出表格時,表明本次修改操作結束。以后即使由于單擊“查詢”按鈕或直接單擊表格,而使表格再次獲得焦點,表格中的數(shù)據(jù)也不允許進行修改,除非再次單擊了“修改”按鈕。因此,焦點在移出表格Grid 1前,還應將其ReadOnly屬性設置為#8226;t#8226;,使得只有再次單擊“修改”按鈕時,才能去修改表格中的數(shù)據(jù)。可以利用Grid 1的Valid事件達到此目的,控件的Valid事件中的代碼在控件將要失去焦點前被執(zhí)行。表格Grid 1的Valid事件的程序代碼對應為:this.readonly=#8226;t#8226;。
4.3 “退出”功能的實現(xiàn)
退出功能最簡單的實現(xiàn)方法就是單擊“退出”按鈕時立即使表單從內(nèi)存中釋放。因此,可以在“退出”按鈕的Click事件中利用表單的release方法實現(xiàn)退出操作?!巴顺觥卑粹o的Click事件對應的程序代碼為:thisform.release。
主要參考文獻
[1] 李國紅.管理信息系統(tǒng)數(shù)據(jù)輸入模塊的設計與實現(xiàn)——兼論會計科目的輸入設計[J].中國管理信息化,2006(11).
[2] 王利.全國計算機等級考試二級教程——Visual FoxPro程序設計[M].北京:高等教育出版社,2005.
[3] 陳洛資,陳昭平.數(shù)據(jù)庫系統(tǒng)及應用基礎[M].北京:清華大學出版社,北京交通大學出版社,2005.