电竞比分网-中国电竞赛事及体育赛事平台

分享

通用查詢表單的設(shè)計(jì)與實(shí)現(xiàn)

 happyngkmw 2012-06-30

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ì)界面

Visual FoxPro中通用查詢表單的設(shè)計(jì)與實(shí)現(xiàn)  - 湔雪折梅 - 湔雪折梅-第五胡同

圖1 通用查詢表單設(shè)計(jì)界面

3.2 表單數(shù)據(jù)環(huán)境

在表單數(shù)據(jù)環(huán)境中添加表:rsxx.dbf。

3.3 屬性設(shè)置

表1 通用查詢表單屬性設(shè)置

表1 通用查詢表單屬性設(shè)置

對(duì)象名

屬性

屬性值

說明

Form1

Caption

通用查詢表單

設(shè)置表單標(biāo)題

 

AutoCenture

.T.

表單自動(dòng)居中

Label1

Caption

字段:

設(shè)置標(biāo)簽標(biāo)題

Combo1

Style

2-下拉列表框

指定組合框樣式為下拉列表框

 

DisplayValue

1

指定組合框中初始顯示的內(nèi)容

Label2

Caption

操作符:

設(shè)置標(biāo)簽標(biāo)題

Combo2

Style

2-下拉列表框

指定組合框樣式為下拉列表框

 

DisplayValue

1

指定組合框中初始顯示的內(nèi)容

Label3

Caption

值:

設(shè)置標(biāo)簽標(biāo)題

Text1

 

 

 

Grid1

RecordSource

rsxx

設(shè)置表格數(shù)據(jù)源

Command1

Caption

查詢

設(shè)置命令按鈕標(biāo)題

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所示。

Visual FoxPro中通用查詢表單的設(shè)計(jì)與實(shí)現(xiàn)  - 湔雪折梅 - 湔雪折梅-第五胡同

圖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ì)出查詢表單。   

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多