一個複合查詢方法

來源:互聯網
上載者:User
幾乎每個完整的應用程式都會需要一個複合查詢。建立一個功能強大的複合查詢首先必須要能夠動態

產生查詢條件,其次應該能夠對查詢到的資料進行修改,最後這個複合查詢最好能夠對一對多的兩個表建

立條件進行查詢。

在VFP裡建立查詢的方法主要有這麼幾種:一是使用VFP中內建的SearchClass類;二是建立一個查詢;

三是建立一個視圖,其中包括參數化視圖、宏替換Sql語句視圖;四是建立一個Grid,將其資料來源設定為

SQL語句或暫存資料表。

不管哪一種方法,其實質都是使用SQL語句。

這幾種方法各有各的優點,也都有缺點。

建立查詢的方法最死板,只能建立固定條件的查詢,並且不能更新資料,最不能滿足要求。

SearchClass類功能強大,但是它只能對一個表建立條件進行查詢,並且它的原始碼太複雜了,幾

乎難以進行修改定製;(初學者想必都有過用表單嚮導建立表單後試圖修改txtbtn類、SearchClass類

的經曆吧!看到原始碼後有幾個沒昏倒?)

用將Grid的資料來源設定為SQL語句或暫存資料表的方法無法修改/更新資料,重新整理資料也比較困難。(這

方面的問題在網易虛擬社區VFP版上有過許多討論,大家可以去看看。)

建立視圖的方法中,參數化視圖也太簡單。不管是用表單控制項的值作參數還是用給參數兩端加上引

號的方法都只能對固定的欄位進行查詢。如果是複合查詢,難道要先建立幾十個視圖嗎?

最有前途的辦法還是用宏替換SQL語句建立視圖的辦法。視圖有著能夠對資料進行修改/更新的優點,

如果能夠動態產生查詢條件,那麼就是最完美的查詢了。

建立宏替換sql語句視圖的具體辦法是先動態產生一個Sql語句sqlstatement,然後用宏替換的方法使

用Create Sql view viewname as &sqlstatement來動態建立視圖,最後將資料動態顯示在一個Grid控

件中。

看到這裡,VFP大蝦們怕會大喊:Stop!你當我是菜鳥啊!你的辦法從理論上雖然行的通,但實際做

起來就會碰到查詢結果在表格上資料無法重新整理的難題。俺早就試過不行了!你想騙稿費啊!

嘿嘿,這個難題偏偏給我解決了!這就是我洋洋得意的寫這篇文章的原因!

問題的解決

==========

幾個月前(好可憐^0^.....),我參照VFP的Sample中的Solution裡的Interactively Bulid a sql

statement樣本建立了一個複合查詢,想將它整合到我自己的程式中。由於該樣本是用browse視窗來顯示

查詢結果的,而我自己的應用程式使用了頂層表單,結果編譯後運行才發現Browse視窗在頂層表單中無法

顯示。於是我建立了一個有兩個表單的表單集,用一個表單makesql動態產生sql語句,在另一個表單

form1上用grid來顯示查詢結果的資料,在給Grid設定資料來源的時候,問題來了。首先使用暫存資料表來作為表

格的資料來源,結果第一次查詢正確,更改條件進行第二次查詢時碰到了眾所周知的“不能更新暫存資料表“的錯

誤;使用sql語句倒是可以,可是在表格顯示資料前會莫名其妙的先出現一個Browse視窗,必須關閉它後

才會顯示表格,由於browse視窗在使用頂層表單的程式中無法顯示,結果導致程式無法繼續執行,這個辦

法也不行。

最後只能使用Create sql view viewname as &sqlstatement的辦法了,先隨便建立一個視圖

tempview,把表格的Recordsourcetype屬性設定為1-別名,Recordsource屬性設定為視圖別名tempview,

在表單makesql上建立sql語句後的代碼中使用create sql view temp view as &sqlstatement建立視圖

Tempview.

執行後發現,第一次查詢正確,更改查詢條件後重新查詢,出現“視圖已存在,要改寫嗎?“的情況,

按下“確定“後,出現的表格中沒有資料。

避免出現對話方塊的問題好解決,在建立視圖前先用rename view tempview to oldview,然後用

Delete view oldview將舊的視圖刪除就可以了。代碼如下:

****************************************************************************

set database to databasename &&databasename是你的資料庫名稱

&&注意:即使你開啟了資料庫也必須寫這個語句!否則會出現“找不到資料庫“的錯誤。

if used(“tempview“)

rename view tempview to oldview

delete view oldview

endif

Create sql view tempview as &sqlstatement

=requery()

IF _TALLY = 0

#DEFINE MSG_LOC “沒有找到合格紀錄!“

#DEFINE TITLE_LOC “沒有找到紀錄“

=MESSAGEBOX(MSG_LOC,64+0+0,TITLE_LOC)

ELSE

thisform.hide

thisformset.form1.show

Endif

*****************************************************************************

但是這樣做了以後,表格上沒有資料的問題仍然存在。尋找資料後發現,用Create sql view語句編

程建立視圖的方法,建立視圖後要先儲存視圖定義,再開啟視圖後視圖中才有資料。因此,必須將Creat

sql view語句部分代碼修改如下:

************************************************

Create sql view tempview as &sqlstatement

use

use tempview

************************************************

滿以為這下問題解決了,結果更慘。出現的表格上不但沒有資料,連表頭、網格都不見了!這個問題

百思不得其解,尋找資料也沒有結果,最後不了了之,一直困擾了我幾個月。

就在昨晚,我上床的時候突然靈光一現:既然表格無法動態載入資料來源檢視,那麼乾脆連包含表格的

表單也動態產生!只要表單動態產生,那麼表單上的表格對象的資料來源不就完全重新載入了嗎?也用不著

重新整理什麼的了!而且,用這個方法也用不著先建立一個tempview視圖,完全在程式中動態產生就可以了。

主意一定,馬上下床動手。將原來包含表格的表單form1刪除,在上述的代碼中最後一句

thisformset.form1.show前插入以下代碼:

*************************************************************

thisformset.addobject(“form1“,“form“)

with thisformset.form1

.



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。