在Access VBA中运行参数查询
我试图在VBA函数中运行以下查询。我一直得到“参数太少,预期1”。在Access VBA中运行参数查询
strSQL = "Parameters [Report Date] DateTime;" & vbCrLf & _
"SELECT SCF.code AS [Stock Code], " & vbCrLf & _
"SCF.desc AS [Description], " & vbCrLf & _
"SCF.grp AS [Product Group]," & vbCrLf & _
"SCF.qCurr AS [Closing Stock], " & vbCrLf & _
"SCF.abp AS [Avg Price], " & vbCrLf & _
"Sum(([Closing Stock]*[Avg Price])) AS [STOCK VALUE], " & vbCrLf & _
"MaxDate.tDate AS [Last Transaction Date], " & vbCrLf & _
"Sum(IIf(([Last Transaction Date]>[Report Date]),([Closing Stock]*[Avg Price]),0)) AS [After Report Date], " & vbCrLf & _
"DateDiff(""d"",[Last Transaction Date],[Report Date]) AS [Days since Last Transaction], " & vbCrLf & _
"[Report Date]" & vbCrLf & _
"INTO [FinReport] " & vbCrLf & _
"FROM SCF RIGHT JOIN MaxDate ON MaxDate.parent = SCF.this "
strSQL = strSQL & _
"WHERE (SCF.qCurr <> 0) " & vbCrLf & _
"GROUP BY SCF.code, " & vbCrLf & _
"SCF.desc, " & vbCrLf & _
"SCF.grp, " & vbCrLf & _
"SCF.qCurr, " & vbCrLf & _
"SCF.abp, " & vbCrLf & _
"MaxDate.tDate" & vbCrLf & _
"ORDER BY MaxDate.tDate;"
Set qdf = db.CreateQueryDef("", strSQL)
qdf.Parameters("[Report Date]").Value = Form_IO_Form.ReportDate_TB.Value
qdf.Execute
我已经验证了所有领域(当然比[报告日期]等)存在和查询本身作为访问查询运行(弹出询问[报告日期])。
帮助!
编辑1: 按此处要求将DB文件作为ZIP文件。它是一个Access 2007.accdb文件
DB File
你的SQL语句将引发错误#3122从数据库引擎:
You tried to execute a query that does not include the specified expression 'DateDiff("d",[Last Transaction Date],[Report Date])' as part of an aggregate function.
这错误将导致之前数据库引擎甚至考虑任何参数的语句失败。
当您使用VBA构建SQL语句时,最好从数据库引擎将接受的一个开始。然后,您还应该遵循@ mwolfe02至Debug.Print strSQL
的声音建议...给自己一个机会来检查您要求db引擎执行的完整语句。
编辑:检查了您上传的ACCDB文件后,我仍不明白为什么您的查询不会触发错误#3122。但是,查询确实可以作为保存的查询工作,并且可以在从VBA代码执行时起作用。你得到关于“参数太少”的抱怨的原因是你实际上并没有执行你创建的临时QueryDef。相反,你试图执行这样的SQL文本:
' Execute created Query '
CurrentDb.Execute strSQL, dbFailOnError
如果你改变这种做法(如你在你的问题所示),它的工作原理没有错误:
qdf.Execute
我猜你在你的字段名称中有一个错字。找到它的最简单方法是在您的Set qdf...
行之前立即发出Debug.Print strSQL
行。
然后在Access UI中创建一个新查询,切换到SQL视图,从即时窗口粘贴SQL文本并执行查询。访问会提示您输入Report Date
(您所期待的)和您的某个字段的错误输入名称。
我会注意到,你不应该在每行中都需要'&vbCrLf'。编译器不关心新行。除非你真的需要打印查询来查看。无论如何,vbNewLine无论如何都是首选。 – BIBD
@codeslave:vbcrlf使查询字符串对于我和任何未来的程序员来说更具可读性和可理解性。我会修改我的代码并使用vbnewline ... – 147
@CodeSlave为什么你更喜欢'vbNewLine'而不是'vbCrLf'? – HansUp