陳 元
(中國(guó)建筑西北設(shè)計(jì)研究院有限公司,陜西西安 710018)
Gm d VFP中使用函數(shù)對(duì)檔案數(shù)據(jù)庫進(jìn)行模糊查詢
陳元
(中國(guó)建筑西北設(shè)計(jì)研究院有限公司,陜西西安 710018)
VFP6.0是一種優(yōu)秀的小型數(shù)據(jù)庫管理軟件,功能齊全,程序語言簡(jiǎn)潔直觀,將它作為工具用于單位工程檔案數(shù)據(jù)庫的建立與管理是比較理想的選擇。用這兩種方法設(shè)計(jì)的檢索程序在投入實(shí)際工作后,在快速查找,數(shù)據(jù)匯總等方面大大提高了工作效率,使用至今,比較穩(wěn)定可靠,給檔案處日常工作帶來的便利是實(shí)實(shí)在在的,目前準(zhǔn)備繼續(xù)擴(kuò)展功能,從而使其更好地在工作中發(fā)揮作用。
VFP 函數(shù) 檔案數(shù)據(jù)庫
本單位使用VFP的表設(shè)計(jì)器建立了30多年已歸檔的工程檔案數(shù)據(jù),包含設(shè)計(jì)編號(hào),工程名稱,子項(xiàng)名稱,設(shè)計(jì)單位,設(shè)總姓名,底圖柜,歸檔時(shí)間,設(shè)計(jì)階段,電子文件等字段,數(shù)據(jù)庫文件名為shuju. dbf,目前記錄了約3萬個(gè)項(xiàng)目的信息,只列舉少數(shù)部分如表1。
對(duì)數(shù)以萬計(jì)的記錄如果靠手工查詢統(tǒng)計(jì),效率是很低下的。所以必需設(shè)計(jì)相應(yīng)的程序,應(yīng)當(dāng)說明的是,數(shù)據(jù)庫處于基礎(chǔ)位置,所有程序都是對(duì)它進(jìn)行操作,數(shù)據(jù)庫文件本身的重要性不言而喻。
工作中要求對(duì)工程名稱,子項(xiàng)名稱等實(shí)施快速檢索,輸入關(guān)鍵字后將符合要求的記錄輸出,如果找不到則輸出空白提示。對(duì)此,最簡(jiǎn)單的辦法是直接使用查詢數(shù)據(jù)庫記錄命令FIND和SEEK,但這兩個(gè)命令都有一個(gè)不盡人意的地方,雖然它們也可以模糊查詢,并不一定要求輸入的關(guān)鍵字與記錄的字段內(nèi)容完全一致,但卻要求輸入的關(guān)鍵字必須是數(shù)據(jù)庫記錄內(nèi)容字符串前面的一部分才認(rèn)為匹配成功,而在實(shí)際中,我們很難作到輸入的關(guān)鍵字一定是數(shù)據(jù)庫記錄的前一個(gè)或幾個(gè)關(guān)鍵字,假如,查詢子項(xiàng)名稱時(shí)輸入“大廈”,名稱為“信息大廈”的記錄卻被濾掉,這在實(shí)際工作中是絕不被允許的,而且如果輸入為空時(shí),F(xiàn)IND和SEEK會(huì)立即報(bào)錯(cuò)并退出整個(gè)程序,穩(wěn)定性也不令人滿意。
表1
為解決這個(gè)問題,可以在VFP中采取了如下兩種方法做到真正的模糊查詢,首先介紹函數(shù)法,使用STORE SPACE()TO和READ命令建立內(nèi)存變量用于讀入用戶輸入的關(guān)鍵字,建立的內(nèi)存變量應(yīng)有能容納5個(gè)漢字以上的空間以確保能夠接受內(nèi)容多少不一的關(guān)鍵字,然后用RTRIM()和LTRIM()函數(shù)除去輸入內(nèi)容左右兩邊的空格,除去空格的目的是,1.絕大多數(shù)情況下,空格不是查找的關(guān)鍵字,2.如果輸入的關(guān)鍵字未能占滿內(nèi)存變量,那么輸入的內(nèi)容將是“輸入的關(guān)鍵字+剩余的幾個(gè)空格”,所以必需要以經(jīng)處理的字符串作為查詢依據(jù),然后打開數(shù)據(jù)庫,用SORT命令重排數(shù)據(jù)庫——按需要查詢的字段名排序(相當(dāng)于使用FIND、SEEK命令前對(duì)數(shù)據(jù)庫的索引),打開新數(shù)據(jù)庫,建立循環(huán),接著就是最關(guān)鍵的一步——利用判斷子串函數(shù)AT()去判斷經(jīng)處理后的關(guān)鍵字是否為第一個(gè)相應(yīng)字段內(nèi)容的子串,如果是則將該記錄全部或部分字段內(nèi)容輸出,不是則繼續(xù)用AT()判斷下一條記錄的相應(yīng)字段內(nèi)容。在滿足條件記錄較多的情況下,可以輸出幾條記錄后就用CLEAR命令清屏,在原位置上重新輸出,直到將所有記錄判斷完畢,結(jié)束循環(huán)。
如果對(duì)子項(xiàng)名稱執(zhí)行檢索,程序代碼如下:(注:程序后引號(hào)內(nèi)文字是對(duì)程序的說明)
SET TALK OFF
CLEAR
DO WHILE.T.
STORE SPACE(12) TO DG
@ 8,18 SAY"請(qǐng)輸入關(guān)鍵字:" GET DG
READ “建立并提示輸入關(guān)鍵字,并讀入”
DG1=RTRIM(DG)
DG2=LTRIM(DG1) “除去空格”
CLEAR
F=2
USE shuju.dbf
SORT ON 工程名稱 TO shuju1
USE
USE TUSHU1“對(duì)數(shù)據(jù)庫排序,打開新數(shù)據(jù)庫”
DO WHILE .not.eof()
DX=工程名稱
IF AT(DG2,DX)<>0 “判斷是否滿足條件,是則輸出全部
@ f,15 say 工程名稱 字段內(nèi)容,否則判斷下一條記錄”
@ f,87 say 子項(xiàng)名稱
F=F+1
@ f,22 say 合同號(hào)
@ f,59 say 設(shè)計(jì)所
@ f,77 say 底圖柜
F=F+1
@ f,22 say 設(shè)總
@ f,85 say 歸檔時(shí)間
F=F+1
@ F,15 SAY"記錄分界線"
SKIP
F=F+1
ELSE
SKIP
ENDIF
if f=18 “屏幕已滿,用亮帶提示繼續(xù)查找或結(jié)束”
F=F+1
@F,20 PROMPT"繼續(xù)"MESSAGE""
@F,40 PROMPT"結(jié)束"MESSAGE""
SET MESSAGE TO 20
D=1
MENU TO D
DO CASE
CASE D=1
F=2
CLEAR
LOOP
CASE D=2
CLEAR
EXIT
ENDCASE
ENDIF
ENDDO
F=F+1
IF F=3 “提示未能找到符合條件的記錄”
@6,35 SAY"未找到匹配的記錄"
ENDIF
@F,30 PROMPT"重新開始"MESSAGE"" “數(shù)據(jù)庫查找完畢,用亮帶
@F,50 PROMPT"結(jié)束退出"MESSAGE"" 提示開始新的查找或結(jié)束”
C=1
SET MESSAGE TO 20
MENU TO C
DO CASE
CASE C=1
CLEAR
LOOP
CLEAR
CASE C=2
EXIT
CLEAR
ENDCASE
ENDDO
CLEAR
USE
DELETE FILE TUSHU1.DBF
RETURN
(上述程序在VFP6.0下運(yùn)行通過)
這種方法實(shí)現(xiàn)了真正意義的模糊查詢,如果對(duì)程序稍加修改,輸入多個(gè)字符串,在一次循環(huán)中使用多次AT()函數(shù),就能實(shí)現(xiàn)多字段的復(fù)合查找,如果使用在程序中使用SET DEVICE TO FILE(PRINTER)命令,就可以將查找的的內(nèi)容直接輸出到文件或打印機(jī)。嚴(yán)格說,這個(gè)過程是重組數(shù)據(jù)庫然后再按順序?qū)ζ洳檎?,因此速度肯定不及FIND和SEEK命令,但實(shí)際使用中是感覺不到的,主要存在的問題是,程序代碼比較多,程序設(shè)計(jì)有相當(dāng)多“@”命令,只是為了設(shè)置屏幕輸出的位置,而且,查詢結(jié)果不能直接生成文件,所以還是有值得改進(jìn)的地方。
“面向?qū)ο蟆痹O(shè)計(jì)的方法具有人機(jī)對(duì)話界面直觀,在設(shè)計(jì)器中直接建立完成,程序代碼相對(duì)較少等優(yōu)點(diǎn),而且輸出結(jié)果能夠一次完成,拖動(dòng)滾動(dòng)條即可全部顯示,直接調(diào)用菜單欄的“另存”即可生成文件,快捷方便,程序不再需要繁瑣的屏幕輸出顯示設(shè)置,因此編程工作得到了簡(jiǎn)化。首先使用表單設(shè)計(jì)器直接建立起應(yīng)用界面如圖1。
仍舊使用原來的數(shù)據(jù)庫文件shuju.dbf,直接用于查詢的命令語句仍需在對(duì)應(yīng)的設(shè)計(jì)器內(nèi)使用函數(shù),除原先的AT函數(shù)可用外,SELECT命令同樣有此功能且更加簡(jiǎn)潔,讀入輸入的數(shù)據(jù),首先也要濾掉空格,在SELSCT命令行加入LIKE選項(xiàng),判斷其是否是被查詢字段的子串,是則選中,否則對(duì)下一條字段內(nèi)容繼續(xù)判斷,比對(duì)完所有數(shù)據(jù)庫后將選中的記錄按設(shè)定的順序全部輸出,找不到時(shí)直接輸出空表。選擇子項(xiàng)名稱后運(yùn)行界面及源代碼如下圖2;圖3。
點(diǎn)擊“確定”源代碼如下
PUBLIC GUJ1
DO form GUJ1
PUBLIC M
M=GUJ1.TEXT1.TEXT
M1=RTRIM(M)
M2=LTRIM(M1)
M3="%"+M2+"%"
select 設(shè)計(jì)編號(hào),子項(xiàng)號(hào),工程名稱,子項(xiàng)名稱 FROM shuju WHERE 工程名稱 LIKE M3 ORDER BY 設(shè)計(jì)編號(hào)
CLOSE ALL
GUJ1.RELEASE
點(diǎn)擊“退出”源代碼如下
GUJ.RELEASE
(上述程序在VFP6.0下運(yùn)行通過)
結(jié)語:用這兩種方法設(shè)計(jì)的檢索程序在投入實(shí)際工作后,在快速查找,數(shù)據(jù)匯總等方面大大提高了工作效率,使用至今,比較穩(wěn)定可靠,給檔案處日常工作帶來的便利是實(shí)實(shí)在在的,目前準(zhǔn)備繼續(xù)擴(kuò)展功能,發(fā)揮檔案處已保存有多年的電子文件的優(yōu)勢(shì),將在查詢結(jié)果追加一個(gè)鏈接輸出,指向被查詢項(xiàng)目CAD文件在硬盤的存儲(chǔ)路徑,用戶只需選擇打開就能看到CAD文件。實(shí)現(xiàn)看到文字和數(shù)字結(jié)果的同時(shí)也能迅速找到圖形信息的目的。程序設(shè)計(jì)的目的是為了為現(xiàn)實(shí)工作服務(wù),因此,歡迎為以上程序設(shè)計(jì)的不足提供寶貴的修改意見,使其更好地在工作中發(fā)揮作用。