过滤子报告

时间:2018-01-08 16:17:48

标签: ms-access access-vba ms-access-2010

我在使用"过滤菜单时遇到了问题"在为我的雇主开发数据库应用程序期间的报告中。

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

DoCmd.GoToControl "MyReportField"
DoCmd.RunCommand acCmdFilterMenu

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

引用经典,按钮"行为不端。"当我在表单视图中以表单形式测试它们的函数时," BooleanFilterBtn"点击已经没有显示是/否选项(或类似的东西),但显示2个数值(如-24441或-29696)。并且过滤器无法正常工作。

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

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

鉴于这些相当奇怪的行为,我认为我错过了一些东西。有没有办法让FilterMenus像丝带一样熟悉?如果没有,是否有其他类似设计的选项,我可以尝试选项?

其他信息:

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

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

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

EDIT2:过滤器按钮过滤后面的代码布尔数据类型(布尔数据在报告中以是/否检查字段的形式,如下面的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无意/可用于报告吗?或者可以在Access的默认设置中禁用它?

因为情况也是如此,如果我单独打开报表(不是作为子报表的形式,而只是作为报表视图中的报表),使用任何FilterBtns给我RunTime错误2046,该操作GoToControl是无法使用。更改为SetFocus可以消除错误,但按钮根本不会显示任何FilterMenu。但是这些问题只有在我单独打开报告时才有效(这不是我感兴趣的),但可能有助于作为信息。

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

最终编辑:经过近一个月(有一些神圣的日子)尝试并寻找如何使这个设置工作的方法我决定从子报告切换到子表单,我将尝试获得相同的功能。 也许只是报告不应该以我想要的方式处理。

出于礼貌,我将6月7日的答案作为验证用于帮助我的时间。

谢谢。

2 个答案:

答案 0 :(得分:0)

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

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

使用Me.controlname.SetFocus代替GoToControl,以便报告可以独立打开或作为子对象打开。

答案 1 :(得分:-1)

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

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

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

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

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