【问题标题】:How To Pass a Filter Property to a Report AND Add More Criteria to that Filter (Access)如何将过滤器属性传递给报表并向该过滤器添加更多条件(访问)
【发布时间】:2018-05-14 20:29:58
【问题描述】:

我目前正在运行 Access 2007。我有一个允许用户设置参数的报告管理器。自定义日期并允许选择需要修改的日期字段(timecreated、timemodified、txndate)。报告方面工作完美。

在报告(totalshipped)中,用户可以双击报告正文,它会从“大图”摘要转到详细报告(totalshippeddetailed)。 基本上,为了使其正常工作,totalshipped 中的日期和正文中的客户名称(双击)需要在打开时在 totalshippeddetailed 报告中匹配。这是我尝试过的一个示例:

Private Sub ftrReport_DblClick(Cancel As Integer)

DoCmd.OpenReport "TotalShippedDetailed", acViewReport, "", me.filter

End Sub

报告成功打开并将过滤器属性(日期)传递到totalshipped详细报告中,问题是我需要引用[customerref_fullname](客户)以及我使用此行所做的:

[reports]![TotalShipped]![customerref_fullname] = [customerref_fullname] 

这可以作为对客户的引用,但我需要将 me.filter 属性与对 customerref_fullname 的引用结合起来,尝试时出错:

Private Sub ftrReport_DblClick(Cancel As Integer)

  DoCmd.OpenReport "TotalShippedDetailed", acViewReport, "", me.filter & _
  [reports]![TotalShipped]![customerref_fullname] = [customerref_fullname] 

End Sub

我尝试了另一种可行的方法,但不允许报告的详细版本被除 [txndate] 之外的任何内容过滤:

DoCmd.OpenReport "TotalShippedDetailed", acViewReport, "", _
"[reports]![TotalShipped]![customerref_fullname] = [customerref_fullname] and [txndate] >= [forms]![frmrptdatemanager]![txtstartdate] And [txndate] <= [forms]![frmrptdatemanager]![txtenddate]  "

最后,我使用了上面的代码,并尝试以会报错的形式引用日期字段本身:

 DoCmd.OpenReport "TotalShippedDetailed", acViewReport, "", _
"[reports]![TotalShipped]![customerref_fullname] = [customerref_fullname] and [forms]![frmrptdatemanager]![cboDateField] >= [forms]![frmrptdatemanager]![txtstartdate] And [forms]![frmrptdatemanager]![cboDateField] <= [forms]![frmrptdatemanager]![txtenddate]  "

我尝试了更多示例,但没有一个可以实现我的目标:允许用户双击报告正文以查看与主报告相同日期范围的客户的详细报告。

请帮忙!!!!

【问题讨论】:

  • 有一点是肯定的... me.filter & _ [reports]![TotalShipped]![customerref_fullname] = [customerref_fullname] 应该是 me.filter & " 和 " & [reports]! [TotalShipped]![customerref_fullname] & " = """ & [customerref_fullname] & """" .... 或类似的东西...检查结果字符串,它必须看起来像一个合法的过滤器。如果这解决了您的问题,那么我们可以忽略其他死胡同。
  • 上面的建议只有在 me.Filter 不是空字符串的情况下才有效!我建议您首先编写一个好的过滤器字符串,然后使用该过滤器字符串而不是长连接的东西进行调用。更容易阅读,更容易调试。
  • me.filter 永远不会是空字符串,因为打开报告的唯一方法是将字符串传递给它。我不太确定如何简化它,但我会为上面的内容试一试。 @Triwaters问题是字符串不是静态的。它会一直由用户更改。
  • 我仍然收到类型不匹配错误。我最初是怎么做的和上面的解决方案

标签: ms-access vba ms-access-2007


【解决方案1】:

请记住,过滤器参数就像一个 WHERE 子句,前面没有 WHERE 关键字。

你在这里做什么:

  DoCmd.OpenReport "TotalShippedDetailed", acViewReport, "", me.filter & _
  [reports]![TotalShipped]![customerref_fullname] = [customerref_fullname] 

您正在获取现有过滤条件并将其添加到其中,但您没有包含 AND 关键字来链接当前过滤条件和下一个条件。

你需要这样做:

  DoCmd.OpenReport "TotalShippedDetailed", acViewReport, "", me.filter & _
  " AND [reports]![TotalShipped]![customerref_fullname] = '" & [customerref_fullname] & "'"

还要注意,您必须将变量或控件名称连接到过滤器字符串中,以获取变量或控件的值,而不是变量或控件的名称。当它是字符串或日期时,该值还必须使用正确的标点符号进行偏移:字符串值的单引号和日期的井号标签/磅符号。

为了帮助开发和调试这样的事情,我建议使用字符串变量来构建整个过滤条件。在将字符串变量用作 OpenReport 方法中的筛选参数之前检查字符串变量的内容或将值转储到即时窗口 (Debug.Print) 将帮助您在筛选条件中捕获缺失的 AND、缺失的空格和缺失的标点符号。

您的 DblClick 方法将如下所示:

Private Sub ftrReport_DblClick(Cancel As Integer)
  Dim FilterCondition as String

  FilterCondition = me.filter
  FilterCondition = FilterCondition & " AND [txndate] >= #" & [forms]![frmrptdatemanager]![txtstartdate] & "# AND [txndate] <= #" & [forms]![frmrptdatemanager]![txtenddate] & "#"

  Debug.Print FilterCondition

  DoCmd.OpenReport "TotalShippedDetailed", acViewReport, "", FilterCondition

End Sub

【讨论】:

  • 这与我需要的非常接近。我希望像这样添加 [customerref_fullname]:FilterCondition = FilterCondition & " AND [customerref_fullname]= " & [Reports]![TotalShipped]![CustomerRef_FullName] 但现在我遇到了语法错误
  • 我能够找出连接错误。太感谢了!也感谢您的通透解释。
猜你喜欢
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
相关资源
最近更新 更多