[英]In Excel VBA run SQL "SELECT ... INTO ... IN ...." Statement
我似乎找不到任何好的參考或示例來說明如何使其工作。 我有一個存儲在 AS/400 上的數據庫(我的本地 MS Access 數據庫 [存儲在網絡驅動器上] 已使用 ODBC/DSN 將表鏈接到 400)。 我的實用程序可以很好地將 SQL 語句傳遞到 Access 以使用鏈接表從 400 中檢索數據。 問題在於,對於一些較大的報告以及 400 距離幾個州的事實,運行報告可能需要幾個小時。 確定的解決方案是創建所需表的本地“副本”,僅使用與報告相關的數據集,這是一個相當小的數據集。 顯然,這有不是“實時”數據的缺點,但我可以接受。 最終我想要做的是從鏈接表中收集相關數據並將其保存到客戶端本地的單獨數據庫中,以便在離線/離線時可以使用它並提高報告速度。
網絡位置存儲數據庫 = DB1(表鏈接到 AS/400)本地客戶端存儲數據庫 = DB2(由以下 SQL 創建的相關數據集,非鏈接表與鏈接表命名相同)
下面是我嘗試使用 VBA 和 DAO 開始工作的 SQL 語句
SELECT
DB1_TABLEA.FIELD1,
DB1_TABLEA.FIELD2,
DB1_TABLEA.FIELD3,
DB1_TABLEA.FIELD4,
DB1_TABLEA.FIELD5,
DB1_TABLEA.FIELD6,
DB1_TABLEA.FIELD7,
DB1_TABLEA.FIELD8
INTO
DB1_TABLEA IN 'Local_DB_Copy.accdb' <== Creating non-linked copy
FROM
DB1_TABLEA
WHERE
(
((DB1_TABLEA.FIELD4) Like 99999)
AND
((DB1_TABLEA.FIELD6)="02" Or (DB1_TABLEA.FIELD6)="22")
)
;
我已經讓我的程序正常工作並從 AS/400 DB 返回/處理數據。 我只需要能夠使上述工作正常工作,以便人們可以選擇運行處理速度更快的本地副本。
下面是我嘗試過的代碼,但當然它失敗了,否則我不會在這里。
Sub gCreateLocalDBTables()
Dim DBPath As String
Dim LocalDBPath As String
Dim sSQL As String
Dim DB As DAO.Database
Dim DB2 As DAO.Database
Dim RS As DAO.Recordset
LocalDBPath = "AS400_Local.accdb"
sSQL = "SELECT DB1_TABLEA.FIELD1, DB1_TABLEA.FIELD2, DB1_TABLEA.FIELD3, DB1_TABLEA.FIELD4, DB1_TABLEA.FIELD5, DB1_TABLEA.FIELD6, DB1_TABLEA.FIELD7, DB1_TABLEA.FIELD8 INTO DB2_TABLEA IN '" & LocalDBPath & "' FROM DB1_TABLEA WHERE (((DB1_TABLEA.FIELD4) Like 99999) AND ((DB1_TABLEA.FIELD6)='02' Or (DB1_TABLEA.FIELD6)='22'));"
Set DB = OpenDatabase(LocalDBPath, False, False)
DB.TableDefs.Delete ("DB2_TABLEA")
DB.Close
DBPath = Interaction.GetSetting("Cust_Tools", "Settings\Report_Planning", "400DB_Location")
Set DB2 = OpenDatabase(DBPath, False, False)
Set RS = DB2.OpenRecordset(sSQL)
RS.Close
DB2.Close
Set RS = Nothing
Set DB = Nothing
Set DB2 = Nothing
End Sub
我知道 SQL 可以正常工作,因為我已經從 MS Access 內部對其進行了測試。 我只是找不到有關如何使其工作的信息從 Excel VBA 傳遞
您不能將像生成表查詢(即, SELECT
和INTO
調用)這樣的操作查詢分配給記錄集。 在打開本地表上的記錄集之前,請考慮執行DROP
和SELECT ... INTO
操作查詢。 此外,不清楚您為什么要打開第二個數據庫或路徑指向什么。 下面在大型機數據上打開一個記錄集:
Set DB = OpenDatabase(LocalDBPath, False, False)
DB.Execute "DROP TABLE DB2_TABLEA", dbFailOnError
DB.Execute sSQL, dbFailOnError
Set RS = DB.OpenRecordset("SELECT * FROM DB2_TABLEA")
此外,生成表查詢中的IN
子句是不必要的,因為您當前連接到正在運行操作的數據庫。 只需將其刪除(
'" & LocalDBPath & "'
)。 此外,沒有通配符和數字的LIKE
表達式應替換為=
SELECT
DB1_TABLEA.FIELD1,
DB1_TABLEA.FIELD2,
DB1_TABLEA.FIELD3,
DB1_TABLEA.FIELD4,
DB1_TABLEA.FIELD5,
DB1_TABLEA.FIELD6,
DB1_TABLEA.FIELD7,
DB1_TABLEA.FIELD8
INTO
DB2_TABLEA
FROM
DB1_TABLEA
WHERE
(
((DB1_TABLEA.FIELD4) = 99999)
AND
((DB1_TABLEA.FIELD6)='02' OR (DB1_TABLEA.FIELD6)='22')
)
;
事實上,考慮將查詢保存在 MS Access 數據庫中(功能區 -> 創建 -> 查詢設計 -> SQL 視圖)並將其作為命名對象調用,並避免在 VBA 中使用任何長 SQL。
DB.Execute "DROP TABLE DB2_TABLEA", dbFailOnError
DB.Execute "mySavedQuery", dbFailOnError
Set RS = DB.OpenRecordset("SELECT * FROM DB2_TABLEA")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.