【问题标题】:Access 2010 - Error Handling Filter SubformAccess 2010 - 错误处理过滤器子窗体
【发布时间】:2017-10-27 00:06:39
【问题描述】:

如果过滤后没有记录,如何使用 VBA 禁用 Datagridview 的过滤器?

这是我的第一次尝试:

Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer)
    If Me.RecordsetClone.RecordCount = 0 Then
        MsgBox ("Kein Datensatz gefunden. Filter wird entfernt.")
        Me.Form.FilterOn = False
        Me.Form.Requery
    End If
End Sub

这是第二次尝试:

Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer)
    Dim rs As DAO.Recordset

    Set rs = Me.RecordsetClone
    rs.Filter = Replace(Me.Filter, "[Tabelle1].", "")
    Set rs = rs.OpenRecordset()

    If rs.EOF Then
        Cancel = True
    End If
End Sub

在第二个代码中,我收到错误 3061。第一个代码“有效”,但最终不是我需要的。

因为:

我有 3 个表格。 MAIN、Sub1 和 Sub2。

在 MAIN 中是 Sub1 、 Sub2 和单个 TextBox。文本框被称为“psoudoID”。 Sub1 是显示不同记录集详细信息的普通表单,位于 MAIN 的顶部。 Sub1 下方是 Sub2。 Sub2 是一个Datagridview。当用户单击 Sub2 上的记录集时,Sub2 中的 ID“转到”psoudoID 并从那里转到 Sub1。你明白?

现在的问题是,用户可以过滤 Datagrid 中的每一列以找到此处需要的记录集并显示上面的所有详细信息。但是当过滤后datagrid为空时,Sub2不能给psoudoID一个ID等等Sub1不会在MAIN中显示更长的时间。那个地方的屏幕是空的。通过单击网格中的过滤器按钮,Sub1 再次出现在屏幕上。

我想通过单击 MsgBox 的“确定”或自动禁用过滤器,而不是通过单击 gridview 上的过滤器按钮。

希望你能理解我的描述。对不起我的英语不好:-)

谢谢。

蔬菜

【问题讨论】:

  • 第一次尝试中的哪一行会产生错误 3061?您是否有理由将Me.FilterOn 设置为False 或修改过滤器而不是将Cancel 设置为True? (Cancel 取消当前过滤器操作并恢复到之前的过滤器(如果有),而Me.FilterOn = False 关闭过滤器,Cancel 似乎适合您想要的)
  • 第一个代码有效。但我不能在正确的地方“开火”。错误 3061 出现在第二个代码上。在替换。
  • 尝试将Set rs = rs.OpenRecordset() 替换为Dim rsf As Recordset_ Set rsf = rs.OpenRecordSet。这有帮助吗?
  • 我试过了,还是报错 3061。
  • rs.Filter = Replace(CStr(Nz(Me.Filter, "")), "[Tabelle1].", "") 有帮助吗?这样你就可以确保 Replace 得到 3 个字符串并且没有 NULL。

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


【解决方案1】:

我相信您在使用 Null 过滤器时遇到问题,并且在实际应用过滤器之前使用 Me.Filter 时遇到问题。此外,将对象重新分配给自身的属性/成员之前给我带来了问题,所以我尽量避免这样做。

以下应该有效:

Dim strOldFilter As String
Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer)
    Me.TimerInterval = 50
    strOldFilter = Nz(Me.Filter, "")
End Sub

Private Sub Form_Timer
        Me.TimerInterval = 0
        If Me.Filter = strOldFilter Then Exit Sub
        Dim rs As DAO.Recordset
        Dim strFilter As String
        strFilter = Nz(Me.Filter, "")
        If strFilter = "" Then
            'Handle this specific scenario
             Exit Sub
        End if
        Set rs = Me.RecordsetClone
        rs.Filter = Replace(strFilter, "[Tabelle1].", "")
        Dim rsf as DAO.Recordset
        Set rsf = rs.OpenRecordset

        If rsf.EOF Then
            Me.Filter = strOldFilter
        End If
End Sub

请注意,如果将导致 0 条记录的过滤器更改为导致 0 条记录的另一个过滤器,则可能会导致每 50 毫秒重复一次的无限循环(但如果使用函数作品)

【讨论】:

  • 好的。错误不再出现。但是循环需要时间,你是怎么写的。我测试了一会儿,然后我给你答案。谢了。
  • 很混乱!当我使用你们两个代码时,它使用正确的值(用户过滤到现有记录集)。但是当我用错误的值过滤时,没有访问消息!网格只是空的。当我只使用你的第二个代码时。当我按不存在的值过滤时,会出现一个 Access-Msg。但是当我将值重写为适当的值时,会出现时间延迟,并且 Access-Msg 会一次又一次地出现。看看你的第二个代码,你必须将“... Exit Function”更改为“... Exit Sub”。
  • Exit Function 应该是 Exit Sub,你是对的。修复后是否有任何错误?
  • 没有错误。现在我知道了。它可以工作,但是我必须在 Access-Msg 上单击“取消”(请输入正确的值......对不起,我只有德语消息)。之后它就起作用了。但更好的是,当我可以输入新值时,无需单击取消。还有什么想法吗?
  • 请在邮件中具体说明。它是通用错误消息还是 VBA 错误消息?如果是 VBA,它发生在哪一行以及错误代码是什么,如果是 Access,则尝试具体说明源(如果您有一个带参数的过滤器,则可能会发生这种情况,您应该尝试调整过滤器)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
相关资源
最近更新 更多