Visual FoxPro中通用查詢表單的設(shè)計(jì)與實(shí)現(xiàn)2009-07-09 18:48:15| 分類: VFP 學(xué)習(xí) | 標(biāo)簽: |字號(hào)大中小 訂閱
The Design and Implimentation of General Query Form in Visual FoxPro 胡 明(佛山科學(xué)技術(shù)學(xué)院計(jì)算機(jī)系,廣東佛山 528000) HU Ming(Foshan University,F(xiàn)oshan Guangdong 528000,China) 摘 要:本文介紹了在Visual FoxPro中實(shí)現(xiàn)通用查詢表單的一種方法,并給出了源程序。 關(guān)鍵詞:通用查詢,組合查詢,表單,Visual FoxPro ABSTRACT:This paper introduces a method to design and Impliment general query form in Visual Foxpro,and gives out source code. KEYWORDS:General Query;Combined Query;Form;Visual Foxpro 1 引言 在數(shù)據(jù)庫應(yīng)用系統(tǒng)設(shè)計(jì)中查詢占有很重要的地位,因?yàn)閿?shù)據(jù)庫應(yīng)用系統(tǒng)主要包括數(shù)據(jù)維護(hù)、查詢、報(bào)表、統(tǒng)計(jì)等功能。對(duì)用戶而言,需要有查詢功能,便于管理。Visual Foxpro中可以用查詢?cè)O(shè)計(jì)器以及SQL語言實(shí)現(xiàn)查詢,但這些方法在做查詢?cè)O(shè)計(jì)時(shí)要用到表文件的字段名,編寫出的查詢程序通用性差,使用者必須掌握Visual FoxPro中的查詢?cè)O(shè)計(jì)器或SQL語言,而且當(dāng)查詢不同的表文件或按不同的字段查詢時(shí)需重新設(shè)計(jì)查詢程序。為此,筆者設(shè)計(jì)了一個(gè)通用的查詢表單,只需改變使用的表文件名即可。 2 設(shè)計(jì)思想 通用查詢表單設(shè)計(jì)界面如圖1所示。表單中使用了兩個(gè)組合框Combo1、Combo2和一個(gè)文本框Text1。Combo1用于顯示表文件的字段名,Combo2用于顯示符號(hào),Text1用于輸入查詢條件值。表格控件Grid1用于顯示查詢到的記錄。 本例中使用的表文件為:rsxx.dbf,表文件中有六種類型的字段:C(字符型)、N(數(shù)值型)、L(邏輯型)、D(日期型)、M(備注型)、G(通用型)。備注型及通用型字段通常不做查詢,為了僅將C、N、L、D四種類型的字段的字段名自動(dòng)顯示在Combo1中,需要先生成rsxx.dbf表文件的結(jié)構(gòu)文件jgwj.dbf,結(jié)構(gòu)文件中的第二個(gè)字段保存的就是原表文件字段的字段類型,由此可判斷出原表文件各字段的類型,用additem方法可將字段名顯示在Combo1控件中。在“查詢”按鈕的click事件代碼中,先要根據(jù)所選擇的字段名、符號(hào)及輸入的值生成條件表達(dá)式bds,然后應(yīng)用set filter to &bds語句來過濾Grid1中顯示的數(shù)據(jù)即可;不同數(shù)據(jù)類型的字段,條件表達(dá)式的寫法是不同的,詳細(xì)描述見源程序。 設(shè)計(jì)中為了判斷字段的類型用到了表文件rsxx.dbf的結(jié)構(gòu)文件jgwj.dbf。結(jié)構(gòu)文件是一種特殊的表文件,它是針對(duì)某個(gè)表文件的,用于保存該表文件的結(jié)構(gòu)內(nèi)容,當(dāng)前選定表內(nèi)每個(gè)字段的信息被復(fù)制到新表(結(jié)構(gòu)文件)的一條記錄中。新表的結(jié)構(gòu)在格式上固定,由16個(gè)字段組成,前四個(gè)字段為:FIELD_NAME、FIELD_TYPE、FIELD_LEN和FIELD_DEC,分別對(duì)應(yīng)于字段描述項(xiàng)的字段名、類型、寬度和小數(shù)位數(shù)。結(jié)構(gòu)文件的記錄是所對(duì)應(yīng)的那個(gè)表文件的字段描述內(nèi)容。不同表文件的結(jié)構(gòu)文件之間其差別只在于數(shù)據(jù)記錄的不同。生成結(jié)構(gòu)文件的命令格式為:copy to <結(jié)構(gòu)文件名> structure extended 3 具體實(shí)現(xiàn) 3.1 表單設(shè)計(jì)界面
圖1 通用查詢表單設(shè)計(jì)界面 3.2 表單數(shù)據(jù)環(huán)境 在表單數(shù)據(jù)環(huán)境中添加表:rsxx.dbf。 3.3 屬性設(shè)置 表1 通用查詢表單屬性設(shè)置 表1 通用查詢表單屬性設(shè)置
3.4 事件代碼 (1)表單Form1的Load事件代碼 set century on &&年份用四位表示 set date to ymd &&日期格式為年、月、日 set mark to "-" &&指定顯示日期表達(dá)式時(shí)所使用的分隔符 set safety off &&在刪除結(jié)構(gòu)文件時(shí)不顯示對(duì)話框 erase jgwj.dbf &&刪除表結(jié)構(gòu)文件 (2)表單Form1的Unload事件代碼 *在表單釋放時(shí)關(guān)閉結(jié)構(gòu)文件 select jgwj use (3)Combo1的Init事件代碼 *在組合框中列出表文件中的C、N、L、D四種類型的字段 select rsxx a=fcount() &&計(jì)算表文件的字段個(gè)數(shù) public dimension zu[a,2] copy to jgwj structure extended &&生成結(jié)構(gòu)文件 select 0 use jgwj i=1 do while i<=a zdm=fields(1) &&得到字段名 zu[i,1]=&zdm &&將字段名賦值給數(shù)組 zdlx=fields(2) &&得到字段類型 zu[i,2]=&zdlx &&將字段類型賦值給數(shù)組 *將C、N、L、D四種類型的字段的字段名列出在組合框中 if &zdlx="C" or &zdlx="N" or &zdlx="L" or &zdlx="D" thisform.combo1.additem(alltrim(&zdm)) endif i=i+1 skip enddo (4)Combo2的Init事件代碼 *組合框中增加各種符號(hào) this.additem("=") this.additem("<") this.additem("<=") this.additem(">") this.additem(">=") this.additem("<>") (5)“查詢”按鈕的click事件代碼 select rsxx jls=fcount() &&計(jì)算字段個(gè)數(shù) s1=alltrim(thisform.combo1.value) &&字段名 s2=alltrim(thisform.combo2.value) &&符號(hào) s3=alltrim(thisform.text1.value) &&查詢值 *對(duì)選定的字段名判斷字段類型 i=1 do while i<=jls if s1=alltrim(zu(i,1)) zdlx=zu(i,2) &&字段類型 endif i=i+1 enddo *判斷輸入數(shù)據(jù)的合法性,并組成條件表達(dá)式 do case case zdlx="C" &&字符型字段 bds=s1+s2+(" '&s3' ") &&查詢條件表達(dá)式 case zdlx="N" &&數(shù)值型字段 if type(s3)="N" bds=s1+s2+s3 else messagebox("基本工資應(yīng)為數(shù)值型!","提示") cancel endif case zdlx="L" &&邏輯型字段 if s3="t" or s3="T" or s3="y" or s3="Y" s3="t" else if s3="f" or s3="F" or s3="n" or s3="N" a3="f" else messagebox("輸入錯(cuò)誤!"+chr(13)+"邏輯真:T、t、Y或y"; +chr(13)+"邏輯假:F、f、N或n","提示") cancel endif endif bds=s1+s2+"."+("&s3")+"." case zdlx="D" &&日期型字段 s3y=substr(s3,1,4) &&年份 s3m=substr(s3,6,2) &&月份 s3d=substr(s3,9,2) &&日 s35=substr(s3,5,1) &&間隔符號(hào) s38=substr(s3,8,1) &&間隔符號(hào) if s35<>"-" or s38<>"-" or (not between(s3y,"1900","2100")) ; or (not between(s3m,"01","12")) or (not between(s3d,"01","31")) messagebox("日期輸入錯(cuò)誤!" +chr(13) +"示例: 2004-08-01","提示") cancel endif bds=s1+s2+"{^"+("&s3")+"}" endcase *顯示滿足條件的記錄 set filter to &bds thisform.refresh 3.5 運(yùn)行結(jié)果 查詢1977年9月以前出生的記錄后,結(jié)果如圖2所示。
圖2 通用查詢表單運(yùn)行結(jié)果 4 結(jié)束語 本程序在Visual FoxPro 6.0中調(diào)試通過,如果表文件發(fā)生了改變,只需改變以下地方即可:改變表單數(shù)據(jù)環(huán)境中的表文件;在表格的RecordSource屬性中重新設(shè)置新的表文件作為數(shù)據(jù)源;在Combo1的init事件代碼中將select rsxx的表文件名rsxx改為新的表文件名;在查詢按鈕的click事件代碼中將select rsxx的表文件名rsxx改為新的表文件名。讀者稍加修改就可以設(shè)計(jì)出符合自己要求的任意查詢、通用查詢、組合查詢表單,并方便地應(yīng)用到自己的應(yīng)用系統(tǒng)中去。它具有通用性,能快速設(shè)計(jì)出查詢表單。 |
|
|