【问题标题】:Filtering Report过滤报告
【发布时间】:2016-06-25 11:03:08
【问题描述】:

我创建了一个表单,希望为用户提供选项过滤报告。该表单具有用于选择选项的列表框、过滤器按钮和清除按钮。在表单的底部,我添加了子报表,以便它可以根据过滤条件进行更新。如何在代码中调出子报表以便过滤?如果我使用Report![List] 直接在报告上执行此操作,它会起作用,但它不会在表单子报告上更新。我也没有得到过滤时显示的所有记录,因为由于If Len(strSubsystem) = 0 Then strSubsystem = "Like '*'" 语句,两个条件之一为空白的记录不会出现。除了"like '*'" 之外,我还可以使用其他语句来显示所有记录吗?

这是代码

Private Sub cmdApplyFilter_Click()
     Dim varItem As Variant
     Dim strSubsystem As String
     Dim strStatus As String
     Dim strFilter As String

' Build criteria string from subsystem listbox
    For Each varItem In Me.lstSubsystems.ItemsSelected
         strSubsystem = strSubsystem & ",'" & Me.lstSubsystems.ItemData(varItem) _
         & "'"
     Next varItem
     If Len(strSubsystem) = 0 Then
         strSubsystem = "Like '*'"
     Else
         strSubsystem = Right(strSubsystem, Len(strSubsystem) - 1)
         strSubsystem = "IN(" & strSubsystem & ")"
     End If
' Build criteria string from status listbox
    For Each varItem In Me.lstStatus.ItemsSelected
         strStatus = strStatus & ",'" & Me.lstStatus.ItemData(varItem) _
         & "'"
     Next varItem
     If Len(strStatus) = 0 Then
         strStatus = "Like '*'"
     Else
         strStatus = Right(strStatus, Len(strStatus) - 1)
         strStatus = "IN(" & strStatus & ")"
     End If

' Build filter string
    strFilter = "[Subsystem] " & strSubsystem & _
                 " AND [Status] " & strStatus

' Apply the filter and switch it on
    With Forms![Filter]
         .Filter = strFilter
         .FilterOn = True
     End With
End Sub

【问题讨论】:

  • 您是否在设计视图中将报表对象拖到表单中?如果是这样,我认为您创建了一个子表单。
  • 是的,当它处于设计视图时,我将报表拖到表单中。我应该用其他方式而不是 With Reports![List] 来称呼它吗?
  • 另外,我修复了“输入参数”问题,但现在我遇到了另一个问题。代码将根据选择进行过滤并返回值。我遇到的问题是某些字段是空白的,因此它不会返回所有记录。有没有另一种方法让它返回所有记录而不是使用 If Len(strStatus) = 0 Then strStatus = "Like '*'"
  • 我尝试使用以下方法,但它显示“对象不支持此属性或方法” With Forms!Filter![List] .Filter = strFilter .FilterOn = True End With
  • [List] 仅当 [List] 直接打开时才可用作 Reports![List],而不是包含在另一个表单或报表中时。

标签: ms-access vba


【解决方案1】:

如果报表作为子表单嵌入并且始终在主表单打开时显示,则不需要检查报表是否打开。打开父表单时子表单会自动打开,因此除非有关闭它的东西,否则您不需要检查。引用子表单时,您应该使用[Forms]! 集合,而不是[Reports]! 集合。查看this page 获取有关引用子表单对象的帮助。

我对您的表单结构并不完全清楚,但参考可能是:

[Forms]![Filter]!SubFormControlNameHere.Report.Filter

【讨论】:

  • 感谢您的回答。 List报表所在的表单名称叫做Filter。我使用了“表单![过滤器]”,它不会根据标准更新表单上的报告。如何指定子报表?感谢您的帮助...我对 VBA 不太了解
【解决方案2】:

您需要做的第一件事是找到包含报表的子表单控件的名称。如果在表单处于设计视图 时难以找到该名称,请从“立即”窗口检查表单的控件。 (Ctrl+g 将带您进入即时窗口。)

这是我的表单示例...

for each ctl in Forms!Form10.controls : ? ctl.name, TypeName(ctl) : next
subReport     SubForm
Label0        Label
txtSort          TextBox
Label2        Label

所以我的子窗体控件被命名为subReport

一旦有了这个名称,我就可以将表单切换回表单视图,并使用子表单控件中包含的ReportFilter 属性...

Forms!Form10!subReport.Report.filter = "id=5"
Forms!Form10!subReport.Report.filteron = true

报告立即被过滤,只显示一个匹配的行。

之后,我关闭了过滤器,但直到我调用Requery(在子窗体控件上),报表显示才改变...

Forms!Form10!subReport.Report.filteron = false
Forms!Form10!subReport.requery

如果我想从也包含在父窗体中的命令按钮的单击事件中进行过滤,我可以快捷方式到控件名称...

Private Sub cmdApplyFilter_Click()
    Me!subReport.Report.Filter = "id=1"
    Me!subReport.Report.FilterOn = True

【讨论】:

  • 最后一件事,具有过滤器参数的框没有空白选项。因此,当它过滤时,它不会显示所有记录。空白没有出现。我相信这是因为strStatus = "Like '*'",因为空白不在过滤器选项中。当没有选择任何记录以显示所有记录时,我可以使用其他语句吗?感谢您的帮助
  • Len(strStatus) = 0 时,将其完全排除在Filter 字符串之外。在这种情况下,只使用这个:strFilter = "[Subsystem] " & strSubsystem
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
相关资源
最近更新 更多