簡體   English   中英

在 MS Access 中處理過濾的直通查詢

[英]Dealing with filtered Pass Through Query in MS Access

我有一個相對復雜的 SQL 查詢(在 Access 中運行很復雜)並且想在 MS Access 中運行它。 它適用於直通查詢,但接下來我將面臨與我在查詢中應用的過濾器相關的問題。 我 select 當前報告日期function 內。 以下是我嘗試處理的查詢的一部分;

select  LS.PID_FACILITY, LS.ASOF_DTE, LS.DATA_CYCLE_FLG,  LS.CUST_ACC, LS.CUST_SMUN, LS.CUST_NME, LS.CUST_CTY, 

WHERE LS.ASOF_DTE='19-SEP-22'

我不想每天手動更改asof_dte過濾器。 如果這是一個正常的訪問查詢,我可以加入另一個只包含當前報告日期的表。 但我不能在直通查詢中做到這一點。 什么是替代方法? 我讀過一些關於創建變量或字符串的內容,但我無法將它們與我的問題聯系起來,因為我是創建此類解決方案的初學者。
謝謝你們。

好吧,這里有兩件非常有趣的事情。

首先,是的,在 PT 查詢中包含日期是個好主意。 但是,您不想每次都更改該日期。

解決方案:向查詢中添加一個參數,然后從 Access 代碼中添加該參數。 做到這一點非常容易(一行代碼。!! - 不要采用那里有大量 ADO 代碼的無數示例 - 不需要!。

但是,在我們開始處理上述內容之前?

一種更好、更簡單、更少工作的方法來解決這個問題?

代替存儲過程?

如果可能,創建一個視圖。 並將其用於報告。

為什么? 因為你會得到兩個非常有價值的獎金。

首先,您可以自由使用reports "where"子句,它尊重where子句,仍然運行服務器端!!!

換句話說,為該現有查詢創建一個視圖,但沒有在該視圖中設置日期。

然后,您從訪問客戶端鏈接到視圖。

現在,要打開(過濾)報告,您可以這樣做:

docmd.OpenReport "MyReport",acViewPreview,,"LS.ASOF_DTE='19-SEP-22'"

現在,當然,上面的“where”子句可以是一個變量(字符串)。

注意這里超級但超級小心:

如果您將報告基於傳遞查詢(然后使用存儲過程),則過濾器出現在客戶端。!!! (如果您的報告基於該存儲過程,則所有行都將被返回並過濾。

但是,如果你使用視圖呢? 過濾器使其到達服務器端!!!!

雖然傳遞查詢或“視圖”都可以使用上面的“打開報告”和我們上面的 where 子句進行過濾?

視圖仍將過濾服務器端 - 傳遞查詢不會!!!

現在,第三種方法當然是構建存儲過程以接受日期參數。

然后你可以這樣做:

with Currentdb.QueryDefs("MyPassThoughQueryGoesHere")
    .SQL = "EXEC MyStoreProc " + "19-SEP-22"
END WITH

docmd.OpenReport "MyReport",acViewPreview

因此,您可以添加並進行 PT 查詢並按照上述添加參數。

但是,除非該存儲過程有一些特殊代碼,否則最好創建一個視圖服務器端,基於該視圖進行報告,然后簡單地傳遞 + 使用打開報告命令的傳統“where”子句。 即使該視圖沒有過濾器,是否返回表中的所有行?

使用打開報告命令的“where”子句,只有符合該條件的行才會被拉下網絡 pipe。

因此,假設有 100 萬行的發票表。

創建一個視圖,在訪問中鏈接該視圖。

基於該觀點的報告。

現在,這樣做:

docmd.OpenReport "rptInvoice",,,"InvoiceNum = 134343"

以上只會從服務器拉下 1 行。 即使視圖沒有過濾器並且會返回 100 萬行。

因此,使用視圖比創建存儲過程的工作量少。

但是,您可以修改存儲過程以接受參數,然后按照說明使用上面的示例修改您擁有的 PT 查詢,然后打開報告。

我認為總體而言,使用視圖的工作量較少。 此外,如果您現在有一份運行緩慢的報告?

將查詢(移動它)替換為 sql 服務器端。 讓它工作。 現在鏈接到該視圖(將其命名為與 Access 中客戶端查詢相同的名稱)。

現在,即使您在 VBA 中有一些花哨的過濾器代碼,並且使用帶有“where”子句的 openReport? 它現在可以工作了,只需將記錄拉到網絡 pipe 上,您就可以輕松獲得存儲過程性能。 打開報告的日期格式和“where”子句是訪問/VBA 樣式 - 不是 sql 服務器樣式 SQL。

因此,強烈建議您嘗試轉儲存儲過程並使用視圖(甚至更好的是任何 where 子句都可以工作 - 不僅僅是一個基於存儲過程的預定義參數的 - 所以你不限於參數)

. 但是,沒什么大不了的 - 如果您希望提供給傳遞查詢的日期參數,上述“EXEC dbo.MyStoreProce”和 strDate 示例也可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM