摘要:利用SQL-SELECT、參數(shù)化視圖和數(shù)據(jù)過濾器等方法設(shè)計(jì)并實(shí)現(xiàn)了查詢表單,并對三種設(shè)計(jì)方法進(jìn)行了討論。
關(guān)鍵詞:VFP;查詢;表單設(shè)計(jì)
中圖分類號:TP311.1 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2009)36-10169-03
The Design and Implementation of Query Form Based on Visual FoxPro
SHANG Jun-ping, LIU He-bing
(Department of Computer Science technology, Henan Agricultural University, Zhengzhou 450002, China)
Abstract: This paper presents the design and implementation of query form in Visual FoxPro with the methods of SQL-SELECT, parametric view and data filter, and the methods are discussed.
Key words: VFP; query; form design
數(shù)據(jù)的查詢是數(shù)據(jù)處理中最基本的操作,幾乎每個(gè)應(yīng)用程序都會(huì)涉及查詢的問題。在數(shù)據(jù)庫應(yīng)用系統(tǒng)開發(fā)中,查詢表單的設(shè)計(jì)非常重要。本文以學(xué)生-課程-成績數(shù)據(jù)庫為例,利用SQL-SELECT、參數(shù)化視圖和數(shù)據(jù)過濾器等三種方法設(shè)計(jì)并實(shí)現(xiàn)了查詢表單。
1 表單設(shè)計(jì)
表單是數(shù)據(jù)處理的用戶界面,用戶通過各種表單來認(rèn)識和使用數(shù)據(jù)處理應(yīng)用軟件。在開發(fā)一個(gè)數(shù)據(jù)庫應(yīng)用系統(tǒng)時(shí),表單的設(shè)計(jì)是非常重要、不可缺少的一個(gè)環(huán)節(jié)。
表單設(shè)計(jì)的基本步驟:
1) 設(shè)置數(shù)據(jù)環(huán)境。分析表單是否涉及到數(shù)據(jù)表或視圖中的數(shù)據(jù),根據(jù)需要在數(shù)據(jù)環(huán)境中添加數(shù)據(jù)表或視圖。數(shù)據(jù)環(huán)境及其中的表或視圖都是對象,可以對其進(jìn)行屬性設(shè)置,數(shù)據(jù)環(huán)境的設(shè)置與表單一起保存。在運(yùn)行表單時(shí),VFP自動(dòng)打開其數(shù)據(jù)環(huán)境中的表或視圖。
2) 設(shè)計(jì)表單界面:添加各類控件,設(shè)置各個(gè)對象的屬性,調(diào)整布局。
3) 編寫事件代碼:事件代碼設(shè)計(jì)是表單設(shè)計(jì)的關(guān)鍵。對某些對象,如命令按鈕等進(jìn)行相關(guān)的事件設(shè)計(jì),事件代碼在對象的事件觸發(fā)時(shí)自動(dòng)執(zhí)行。
2 數(shù)據(jù)源說明
本文以學(xué)生-課程-成績數(shù)據(jù)庫為數(shù)據(jù)源,數(shù)據(jù)庫中包括主要三個(gè)數(shù)據(jù)表,關(guān)系模式分別為:
Xuesheng(Xh,Xm,Xb,Csrq),字段分別表示學(xué)生的學(xué)號、姓名、性別和出生日期;
Kecheng(Kcdh,Kcm,Llxs,Syxs,Bxk,Xq,Kcbz),其中字段分別表示課程代號、課程名、理論學(xué)時(shí)、實(shí)驗(yàn)學(xué)時(shí)、必修課、開課學(xué)期和課程備注;
Chengji(Xh,Kcdh,Cj),其中字段分別表示學(xué)號、課程代號和成績。
在Xuesheng與Chengji之間、Kecheng與Chengji之間建立一對多永久關(guān)系。
部分?jǐn)?shù)據(jù)如圖1所示。
3 查詢表單設(shè)計(jì)
運(yùn)行查表單詢,用戶可以通過交互方式,實(shí)現(xiàn)根據(jù)輸入查詢信息,得到相關(guān)信息。
本文設(shè)計(jì)如圖2所示的查詢表單,運(yùn)行表單,用戶輸入學(xué)生姓名,點(diǎn)擊“查詢”按鈕查詢其選修課程及成績,結(jié)果顯示在表單上的表格中,點(diǎn)擊“退出”按鈕,釋放表單。
3.1 利用SQL-SELECT語句設(shè)計(jì)查詢表單
SELECT語句是SQL(Structured Query Language)語言的核心語句,提供對數(shù)據(jù)庫的查詢。SELECT語句使用方式靈活,功能豐富,不僅可以完成單表查詢,也可以完成復(fù)雜的連接查詢和嵌套查詢。
表單設(shè)計(jì)分析:利用SELECT語句設(shè)計(jì)圖2所示表單,設(shè)計(jì)界面如圖3所示,表單文件名設(shè)為F1。單擊“查詢”按鈕,根據(jù)文本框Text1中輸入的姓名進(jìn)行查詢,查詢結(jié)果保存在臨時(shí)表T1中,要使查詢結(jié)果在Grid1中顯示,表格Grid1的數(shù)據(jù)源Recordsource應(yīng)設(shè)定為臨時(shí)表T1。為避免表單初次運(yùn)行表格Grid1中無數(shù)據(jù)出現(xiàn)空白表,在表單的Init事件中將表格的數(shù)據(jù)源進(jìn)行初始化。
設(shè)計(jì)步驟如下:
1) 使用SELECT語句不需要打開要查詢的數(shù)據(jù)表,所以無需考慮數(shù)據(jù)環(huán)境。
2) 添加兩個(gè)標(biāo)簽,將Label1的Caption屬性設(shè)為“基于VFP的查詢表單”,F(xiàn)ontName為“楷體_GB2312”,F(xiàn)ontSize為18,Label2的Caption屬性設(shè)為“請輸入姓名”,F(xiàn)ontName為“楷體_GB2312”,F(xiàn)ontSize為14。
3) 添加一個(gè)文本框Text1,用于運(yùn)行時(shí)輸入要查詢的信息。
4) 添加兩個(gè)命令按鈕,Caption屬性分別設(shè)為“查詢”和“退出”,F(xiàn)ontName為“楷體_GB2312”。
5) 添加表格Grid1,用于顯示查詢信息。
6) 調(diào)整各個(gè)對象大小和布局。
7) 表單事件代碼設(shè)計(jì):
Form1的Init事件代碼:
SELECT Xuesheng.Xh,Xuesheng.Xm,Kecheng.Kcdh,Kecheng.Kcm,Chengji.Cj;
FROM Xuesheng,Kecheng,Chengji;
WHERE Xuesheng.Xh=Chengji.Xh AND Chengji.Kcdh=Kecheng.Kcdh ;
AND Xuesheng.Xm==\"\";
INTO CURSOR T1
Thisform.Grid1.Recordsource=\"T1\"
“查詢”按鈕的Click事件代碼:
SELECT Xuesheng.Xh,Xuesheng.Xm,Kecheng.Kcdh,Kecheng.Kcm,Chengji.Cj;
FROM Xuesheng,Kecheng,Chengji;
WHERE Xuesheng.Xh=Chengji.Xh AND Chengji.Kcdh=Kecheng.Kcdh ;
AND Xuesheng.Xm=Allt(Thisform.Text1.Value);
INTO CURSOR T1
Thisform.Grid1.Recordsource=\"T1\"
Thisform.Refresh
“退出”按鈕的Click事件代碼:
Thisform.Release
討論:由于SQL-SELECT語句功能強(qiáng)大,可以對單表、多表實(shí)現(xiàn)單條件查詢、多條件組合查詢的查詢功能,使用這種方法設(shè)計(jì)查詢表單。對于不同的數(shù)據(jù)源和查詢要求,可參照上例,多條件時(shí)增加輸入文本框(或使用組合框、選項(xiàng)按鈕組等),修改SELECT語句即可。
3.2 利用參數(shù)化視圖設(shè)計(jì)查詢表單
視圖是關(guān)系數(shù)據(jù)庫系統(tǒng)提供給用戶從多種角度觀察數(shù)據(jù)庫中數(shù)據(jù)的重要機(jī)制。視圖是從一個(gè)或者幾個(gè)基本表(或視圖)導(dǎo)出的表,它與基本表不同,是一個(gè)虛表。數(shù)據(jù)庫中只存放視圖的定義,而不存放視圖對應(yīng)的數(shù)據(jù),這些數(shù)據(jù)仍存放在原來的基本表中。在創(chuàng)建視圖時(shí),可以創(chuàng)建參數(shù)化視圖,用它來限定視圖的作用范圍,避免每取一部分記錄就單獨(dú)創(chuàng)建一個(gè)視圖。
利用參數(shù)化視圖設(shè)計(jì)如圖2所示表單,設(shè)計(jì)界面如圖4所示,表單文件名設(shè)為F2。
設(shè)計(jì)步驟如下:
1) 打開學(xué)生-課程-成績數(shù)據(jù)庫,利用視圖設(shè)計(jì)器創(chuàng)建參數(shù)化視圖St1。將Xuesheng、Chengji與 Kecheng添加到視圖中,在字段選項(xiàng)卡選定Xuesheng.Xh,Xuesheng.Xm,Kecheng.Kcdh,Kecheng.Kcm,Chengji.Cj,在“篩選”選項(xiàng)卡中設(shè)置條件:Xuesheng.Xm=?xx,用“?xx”方式調(diào)用參數(shù)變量。這里,xx是變量名。參數(shù)化視圖St1的設(shè)計(jì)界面如圖5所示。
2) 將參數(shù)化視圖St1添加到查詢表單數(shù)據(jù)環(huán)境中,并將數(shù)據(jù)環(huán)境中的參數(shù)化視圖St1(Cursor1)的Nodataonload屬性設(shè)置為.t.。Nodataonload 屬性設(shè)為.t.,表單初始化時(shí),打開視圖,但視圖不取得任何數(shù)據(jù)。這樣可以避免運(yùn)行表單時(shí)參數(shù)化視圖彈出要求輸入?yún)?shù)變量的對話框。
3) 標(biāo)簽、文本框、命令按鈕的添加和屬性設(shè)置同圖3表單F1的設(shè)計(jì)。
4) 把數(shù)據(jù)環(huán)境中的參數(shù)化視圖St1拖放到表單中,生成表格grdSt1。
5) 調(diào)整各個(gè)對象大小和布局。
6) 表單事件代碼設(shè)計(jì):
Form1的Init事件代碼:
Local xx通過定義變量xx,實(shí)時(shí)改變視圖的參數(shù)變量。
“查詢”按鈕的Click事件代碼:
xx=Allt(Thisform.Text1.Value)通過文本框給參數(shù)變量賦值。
=requery(“St1”)當(dāng)參數(shù)變量發(fā)生變化時(shí)可用ReQuery()函數(shù)刷新視圖。
Thisform.Refresh
“退出”按鈕的Click事件代碼:
Thisform.Release
討論:視圖從一個(gè)或者幾個(gè)基本表(或視圖)導(dǎo)出數(shù)據(jù),同樣可以對單表、多表實(shí)現(xiàn)單條件查詢、多條件組合查詢。通過設(shè)計(jì)參數(shù)化視圖,當(dāng)參數(shù)變量發(fā)生變化時(shí)刷新視圖,實(shí)現(xiàn)交互查詢。對于不同的數(shù)據(jù)源和查詢要求,參照上例,多條件時(shí)增加輸入文本框(或使用組合框、選項(xiàng)按鈕組等),修改參數(shù)化視圖的設(shè)計(jì)即可。在設(shè)計(jì)時(shí)需要根據(jù)參數(shù)的個(gè)數(shù)、名稱在表單的Init事件中設(shè)置對應(yīng)的變量,在對參數(shù)變量重新賦值后,使用=ReQuery()函數(shù)刷新視圖。ReQuery()的參數(shù)為視圖名。
3.3 利用數(shù)據(jù)過濾器設(shè)計(jì)查詢表單
在VFP中數(shù)據(jù)過濾器可以為數(shù)據(jù)表或視圖設(shè)置邏輯表,將不符合條件的記錄“屏蔽”起來。一個(gè)表或視圖設(shè)置過濾器后,對表的操作僅限于滿足條件的記錄。數(shù)據(jù)過濾器實(shí)現(xiàn)可以通過菜單方式,也可以使用SET FILTER TO命令實(shí)現(xiàn)。
利用SET FILTER TO命令設(shè)計(jì)如圖2所示的查詢表單,設(shè)計(jì)界面如圖6所示,表單文件名設(shè)為F3。設(shè)計(jì)步驟如下:
1) 該表單查詢數(shù)據(jù)涉及到的數(shù)據(jù)表有Xuesheng.dbf、Kecheng.dbf和Chengji.dbf,打開學(xué)生-課程-成績數(shù)據(jù)庫,創(chuàng)建視圖St2,字段包含Xuesheng.dbf中的Xh,Xm,Kecheng.dbf中的Kcdh,Kcm,Chengji.dbf中的Cj字段。將視圖St2添加到表單數(shù)據(jù)環(huán)境中。
2) 標(biāo)簽、文本框、命令按鈕的添加和屬性設(shè)置同圖3表單的設(shè)計(jì)。
3) 把數(shù)據(jù)環(huán)境中的視圖St2拖放到表單中,生成表格grdSt2。
4) 調(diào)整各個(gè)對象大小和布局。
5) 表單事件代碼設(shè)計(jì):
“查詢”按鈕的Click事件代碼:
SET FILTER TO St2.Xm=Allt(Thisform.Text1.Value)
Thisform.Refresh
“退出”按鈕的Click事件代碼:
SET FILTER TO
Thisform.Release
討論:表單F3涉及多個(gè)表,使用視圖作為數(shù)據(jù)源相對來說操作更方便,如果要多條件組合查詢,只需在表單上增加輸入文本框,修改SET FILTER TO命令的條件即可。如果對單表進(jìn)行查詢,用這種設(shè)計(jì)方法更能顯出優(yōu)勢,直接將要查詢的數(shù)據(jù)表加入數(shù)據(jù)環(huán)境,代碼編寫簡單,易于實(shí)現(xiàn)。
4 結(jié)束語
該文對VFP查詢表單的涉及進(jìn)行了探討,利用SQL-SELECT、參數(shù)化視圖和數(shù)據(jù)過濾器等方法設(shè)計(jì)并實(shí)現(xiàn)了查詢表單,詳細(xì)說明了設(shè)計(jì)思路及步驟,提供了事件代碼。利用SQL-SELECT方法設(shè)計(jì)查詢表單,關(guān)鍵在SELECT語句。利用參數(shù)化視圖,關(guān)鍵在參數(shù)化視圖的設(shè)計(jì)。數(shù)據(jù)過濾器方法關(guān)鍵在數(shù)據(jù)源的組織和SET FILTER TO命令中條件表達(dá)式的表示。
參考文獻(xiàn):
[1] 王珊,薩師煊.數(shù)據(jù)庫系統(tǒng)概論[M].北京:高等教育出版社,2006.
[2] 劉瑞新,汪遠(yuǎn)征.Visual FoxPro程序設(shè)計(jì)教程[M].北京:電子工業(yè)出版社,2006.
[3] 楊佩理,陶瑜.Visual FoxPro數(shù)據(jù)庫設(shè)計(jì)教程[M].北京:機(jī)械工業(yè)出版社,2004.