1

我正在尝试在 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:这里要求的是作为 ZIP 的 DB 文件。它是一个 Access 2007 .accdb 文件
DB 文件

4

2 回答 2

1

我猜你的一个字段名称有错字。找到它的最简单方法是Debug.Print strSQL在您的行之前立即添加Set qdf...一行。

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

于 2012-05-28T13:15:52.670 回答
1

您的 SQL 语句将从 db 引擎触发错误 #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... 让自己有机会检查您要求数据库引擎执行的已完成语句。

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

' Execute created Query '
CurrentDb.Execute strSQL, dbFailOnError

如果您更改为这种方法(如您在问题中指出的那样),它可以正常工作:

qdf.Execute
于 2012-05-28T14:35:58.183 回答