2013-02-14 27 views
1

我是相當新的VBA(與本網站 - 所以道歉,如果我發佈這個錯誤),以前是一個SQL開發人員,但不幸的是我的新工作包括只訪問2010的工作。我試圖建立一個VBA宏,它將運行各種更新語句。我在訪問中構建了查詢,並試圖在vba中調用查詢。我試圖用一個訪問查詢來做到這一點,我跑到UPDATE語句中的運行時錯誤 - 語法錯誤。查詢在訪問中運行良好,但vba函數因運行時錯誤而失敗。訪問VBA - 運行時錯誤在更新宏

以下是我的VBA函數:

Public Function TestUpdate1() 
Dim cmdT As ADODB.Command 
Dim cnn As ADODB.Connection 
Dim prmT As ADODB.Parameter 

Set cnn = Application.CurrentProject.Connection 
Set cmdT = New ADODB.Command 
Set cmdT.ActiveConnection = cnn 
cmdT.CommandText = "Update Table 1" 
cmdT.CommandType = adCmdText 

'Set prmT = cmdT.Parameters("Acc_Date") 
'prmT.Value = #12/31/2012# 
cmdT.Execute 

'Set cmdT = Nothing 
' 
'If Err <> 0 Then 
' cmdT.ActiveConnection.RollbackTrans 
'Else 
' cmdT.ActiveConnection.CommitTrans 
'End If 
End Function 

當調試上線cmdt.Execute發生錯誤的功能。它正在執行

SQL查詢(更新表1)如下:

UPDATE Table_1 SET Product = IIf(Contract Like "*budget*amt*","BUDGET Annual", 
IIf(Contract Like "*CLASSIC*AMT*","CLASSIC Annual", 
IIf(Contract Like "*essential*AMT*","ESSENTIAL Annual", 
IIf(Contract Like "*P*PLUS*AMT*","Premier Plus Annual", 
IIf(Contract Like "*SELECT*AMT*","SELECT Annual", 
IIf(Contract Like "*prestige*AMT*","PRESTIGE Annual", 
IIf(Contract Like "*GAP*","GAP Productl", 
IIf(Contract Like "*SINGLE*TRIP*","SINGLE TRIP", 
IIf(Contract Like "*premier*","PREMIER Annual", 
IIf(Contract Like "*standard*","STANDARD Annual", 
IIf(Contract Like "*EVAC*","European VAC","???"))))))))))), End_Date = Depart_Date+Days; 

任何幫助,您可以在上面會衷心感謝給予。

非常感謝

+1

錯誤是什麼? – 2013-02-14 14:09:25

回答

0

此代碼試圖執行SQL語句:更新表1

cmdT.CommandText = "Update Table 1" 
cmdT.CommandType = adCmdText 
cmdT.Execute 

執行查詢命名更新表1,你需要這樣的代碼:如果你不這樣做想了解有關即將進行更新行數警告,

With DoCmd 
    .SetWarnings False 
    .OpenQuery "Update Table 1" 
    .SetWarnings True 
End With 

這是代碼,我用使用的Access項目運行參數化查詢和ADODB

Dim cmdl As ADODB.Command 
Dim StrCon As New ADODB.Connection 
Dim rsRecSet As New ADODB.Recordset 

StrCon.Open CurrentProject.Connection 

'Set CONNECTION timeout property 
StrCon.CommandTimeout = 0 

'Create a new command object to process the stored proc 
Set cmdl = New ADODB.Command 

With cmdl 
    .ActiveConnection = StrCon 
    'set COMMAND timeout property - query can time out on either the connection OR the command 
    .CommandTimeout = 0 
    .CommandText = "spCrossTabRun" 
    .CommandType = adCmdStoredProc 
    .Parameters.Refresh 
    .Parameters(1).value = "MyValue1" 
    .Parameters(2).value = "MyValue2" 
    .Parameters(3).value = "MyValue3" 
    Set rsRecSet = .Execute() 
End With 
+0

嗨肖恩,謝謝你的迴應。我打算去DoCmd路線,但是這是幾個更新中的第一個。其中一個更新有參數,所以我決定使用ADODB,因爲我不確定是否可以使用DoCmd傳遞參數。您可以使用ADODB執行Access查詢還是隻使用SQL Server?對不起,但正如我剛纔提到的VBA初學者 – 2013-02-14 22:13:14

+0

@GraemeWilson,增加了一個ADODB的例子。使用Access項目(這是我用ADODB連接假設的),你不能在數據庫本身存儲任何查詢。所有的視圖和過程將在SQL服務器上 – SeanC 2013-02-15 17:35:56

0

我有一對夫婦的集中函數返回對adodb記錄集的只讀或讀/寫訪問。像:

Public Function dbWrite(SQLQuery As String, Optional blDynamic As Boolean) As ADODB.Recordset 
'Centralized function to read data from db, return a EDITABLE recordset 
Dim r As New ADODB.Recordset 

If blDynamic = True Then 
    r.Open SQLQuery, CurrentProject.Connection, adOpenDynamic, adLockOptimistic, dbSQLPassThrough 
Else 
    r.Open SQLQuery, CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic, dbSQLPassThrough 
End If 

Set dbWrite = r 

Exit Function 
End function 

這麼稱呼它,一個新的函數中:

Public Function SomeFunction 
Dim r As New ADODB.Recordset 
Dim s As String 
set r = dbwrite("SELECT * FROM TABLE;") 
s = "My Parameterized Value" 
r.AddNew 
    r![Fieldname] = s 
    r.Update 
r.Close 
set r = nothing 
End function 

具有dbWrite功能使事情變得簡單,並且一次解析出的字段名一個可以很容易地調用另一個函數,一個簡單的IF或什麼的。