我试图通过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 Code I使用
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
答案 0 :(得分:0)
我很少评论代码,但我很遗憾不得不说这段代码真是太可怕了,你不应该对你得到的错误感到惊讶。
这里有很多种错误,最大的一种是这个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调试到查询编辑器中,您就会发现错误。
我所能预测的是,如果你继续编写这样的代码,很长一段时间你会感到非常痛苦,如果有些东西看起来有用,我也不会感到惊讶,实际上不能正常工作。
编写任何人都可以阅读的代码 至少写你可以阅读的代码......