2013-02-14 56 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或什么的。