禁用 Report 的 FilterOn 属性时出现运行时错误 -2147417848 (80010108)
Posted
技术标签:
【中文标题】禁用 Report 的 FilterOn 属性时出现运行时错误 -2147417848 (80010108)【英文标题】:Run time error -2147417848 (80010108) when disabling FilterOn property of Report 【发布时间】:2018-06-06 08:20:14 【问题描述】:我正在创建子表单容器中包含的 myReport 的过滤选项。 我使用了这个问题中描述的解决方案: Filtering Report
来自 HansUp。使用 apllyFilterButton 的 OnClick 事件成功创建、存储和应用所描述的代码过滤器。
然后我创建 disableFilterButton 并在 OnClick 事件中将建议的代码放入前面提到的线程中。在测试时,我收到此错误:
“运行时错误'-2147417848 (80010108)':
对象 '_Report_myReport' 的方法 'FilterOn' 失败"
如果我使用 Access Ribbon 启用/禁用过滤器(开关过滤器按钮开/关),一切正常,没有错误。所以我的错误可能很简单,即使在语法上,但我找不到源代码。
代码:
Private Sub disableFilterButton_Click()
Forms![myForm]![myReport].Report.FilterOn = False
Forms![myForm]![myReport].Report.Filter = ""
Forms![myForm]![myReport].Requery
End Sub
崩溃后,使用“调试”选项,上面的第一行代码被突出显示。我在这里和网络周围的研究建议添加“空白过滤器”行,以及注册表问题或代码中的现有循环,这会导致崩溃。但是由于使用功能区按钮一切正常,我认为我缺少一些简单的东西。我还是个初学者。
myFilterButton 中用于创建过滤器的代码尚未完全完成,但应该可以工作:
Private Sub applyFilterButton_Click()
Dim ctl As Control
Dim varVyber As Variant
Dim filtrVolba As String
Dim filtrUplny As String
'Criteria creation for filter SQL
Set ctl = Forms![myForm]![filterOptionOne]
If ctl.ItemsSelected.Count <> 0 Then
For Each varVyber In ctl.ItemsSelected
filtrVolba = filtrVolba & ctl.Column(0, varVyber) & """ OR (sourceQuery.sourceColumn) = """
Next varVyber
filtrVolba = Left$(filtrVolba, Len(filtrVolba) - Len(" OR (qry_sourceQuery.sourceColumn) = "))
Forms![myForm]![myReport].Report.Filter = "(((sourceQuery.fieldBoundToMyReport)=[Forms]![myForm]![TextBoxBoundToMyReport]) AND ((sourceQuery.filterOptionOneSourceField) = """ & filtrVolba & "))"
Forms![myForm]![myReport].Report.FilterOn = True
Else
MsgBox "Not yet"
End If
End Sub
我们将不胜感激!托马斯
【问题讨论】:
奇怪。尝试交换您的.Filter
和 .FilterOn
行(先清除过滤器)。你能分享一下应用过滤器的代码吗?
@ErikvonAsmuth 尝试交换这两行,给出相同的错误(仅交换“过滤器”的方法),在调试时再次突出显示第一行(现在清除过滤器的行)。我使用使用的过滤器代码编辑问题并在评论中通知您。
@ErikvonAsmuth 编辑完成
不要对嵌入在表单中的报告使用过滤器,这似乎很难(不可能)工作。而是将条件添加到您的报告底层记录源并执行重新查询。我有同样的问题,无法解决这个问题,我在表单标题中使用了一个组合作为最后的标准,并重置组合以清除过滤。
这段代码是在 myForm 类文件中,还是在标准模块中?
【参考方案1】:
托马什,
由于您示例中的所有代码都在 myForm 类中,所以让我解释一些 Access 编码基础知识。
[Forms]![Form]![Control]
语法真正适用于查询、表单和报告事件和属性以及宏。虽然在 VBA 中有效,但此语法没有没有编译时验证!所以,像这样的 VBA 行:
varValue = [Forms]![Blah]![BlahBlah] ' doesn't exist
可以编译,但在运行时失败。
具有类模块的表单中的控件成为表单类的公共成员。获取您的表单myForm:您可以使用以下代码在代码中引用它的控件:
varValue = Form_myForm.filterOptionOne.Value
Form_myForm
是表单类的名称。如果filterOptionOne
被重命名或删除,这行代码将抛出错误。
在任何 VBA 类中,Me
指的是该类的公共接口。 “公共接口”只是指类中定义的所有公共函数、子例程和属性。因此,如果您在 myForm 中使用上面的代码行,最好的样式应该是这样的:
varValue = Me.filterOptionOne.Value
Me
在此上下文中将filterOptionOne
限制为在类中实际定义,从而提供进一步的编译时检查。
所以,鉴于这三点,我会像这样重构您的代码:
Private Sub disableFilterButton_Click()
Me.myReport.Report.FilterOn = False
Me.myReport.Report.Filter = ""
Me.myReport.Requery
End Sub
同样:
Private Sub applyFilterButton_Click()
Dim ctl As Control
Dim varVyber As Variant
Dim filtrVolba As String
Dim filtrUplny As String
'Criteria creation for filter SQL
Set ctl = Me.filterOptionOne
If ctl.ItemsSelected.Count <> 0 Then
For Each varVyber In ctl.ItemsSelected
filtrVolba = filtrVolba & ctl.Column(0, varVyber) & """ OR (sourceQuery.sourceColumn) = """
Next varVyber
filtrVolba = Left$(filtrVolba, Len(filtrVolba) - Len(" OR (qry_sourceQuery.sourceColumn) = "))
Me.myReport.Report.Filter = "(((sourceQuery.fieldBoundToMyReport)=" & Me.TextBoxBoundToMyReport.Value & ") AND ((sourceQuery.filterOptionOneSourceField) = """ & filtrVolba & "))"
Me.myReport.Report.FilterOn = True
Else
MsgBox "Not yet"
End If
End Sub
这可能无法解决您的所有问题,但这应该让您在理解如何编写 Access 表单方面有一个更稳固的基础。
【讨论】:
感谢您的详尽回答。 applyFilterButton 的代码工作正常,但禁用过滤器按钮恰好是问题。使用您建议的代码,Access 崩溃而没有任何错误消息的调试选项。仅下降以重置程序。你知道是什么原因造成的吗?我仍在考虑 Minty 选择不同方法的反应...... 您正在做一些使用 *** 问题/答案格式可能无法充分诊断的事情。太多的部分被遗漏了,甚至无法猜测可能出了什么问题。我愿意查看整个应用程序,并自己调试它,但我现在没有时间这样做。所以我会在这里说“祝你好运”来结束我的参与。 我明白了。你已经用推荐的编码语法帮助了我。我还没有找到源头,不得不搁置这个项目。如果您对如何调试整个应用程序有任何建议,那将是最有帮助的。将您的反应标记为答案,因为它帮助我更多地理解该主题,实际上它让我摆脱了错误(尽管我获得了另一个:D)。关于,Tomáš以上是关于禁用 Report 的 FilterOn 属性时出现运行时错误 -2147417848 (80010108)的主要内容,如果未能解决你的问题,请参考以下文章
安装andriod studio时出现Internal error. Please report to https://code.google.com/p/an