【问题标题】:Passing Parameters to a Report (Report built in parameterised query)将参数传递给报表(报表内置参数化查询)
【发布时间】:2015-12-08 13:20:40
【问题描述】:

我有一个基于参数化查询的报告,该查询需要非常具体的变量,因此我构建了一个带有组合框的表单来收集参数。然后我尝试将变量传递给报告,但是,我无法让它工作,虽然报告打开了,但它一直在询问我认为我正在传递给它的变量。

参数取自点击命令按钮时的表单,收集参数和打开报表的相关代码sn-p如下:

Dim args as String
args = "[Year Ending]=#" & DateSerial(Year(Me.comboYearEnding.Value), Month(Me.comboYearEnding.Value), Day(Me.comboYearEnding.Value)) & "#," & _
" [Budget Round]=" & Me.comboBudgetRound & _
" [Organisational Hierarchy Version]=" & Me.comboOrgHierarchy.Value & _
" [Nominal Hierarchy Version]=" & Me.comboNomHierarchy & _
" [Group ID]=" & Me.comboGroup.Value & _
" [Unit ID]=" & Me.comboUnit.Value & _
" [Department ID]=" & Me.comboDepartment
" DoCmd.OpenReport "rptForecast_4_UoW", View:=acViewPreview, OpenArgs:=args

这将打开报告,并且 args 字符串具有所有正确的值,但是,在打开时,报告会再次询问列出的每个参数,除非我输入它们,否则报告会以“#Type!”打开错误,我假设底层查询没有可使用的参数。

谁能解释我哪里出错并阐明错误所在。

非常感谢,

西蒙

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:

    首先,插入Debug.Print args供你学习。

    其次,日期表达式可能格式不正确,如果Version是字符串,则必须用引号括起来,如果小数点不带点,货币会出错:

    Dim args as String
    args = "[Year Ending]=#" & Format(Me.comboYearEnding.Value, "yyyy\/mm\/dd") & "#," & _
    " [Budget Round]=" & Str(Me.comboBudgetRound) & _
    " [Organisational Hierarchy Version]='" & Me.comboOrgHierarchy.Value & "'" & _
    " [Nominal Hierarchy Version]=" & Me.comboNomHierarchy & _
    " [Group ID]=" & Me.comboGroup.Value & _
    " [Unit ID]=" & Me.comboUnit.Value & _
    " [Department ID]=" & Me.comboDepartment
    " DoCmd.OpenReport "rptForecast_4_UoW", View:=acViewPreview, OpenArgs:=args
    

    编辑

    应该是:

    DoCmd.OpenReport "rptForecast_4_UoW", View:=acViewPreview, WhereCondition:=args
    

    【讨论】:

    • 感谢 Gustav,我使用 debug.print 检查了参数,这就是我知道我已获取所有相应值的方式。此外,由于我在 Excel 和 Access 之间传输日期值做了大量工作,我很久以前就学会了使用 DateSerial,否则几个月/几天可能会混淆。我可以确认日期是从日期/时间数据类型中确定的。我在想 OpenArgs 必须只创建一个过滤器,而不是将值发送到底层参数化查询?
    • 以下 VBA 代码在我从同一表单打开报表基础的查询时可以正常工作,但显然是出于不同的目的。我引入的参数如下(代码的缩短版本,仅显示关键元素):
    • Dim db As DAO.Database Dim qryDef As DAO.QueryDef Set db = CurrentDb Set qryDef = db.QueryDefs("qryForecast_4_UoW") Set qryDef.Parameters("Year Ending")=DateSerial(Year( Me.YearEnding.Value), Month(Me.YearEnding.Value), Day(Me.YearEnding.Value)) qryDef.Parameters("Budget Round")= Me.BudgetRound qryDef.Parameters("Organisational Hierarchy Version")=Me .OrgHierarchy.Value qryDef.Parameters("Nominal Hierarchy Version")=Me.NomHierarchy qryDef.Parameters("Group ID")=Me.Group.Value qryDef.Parameters("Unit ID")=Me.Unit.Value qryDef.参数("部门ID")=Me.Department qryDef.Execute qryDef.Close
    • "我认为 OpenArgs 必须只创建一个过滤器 " .. 不,完全不是。抱歉,我没听懂。您应该使用的不是 OpenArgs,而是过滤。我已经编辑了答案。
    猜你喜欢
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多