在子报表中过滤

Filtering in subreport

我在为我的雇主开发数据库应用程序的过程中遇到了在报告中使用 "filtering menus" 的问题。

对于我的过滤选项,我使用 OnClick 事件创建了按钮:

DoCmd.GoToControl "MyReportField"
DoCmd.RunCommand acCmdFilterMenu

这些按钮嵌入在子报表中。最初的想法是创建按钮,类似于功能区中的按钮,带有过滤选项(在开发的最后阶段,我计划 disable/hide 为用户访问功能区)。我创建了 5 个按钮,3 个用于数据类型为 Text 的字段,1 个用于数据类型 Date 和 1 个用于 Boolean 数据类型。

引用经典,按钮 "are misbehaving." 当我在表单视图中测试它们在表单中的功能时,点击时 "BooleanFilterBtn" 已经不显示 Yes/No 选项(或其他内容类似),但显示 2 个数值(如 -24441 或 -29696)。而且过滤器根本不起作用。

当我尝试一次激活多个过滤器时,会出现另一个问题。日期字段过滤器和其中一个文本字段过滤器在与另一个过滤器选项结合使用时可以正常工作。但是在使用剩下的两个文本字段过滤器之一后,当我单击任何其他过滤按钮时,FilterMenu 变为空白。

值得注意的是,右键单击报告中的给定字段没有问题,但不是我想要的方式。

鉴于这些相当奇怪的行为,我想我错过了一些东西。有没有办法让 FilterMenus 以功能区中熟悉的方式工作?如果没有,是否有任何其他具有类似设计的选项,我可以尝试的选项?

附加信息:

子报表通过表单连接"MyIDField."子报表和表单都有查询数据源,已保存

所有字段名称和数据类型都匹配。

编辑:我还应该写到,如果我单独打开子报表,FilterBtns 不起作用,它们仅在我打开表单(其中包含子报表)时起作用,尽管 FilterBtns 仅使用报表中的控件.

EDIT2:过滤按钮过滤布尔数据类型背后的代码(布尔数据以 Yes/No 检查字段的形式报告,如以下 June7 评论中所述):

Private Sub btn_FiltrGarant_Click()
DoCmd.GoToControl "Garant"
DoCmd.RunCommand acCmdFilterMenu
End Sub

当我将此代码更改为:

Private Sub btn_FiltrGarant_Click() 
Me.Garant.SetFocus 
DoCmd.RunCommand acCmdFilterMenu 
End Sub

没有带来任何影响,只是实际FilterMenu的加载时间有点长。

文本数据类型字段示例:

Private Sub btn_FiltrRzh_Click()
DoCmd.GoToControl "ZkracenyNazev"
DoCmd.RunCommand acCmdFilterMenu
End Sub

以同样的方式更改代码:

Private Sub btn_FiltrRzh_Click() 
Me.ZkracenyNazev.SetFocus 
DoCmd.RunCommand acCmdFilterMenu 
End Sub

同样没有效果。

可能是 FilterMenu 并不意味着 to/available 在报告中使用?或者它可能在 Access 的默认设置中被禁用?

还因为这种情况,如果我单独打开报表(不是以子报表的形式,而是在报表视图中单独打开报表),使用任何 FilterBtns 都会给我运行时错误 2046,该操作GoToControl 不可用。更改为 SetFocus 可消除错误,但该按钮根本不会调出任何 FilterMenu。但是这些问题只有在我单独打开报告时才有效(这不是我的兴趣),但可能会有所帮助。

现在,我不知道问题出在哪里。我能想到的就是数据 type/naming 不匹配,但事实并非如此。

最终编辑:经过将近一个月的尝试和搜索如何使此设置工作的方法,我决定从子报表切换到子窗体,我将在其中尝试获得相同的功能。 也许只是报告不应该按照我想要的方式处理。

出于礼貌,我将 6 月 7 日的回答作为经过验证的答案,因为我花时间帮助了我。

谢谢。

您必须小心如何引用子窗体容器中的报表对象。它们在许多方面与子表单的行为不同。

即使是简单的刷新实际上也很难实现,因为报表并不像表单那样动态

要在 VBA 中引用它,您必须使用完整形式的语法;

[Forms]![MainFormName].[Form]![subReportHolderName].Requery

使用普通的 Me.blah.blah 引用将不适用于表单嵌入报表。请注意,您指的是容器 - 而不是报告对象。

不知道为什么您的 yes/no 字段在过滤器菜单中显示 2 个数值,例如 -24441 或 -29696。无论如何,根本无法让过滤器菜单作用于 yes/no 字段。但是,使用报表 RecordSource 查询中的表达式将 Yes/No 字段从布尔值更改为文本值并在报表设计中使用计算字段来解决这个问题,例如:

SELECT *, IIf([fieldname], "Yes", "No") AS IsSomethingTrue FROM tablename;

使用 Me.controlname.SetFocus 而不是 GoToControl,这样报告将独立打开或作为子对象打开。