2013-03-21 175 views
0

我的問題不是專門尋找解決方案的想法,更多的是對我自己的解決方案進行完整性檢查,因爲我已經工作了一段時間(至少有兩個主要修訂版) Excel VBA中的ADODB。數據透視表動態查詢到外部數據源

所以情況是這樣的。我爲想要訪問數據庫視圖的大塊的用戶創建Excel報告,該視圖太大而不適合內存。用戶需要能夠訪問所有的視圖,所以硬編碼過濾器是不可能的。除非我錯過了一個更優雅的解決方案,他們需要的是能夠以生成的SQL語句的形式動態控制連接上的過濾器,該語句將饋入到pivotcache中,然後告訴該數據透視表刷新。

我創建了一個「刷新」按鈕,它將顯示一個窗體,其中包含用戶通常需要的所有過濾器。用戶輸入過濾器值,我解析並驗證它們,從這些值中形成適當的SQL語句。然後當我這樣做時遇到問題:

'this has to be dynamic becuase I'm distributing to multiple users, using different testing/production databases on different workstations. 
mypivottable.PivotCache.Connection = "ODBC;" & driver & myserver & myuser & trusted & app & workstationid & databse 

'this also has to be dynamic becuase of the sql filters 
mypivottable.PivotCache.CommandText = sql 

因此,我按下按鈕,它的工作原理!設置這些屬性後,pivottable將自動刷新,因爲它知道緩存後面有新數據,並根據新條件提取查詢結果。

問題是,當我查看外部數據源列表時,每當我更改這些屬性時,它都會創建一個新的連接,並且不會自行清理。 100次使用後,有100個連接鋪設,其中99個未使用。如果我刪除所有的連接,那麼它將不可逆轉地中斷數據透視表。

有沒有更好的方法來做到這一點?是否有程序化的方法來清理未使用的連接?

回答

1

如果您只需更新SQL語句,則不必重置連接。其實,我也有類似的問題,這,這是怎麼解決它:

Sub test() 
' add logic... 

    ' then change sql code 
    With ThisWorkbook.Connections("your connection name").OLEDBConnection 
      .CommandText = Array("select * from mytable where id = 1") ' adjust accordingly 
      .Refresh 
    End With 
End Sub 

你真正需要做的是抓住當前的連接,然後更新CommandText屬性。順便說一句,我不知道爲什麼我需要使用Array(),但我沒有它的問題。

我其實寫了一篇關於使用SQL創建數據透視表(link here)的博客文章。也許我應該做出另一個關於創建動態內容:)