陳 元
(中國建筑西北設計研究院有限公司,陜西西安 710018)
Gm d VFP中使用函數對檔案數據庫進行模糊查詢
陳元
(中國建筑西北設計研究院有限公司,陜西西安 710018)
VFP6.0是一種優秀的小型數據庫管理軟件,功能齊全,程序語言簡潔直觀,將它作為工具用于單位工程檔案數據庫的建立與管理是比較理想的選擇。用這兩種方法設計的檢索程序在投入實際工作后,在快速查找,數據匯總等方面大大提高了工作效率,使用至今,比較穩定可靠,給檔案處日常工作帶來的便利是實實在在的,目前準備繼續擴展功能,從而使其更好地在工作中發揮作用。
VFP 函數 檔案數據庫
本單位使用VFP的表設計器建立了30多年已歸檔的工程檔案數據,包含設計編號,工程名稱,子項名稱,設計單位,設總姓名,底圖柜,歸檔時間,設計階段,電子文件等字段,數據庫文件名為shuju. dbf,目前記錄了約3萬個項目的信息,只列舉少數部分如表1。
對數以萬計的記錄如果靠手工查詢統計,效率是很低下的。所以必需設計相應的程序,應當說明的是,數據庫處于基礎位置,所有程序都是對它進行操作,數據庫文件本身的重要性不言而喻。
工作中要求對工程名稱,子項名稱等實施快速檢索,輸入關鍵字后將符合要求的記錄輸出,如果找不到則輸出空白提示。對此,最簡單的辦法是直接使用查詢數據庫記錄命令FIND和SEEK,但這兩個命令都有一個不盡人意的地方,雖然它們也可以模糊查詢,并不一定要求輸入的關鍵字與記錄的字段內容完全一致,但卻要求輸入的關鍵字必須是數據庫記錄內容字符串前面的一部分才認為匹配成功,而在實際中,我們很難作到輸入的關鍵字一定是數據庫記錄的前一個或幾個關鍵字,假如,查詢子項名稱時輸入“大廈”,名稱為“信息大廈”的記錄卻被濾掉,這在實際工作中是絕不被允許的,而且如果輸入為空時,FIND和SEEK會立即報錯并退出整個程序,穩定性也不令人滿意。

表1
為解決這個問題,可以在VFP中采取了如下兩種方法做到真正的模糊查詢,首先介紹函數法,使用STORE SPACE()TO和READ命令建立內存變量用于讀入用戶輸入的關鍵字,建立的內存變量應有能容納5個漢字以上的空間以確保能夠接受內容多少不一的關鍵字,然后用RTRIM()和LTRIM()函數除去輸入內容左右兩邊的空格,除去空格的目的是,1.絕大多數情況下,空格不是查找的關鍵字,2.如果輸入的關鍵字未能占滿內存變量,那么輸入的內容將是“輸入的關鍵字+剩余的幾個空格”,所以必需要以經處理的字符串作為查詢依據,然后打開數據庫,用SORT命令重排數據庫——按需要查詢的字段名排序(相當于使用FIND、SEEK命令前對數據庫的索引),打開新數據庫,建立循環,接著就是最關鍵的一步——利用判斷子串函數AT()去判斷經處理后的關鍵字是否為第一個相應字段內容的子串,如果是則將該記錄全部或部分字段內容輸出,不是則繼續用AT()判斷下一條記錄的相應字段內容。在滿足條件記錄較多的情況下,可以輸出幾條記錄后就用CLEAR命令清屏,在原位置上重新輸出,直到將所有記錄判斷完畢,結束循環。
如果對子項名稱執行檢索,程序代碼如下:(注:程序后引號內文字是對程序的說明)
SET TALK OFF
CLEAR
DO WHILE.T.
STORE SPACE(12) TO DG
@ 8,18 SAY"請輸入關鍵字:" GET DG
READ “建立并提示輸入關鍵字,并讀入”
DG1=RTRIM(DG)
DG2=LTRIM(DG1) “除去空格”
CLEAR
F=2
USE shuju.dbf
SORT ON 工程名稱 TO shuju1
USE
USE TUSHU1“對數據庫排序,打開新數據庫”
DO WHILE .not.eof()
DX=工程名稱
IF AT(DG2,DX)<>0 “判斷是否滿足條件,是則輸出全部
@ f,15 say 工程名稱 字段內容,否則判斷下一條記錄”
@ f,87 say 子項名稱
F=F+1
@ f,22 say 合同號
@ f,59 say 設計所
@ f,77 say 底圖柜
F=F+1
@ f,22 say 設總
@ f,85 say 歸檔時間
F=F+1
@ F,15 SAY"記錄分界線"
SKIP
F=F+1
ELSE
SKIP
ENDIF
if f=18 “屏幕已滿,用亮帶提示繼續查找或結束”
F=F+1
@F,20 PROMPT"繼續"MESSAGE""
@F,40 PROMPT"結束"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"" “數據庫查找完畢,用亮帶
@F,50 PROMPT"結束退出"MESSAGE"" 提示開始新的查找或結束”
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下運行通過)
這種方法實現了真正意義的模糊查詢,如果對程序稍加修改,輸入多個字符串,在一次循環中使用多次AT()函數,就能實現多字段的復合查找,如果使用在程序中使用SET DEVICE TO FILE(PRINTER)命令,就可以將查找的的內容直接輸出到文件或打印機。嚴格說,這個過程是重組數據庫然后再按順序對其查找,因此速度肯定不及FIND和SEEK命令,但實際使用中是感覺不到的,主要存在的問題是,程序代碼比較多,程序設計有相當多“@”命令,只是為了設置屏幕輸出的位置,而且,查詢結果不能直接生成文件,所以還是有值得改進的地方。
“面向對象”設計的方法具有人機對話界面直觀,在設計器中直接建立完成,程序代碼相對較少等優點,而且輸出結果能夠一次完成,拖動滾動條即可全部顯示,直接調用菜單欄的“另存”即可生成文件,快捷方便,程序不再需要繁瑣的屏幕輸出顯示設置,因此編程工作得到了簡化。首先使用表單設計器直接建立起應用界面如圖1。
仍舊使用原來的數據庫文件shuju.dbf,直接用于查詢的命令語句仍需在對應的設計器內使用函數,除原先的AT函數可用外,SELECT命令同樣有此功能且更加簡潔,讀入輸入的數據,首先也要濾掉空格,在SELSCT命令行加入LIKE選項,判斷其是否是被查詢字段的子串,是則選中,否則對下一條字段內容繼續判斷,比對完所有數據庫后將選中的記錄按設定的順序全部輸出,找不到時直接輸出空表。選擇子項名稱后運行界面及源代碼如下圖2;圖3。
點擊“確定”源代碼如下
PUBLIC GUJ1
DO form GUJ1
PUBLIC M
M=GUJ1.TEXT1.TEXT
M1=RTRIM(M)
M2=LTRIM(M1)
M3="%"+M2+"%"
select 設計編號,子項號,工程名稱,子項名稱 FROM shuju WHERE 工程名稱 LIKE M3 ORDER BY 設計編號
CLOSE ALL
GUJ1.RELEASE
點擊“退出”源代碼如下
GUJ.RELEASE
(上述程序在VFP6.0下運行通過)
結語:用這兩種方法設計的檢索程序在投入實際工作后,在快速查找,數據匯總等方面大大提高了工作效率,使用至今,比較穩定可靠,給檔案處日常工作帶來的便利是實實在在的,目前準備繼續擴展功能,發揮檔案處已保存有多年的電子文件的優勢,將在查詢結果追加一個鏈接輸出,指向被查詢項目CAD文件在硬盤的存儲路徑,用戶只需選擇打開就能看到CAD文件。實現看到文字和數字結果的同時也能迅速找到圖形信息的目的。程序設計的目的是為了為現實工作服務,因此,歡迎為以上程序設計的不足提供寶貴的修改意見,使其更好地在工作中發揮作用。