在Access VBA中运行参数查询

时间:2012-05-28 10:51:04

标签: sql ms-access vba parameterized

我正在尝试在VBA函数中运行以下查询。我不断得到“参数太少。预计1。”

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

2 个答案:

答案 0 :(得分:1)

我猜你的一个字段名称中有拼写错误。找到它的最简单方法是在Debug.Print strSQL行之前立即抛出Set qdf...行。

然后在Access UI中创建一个新查询,切换到SQL视图,从即时窗口粘贴SQL文本,然后执行查询。 Access会提示您输入Report Date(您期望的)以及您的某个字段的输入错误的名称。

答案 1 :(得分:1)

您的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.

在db引擎甚至考虑任何参数之前,该错误将导致语句失败。

使用VBA构建SQL语句时,最好从数据库引擎接受的语句开始。然后你还应该遵循@ mwolfe02到Debug.Print strSQL的声音建议......让自己有机会检查你要求db引擎执行的已完成语句。

编辑:检查过您上传的ACCDB文件后,我仍然不明白为什么您的查询不会触发错误#3122。但是,查询确实可以作为已保存的查询使用,并且可以在从VBA代码执行时查询。您收到“参数太少”的投诉的原因是您实际上并没有执行您创建的临时QueryDef。相反,您试图像这样执行SQL文本:

' Execute created Query '
CurrentDb.Execute strSQL, dbFailOnError

如果您更改为此方法(正如您在问题中指出的那样),则无误地运行:

qdf.Execute