Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 以编程方式将参数传递到access报告中_Vba_Ms Access - Fatal编程技术网

Vba 以编程方式将参数传递到access报告中

Vba 以编程方式将参数传递到access报告中,vba,ms-access,Vba,Ms Access,我有一个现有的访问MDB。我正在向运行现有报表的现有窗体添加一个命令按钮。所做的更改是,此按钮需要传入一个参数,该参数包含报告的记录的ID—当前报告在MDB中的每个记录上运行 我已经修改了报表运行的查询,以使用ID值的参数,因此,现在当单击按钮时,Access会提示输入要报告的记录ID,并且报表会按其应有的方式显示 但是,我一辈子都不知道如何将参数传递到报表中供查询使用。如何执行此操作?DoCmd.OpenReport方法有各种参数,其中一个是Where语句: DoCmd.OpenReport"

我有一个现有的访问MDB。我正在向运行现有报表的现有窗体添加一个命令按钮。所做的更改是,此按钮需要传入一个参数,该参数包含报告的记录的ID—当前报告在MDB中的每个记录上运行

我已经修改了报表运行的查询,以使用ID值的参数,因此,现在当单击按钮时,Access会提示输入要报告的记录ID,并且报表会按其应有的方式显示


但是,我一辈子都不知道如何将参数传递到报表中供查询使用。如何执行此操作?

DoCmd.OpenReport方法有各种参数,其中一个是Where语句:

DoCmd.OpenReport"rptReport", acViewPreview,,"ID=" & Me.ID
就是

expression.OpenReport(ReportName, View, FilterName, WhereCondition, WindowMode, OpenArgs)

我处理这类问题的一般方法是将条件保存在数据库中,通常是一个只有一行的控制表。然后,为了引用您的条件,您在paranthesis中放置了一个查询,该查询返回您想要的条件的一个值。在您的情况下,它将类似于:

(select reportID from control)

这种技术的优点是,控制表会记住下次运行报告时的设置。当然,ReportID将绑定到表单中的字段。我还喜欢这样一个事实,即您的查询与表单隔离;它们可以独立于表单运行

我不知道为什么每个人都想把事情弄得这么复杂

  • 保存报表的recordsource(不带参数)

  • 按照Remou的建议,在DoCmd.OpenReport的相应参数中传递条件


  • 试图以任何其他方式实现这一点都将是抵制在Access中完成任务的自然方法的问题。

    docmd.openreport的Where子句是一个字符串,它使用的格式与SQL语句中的Where子句相同


    将参数化查询放在docmd而不是报表的RecordSource的原因是灵活性。您可能需要在没有任何参数的情况下打开报告/返回所有记录,或者能够在不同字段上进行筛选

    我知道这是一篇老文章,但这篇文章花了我一点时间。错误为“无效使用parren”,但问题是字段名中的空格。我正在从一个数据库创建一个报告,有人犯了一个常见的错误,空格

    要在数据库字段有空格时通过where子句将参数传递给查询,请使用以下示例:

    DoCmd.OpenReport "rptByRegionalOffice", acViewPreview, , "[" & "Regional Office" & "]" & "=" & "'" & cmboOffices.Value & "'"
    

    如果您仔细想想,您会发现这将产生
    where[Regional Office]='string value'
    ,正如您在access sql中所期望的那样。

    我认为这是最干净的方法。啊哈!这就是我要找的!谢谢,Remou。我使用的是Access 2003,“WhereCondition”属性实际上是第四个参数,因此在上面的示例中,您只需要两个逗号,即:DoCmd.OpenReport“rptrept”、acViewPreview、、“ID=”&Me.ID。这个答案应该得到改进,以减少对“FilterName”参数的排除不明确。i、 e.由于大多数报告都有一个现有的或嵌入的查询,“记录源”和“WhereCondition”是需要传递给报告的全部内容。OpenArgs参数在用于打开报表时也过于苛刻,因为它需要更多的努力才能实现,并且更常用于DoCmd.OpenForm。您需要进行大量不必要的连接。您真正需要的是:“[Regional Office]=”&cmboOffices.Value&“”。如果[地区办事处]可以包含“'”字符,请小心。在Access中,字符串使用双引号是很正常的,因此:“[Regional Office]=”&Chr(34)&cmboOffices.Value&Chr(34)此外,在对象名称中添加空格(以及非字母数字字符)只是您应该停止的操作。因为您可以,很多人都这样做,但这是因为他们没有注意到字段名及其标题可以单独设置,因此字段RegionalOffice的标题属性可以是“RegionalOffice”。这意味着,当您将其放在表单或报表上时,它将自动具有人性化的标题(带空格),而字段名是SQL友好的(即不需要括号)。