【问题标题】:MS Access: How to filter report on non-report field?MS Access:如何过滤非报告字段的报告?
【发布时间】:2013-11-22 21:40:37
【问题描述】:

我已经 8 年没有使用 Access 了——我相信我忘记的比我所知道的要多。有人要求我修改一份报告,以便当前显示所有图纸的图纸列表将列出特定客户(或所有客户)的图纸。

我找到了报表使用的嵌套查询,并修改了内部查询以接受一个参数(第一个错误?)。然后我添加了一个新表单来显示客户名称并检索关联的主键 customerId。现在我需要将表单中的客户 ID 提供给报告。 DoCmd.OpenReport 并添加 whereCmd 似乎与参数的 where 条件不匹配。

因此,我删除了查询中的参数,并尝试仅指定条件。只有外部查询不知道 customerId 是什么。我是否需要在内部查询和外部查询中公开它,然后不要在最终报告中使用它,以便我可以在 where 子句中过滤它?

他们还有其他示例代码,这些代码使用表单中的 VBA 在启动报表之前重建查询(添加任何过滤条件)。这肯定不是推荐的做法,对吗?

【问题讨论】:

  • " ... 在启动报告之前重建查询(添加任何过滤条件)" 该查询是否用作报告的记录源?
  • 报表的记录源是外层查询,是的。但它是由外部查询调用的内部查询,它能够识别客户。该信息不是内部结果中的字段,因此在外部不可用,因此我认为我无法对其进行过滤。
  • 根据我的阅读,过滤器优于参数查询。好的,我添加了它,我会收回它。但我无法让过滤器工作,我相信这是因为它不是报告记录源中的一个字段。那么,如果我将字段添加到内部查询和外部查询的字段列表中,是否必须在报表中使用?如果没有在报告中使用,我还能对其进行过滤吗?
  • 您可以在报表的记录源中包含一个字段,而不是在任何报表控件中显示它。
  • 您应该将其发布为答案。这是一种享受!

标签: ms-access


【解决方案1】:

在报告的记录源中包含过滤器字段。然后,您可以在打开报告时对该字段进行过滤。

DoCmd.OpenReport "rptFoo", View:=acViewPreview, _
    WhereCondition:="[id]=1"

WhereCondition 中使用的记录源字段不必由任何报表控件显示...只要它存在于记录源中,它就可以在 中使用>WhereCondition.

【讨论】:

    【解决方案2】:

    我会把这个扔到 OpenArgs 的报告中。在您的表单中,执行以下操作:

    DoCmd.OpenReport strReportName, , , , , Me.CustomerID
    

    然后,在报表的 Load 事件中,读取 OpenArgs 并更改报表的 RecordSource:

    Me.RecordSource = "SELECT * FROM MyTable WHERE CustomerID = '" & Me.OpenArgs & "'"
    

    这是“aircode”,可能需要稍作调整,但它应该能让你真正接近。显然,如果 CustomerID 是一个 INT 字段,则在报告 Load 事件中删除 SQL 中的单引号。

    【讨论】:

    • 我怀疑如果 OP 无法使用 WhereCondition 参数使其工作,那么使用 OpenArgs 就不可能做得更好。
    • 我怀疑我将 where 条件称为错误,但我看不出打开的 args 有什么帮助。它可以在不提示用户的情况下传递参数值吗?再就是所有的文章都说不要在报表和表单记录源中做参数。我会在星期一试一试。
    • 是的,传递 OpenArgs 不会提示用户输入任何内容,您只是通过代码传递变量,所以这一切都在幕后。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多