禁用 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)的主要内容,如果未能解决你的问题,请参考以下文章

在触摸 UITableview 时禁用显示选择时出现问题?

使用Javascript向输入元素添加禁用属性

安装andriod studio时出现Internal error. Please report to https://code.google.com/p/an

hadoop dfsadmin -report命令显示的是0个datanode

MySQL 创建表时出现错误 1022

禁用 UITableview 滚动时出现问题