运行查询时出现运行时错误 3075 MS Access VBA

Posted

技术标签:

【中文标题】运行查询时出现运行时错误 3075 MS Access VBA【英文标题】:Runtime Error 3075 MS Access VBA when running query 【发布时间】:2014-08-01 21:29:19 【问题描述】:

我正在尝试通过 VBA 代码运行此查询,但出现“运行时 3075 错误”。我试图以不同的方式重组,但没有成功。它作为查询运行良好。

这是原始查询:

SELECT DISTINCT TB_Vendor.Vend_name, TB_POLine.ord_no, IIf(IsNull([cus_name]),StrConv([bill_to_name],3),StrConv([cus_name],3)) AS Customer, TB_POLine.user_def_fld_2, IIf(IsNumeric([CS_CLIENTOENTRY].[request_dt]) And IsNull([CS_CLIENTOENTRY1].[ord_dt]),DateSerial(Left$([CS_CLIENTOENTRY].[request_dt],4),Mid$([CS_CLIENTOENTRY].[request_dt],5,2),Right$([CS_CLIENTOENTRY].[request_dt],2)),IIf(IsNumeric([CS_CLIENTOENTRY1].[ord_dt]) And IsNull([CS_CLIENTOENTRY].[request_dt]),DateSerial(Left$([CS_CLIENTOENTRY1].[ord_dt],4),Mid$([CS_CLIENTOENTRY1].[ord_dt],5,2),Right$([CS_CLIENTOENTRY1].[ord_dt],2)),Null)) AS [Request Date], DateSerial(Left$([TB_POHeader].[ord_dt],4),Mid$([TB_POHeader].[ord_dt],5,2),Right$([TB_POHeader].[ord_dt],2)) AS [Order Date], IIf([TB_POLine].[promise_dt]<>0,DateSerial(Left$([TB_POLine].[promise_dt],4),Mid$([TB_POLine].[promise_dt],5,2),Right$([TB_POLine].[promise_dt],2)),Null) AS [Promise Date], TB_POHeader.user_name, TB_POHeader.ord_status, TB_POLine.move_to_loc, IIf([vchr_no]=0,"Received",IIf([vchr_no]>0,"Vouchered",IIf(DateDiff("d",Date(),[TB_POLine Query].[Pro Date])<=0,"Late","On Time"))) AS Status, TB_POHeader.cmt_2, TB_POHeader.cmt_3, TB_POHeader.cmt_1
FROM [TB_POLine Query] RIGHT JOIN (CS_Receivings RIGHT JOIN (CS_CLIENTOENTRY1 RIGHT JOIN (CS_CLIENTOENTRY RIGHT JOIN (TB_POHeader RIGHT JOIN (TB_Vendor RIGHT JOIN TB_POLine ON TB_Vendor.vend_no = TB_POLine.vend_no) ON TB_POHeader.ord_no = TB_POLine.ord_no) ON CS_CLIENTOENTRY.[Ticket #] = TB_POLine.user_def_fld_2) ON CS_CLIENTOENTRY1.[Ticket #] = TB_POLine.user_def_fld_2) ON CS_Receivings.ord_no = TB_POLine.ord_no) ON [TB_POLine Query].ord_no = TB_POLine.ord_no
GROUP BY TB_Vendor.Vend_name, TB_POLine.ord_no, IIf(IsNull([cus_name]),StrConv([bill_to_name],3),StrConv([cus_name],3)), TB_POLine.user_def_fld_2, IIf(IsNumeric([CS_CLIENTOENTRY].[request_dt]) And IsNull([CS_CLIENTOENTRY1].[ord_dt]),DateSerial(Left$([CS_CLIENTOENTRY].[request_dt],4),Mid$([CS_CLIENTOENTRY].[request_dt],5,2),Right$([CS_CLIENTOENTRY].[request_dt],2)),IIf(IsNumeric([CS_CLIENTOENTRY1].[ord_dt]) And IsNull([CS_CLIENTOENTRY].[request_dt]),DateSerial(Left$([CS_CLIENTOENTRY1].[ord_dt],4),Mid$([CS_CLIENTOENTRY1].[ord_dt],5,2),Right$([CS_CLIENTOENTRY1].[ord_dt],2)),Null)), DateSerial(Left$([TB_POHeader].[ord_dt],4),Mid$([TB_POHeader].[ord_dt],5,2),Right$([TB_POHeader].[ord_dt],2)), IIf([TB_POLine].[promise_dt]<>0,DateSerial(Left$([TB_POLine].[promise_dt],4),Mid$([TB_POLine].[promise_dt],5,2),Right$([TB_POLine].[promise_dt],2)),Null), TB_POHeader.user_name, TB_POHeader.ord_status, TB_POLine.move_to_loc, IIf([vchr_no]=0,"Received",IIf([vchr_no]>0,"Vouchered",IIf(DateDiff("d",Date(),[TB_POLine Query].[Pro Date])<=0,"Late","On Time"))), TB_POHeader.cmt_2, TB_POHeader.cmt_3, TB_POHeader.cmt_1
HAVING (((DateSerial(Left$([TB_POHeader].[ord_dt],4),Mid$([TB_POHeader].[ord_dt],5,2),Right$([TB_POHeader].[ord_dt],2)))>#1/1/2014#) AND ((TB_POHeader.ord_status)<>"C"))
ORDER BY TB_POLine.ord_no DESC;

我正在使用的 VBA 代码

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim StrSql As String
Dim cns As QueryDef
Dim teste As String
Dim teste2 As String

Dim RstSql As QueryDef

'Set RstSql = Application.CurrentDb.QueryDefs("Consulta1")
Set db = CurrentDb()

StrSql = "SELECT DISTINCT TB_Vendor.Vend_name, TB_POLine.ord_no, IIf(IsNull([cus_name]),StrConv([bill_to_name],3),StrConv([cus_name],3)) AS Customer, TB_POLine.user_def_fld_2, IIf(IsNumeric([CS_CLIENTOENTRY].[request_dt]) And, " & _
"IsNull([CS_CLIENTOENTRY1].[ord_dt]),DateSerial(Left$([CS_CLIENTOENTRY].[request_dt],4),Mid$([CS_CLIENTOENTRY].[request_dt],5,2),Right$([CS_CLIENTOENTRY].[request_dt],2)),IIf(IsNumeric([CS_CLIENTOENTRY1].[ord_dt]) And, " & _
"IsNull([CS_CLIENTOENTRY].[request_dt]),DateSerial(Left$([CS_CLIENTOENTRY1].[ord_dt],4),Mid$([CS_CLIENTOENTRY1].[ord_dt],5,2),Right$([CS_CLIENTOENTRY1].[ord_dt],2)),Null)), " & _
"AS [Request Date], DateSerial(Left$([TB_POHeader].[ord_dt],4),Mid$([TB_POHeader].[ord_dt],5,2),Right$([TB_POHeader].[ord_dt],2)) AS [Order Date], " & _
"IIf([TB_POLine].[promise_dt]<>0,DateSerial(Left$([TB_POLine].[promise_dt],4),Mid$([TB_POLine].[promise_dt],5,2),Right$([TB_POLine].[promise_dt],2)),Null) AS [Promise Date], TB_POHeader.user_name, TB_POHeader.ord_status, TB_POLine.move_to_loc, TB_POHeader.cmt_2, TB_POHeader.cmt_3, TB_POHeader.cmt_1, " & _
"FROM TB_POLine Query] RIGHT JOIN (CS_Receivings RIGHT JOIN (CS_CLIENTOENTRY1 RIGHT JOIN (CS_CLIENTOENTRY RIGHT JOIN (TB_POHeader RIGHT JOIN (TB_Vendor RIGHT JOIN TB_POLine ON TB_Vendor.vend_no = TB_POLine.vend_no) ON TB_POHeader.ord_no = TB_POLine.ord_no) ON CS_CLIENTOENTRY.[Ticket #] = TB_POLine.user_def_fld_2) ON CS_CLIENTOENTRY1.[Ticket #] = TB_POLine.user_def_fld_2) ON CS_Receivings.ord_no = TB_POLine.ord_no) ON [TB_POLine Query].ord_no = TB_POLine.ord_no "

If Not IsNull(Comb1.Value) Then
    teste = teste & " [CS_POStatus].[user_name] = '" & Comb1.Value & "'"
End If

If teste = " WHERE " Then
    teste = " WHERE TB_CS_POStatus.[ser_name]='Null';"
Else
    teste = teste '& ";"

End If

Set rs = db.OpenRecordset(StrSql & teste)

Set RstSql = Application.CurrentDb.QueryDefs("CS_POStatus")
RstSql.SQL = StrSql & teste & " ORDER BY CS_POStatus.ord_no;"

If teste = ";" Then
    MsgBox ("Please select at least one search criteria.")
Else
    If rs.RecordCount = 0 Then
        MsgBox ("There are no results for this search")
    End If

    Lista8.Requery

    Me.Refresh

End If
End Sub

【问题讨论】:

【参考方案1】:

我很少评论代码,但很抱歉不得不说这段代码真的很可怕,你不应该对遇到无法修复的错误感到惊讶。

这里的错误有很多种,最大的就是这个SQL查询读不出来。

话虽如此:

SQL VBA 的第一行以And, 结尾,, 没有意义。

第二行也有同样的问题。

您的第三行还以额外的, 结尾,这会导致下一行的AS [Request Date] 独立,这也会产生错误。

您的第四行也以额外的, 结尾。由于 ti 的下一行是 FROM,因此您还会收到一条错误消息。

你的第六行错过了[FROM TB_POLine Query] 应该是FROM [TB_POLine Query]

您说查询是相同的,但它们不是。您说有效的查询有一个GROUP BY 和一个HAVING VBA 查询没有的子句...

你必须认真考虑更加细致:

格式化您的 SQL,即使在 VBA 中也是如此。使用 SQL Pretty Printer 之类的东西或其他一些免费软件或在线服务来帮助您。

清理您的代码:您用于构建 teste 的代码可能无法在您尝试检查的所有各种情况下工作。

在测试 VBA 构建 SQL 代码时,在 SQL 传递给OpenRecordset 的位置放置一个断点,将其打印到即时窗口并将其复制到新的 SQL 查询中以检查查询编辑器的位置抱怨。如果您至少尝试将生成的 VBA SQL 调试到查询编辑器中,您就会发现错误。

我所能预测的是,如果你继续编写这样的代码,你会在很长一段时间内承受很大的痛苦,如果某些方法看起来有效,我不会感到惊讶,实际上不能正常工作。

编写任何人都可以阅读的代码。 至少写出可以阅读的代码...

【讨论】:

以上是关于运行查询时出现运行时错误 3075 MS Access VBA的主要内容,如果未能解决你的问题,请参考以下文章

在连接上更新时出现MS Access语法错误

带有子查询的 SQL 查询上的 MS Access VBA 运行时错误 3075

Microsoft Visual Basic - 运行时错误“3075:查询表达式“1st”、“A”、1-Jan-15'、“1”中的语法错误(缺少运算符))

运行时错误'3075':查询表达式中的语法错误

使用查询变量时出现 Gatsby 运行时错误

使用多选列表框后出现错误 3075-运行查询