2017-05-26 80 views
0

如何在使用VBA的情况下禁用Datagridview的过滤器,如果在过滤之后没有记录?Access 2010 - 错误处理过滤器子表

在这里我第一次尝试:

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。 TextBox被称为“psoudoID”。 Sub1是一个正常的窗体,用于显示不同记录集的详细信息,并放置在MAIN的顶部。 Sub1下面是Sub2。 Sub2是一个Datagridview。当用户点击Sub2上的记录集时,Sub2中的ID“进入”到psoudoID并从那里到Sub1。你明白?

现在的问题是,用户可以过滤Datagrid中的每一列来查找此处需要的记录集并显示上述所有详细信息。但是,当数据网格在过滤后为空时,Sub2无法为psoudoID提供ID,因此Sub1不会在MAIN中显示更长时间。屏幕在那个地方是空的。通过单击网格中的筛选按钮,Sub1再次出现在屏幕上。

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

我希望你能理解我的叙述。对不起,我的英文不好:-)

THX。

贝吉塔

+0

第一次尝试中的哪一行产生错误3061?你是否有理由将Me.FilterOn设置为False或者修改过滤器而不是将Cancel设置为True? ('Cancel'取消当前的过滤器操作并返回到前一个过滤器(如果有的话),而'Me.FilterOn = False'关闭过滤器,'Cancel'看起来适合你想要的) –

+0

第一个代码有效。但我不能在正确的地方“发射”它。错误3061出现在第二个代码上。在替换。 –

+0

尝试使用'Dim rsf As Recordset_ Set rsf = rs.OpenRecordSet'替换'Set rs = rs.OpenRecordset()'。这有帮助吗? –

回答

0

我相信您遇到过滤器是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 

注意可能造成,即重复每50毫秒无限循环,如果你改变,导致0记录,导致0记录另一个过滤器的过滤器(但你不应该如果函数能够正常工作,可以使用过滤器产生0条记录)

+0

好的。错误不再来了。但是Loop需要时间,你是如何写的。我测试一下,然后我给你答复。谢谢。 –

+0

这很困惑!当我使用您的两个代码时,它将以适当的值运行(用户过滤到现有的记录集)。但是当我用错误的值过滤时,没有访问消息!网格只是空的。 当我只使用你的第二个代码。当我通过一个不存在的值进行过滤时,出现了Access-Msg。但是,当我将价值重新确定为适当的价值时,存在时间延迟,并且Access-Msg一次又一次地出现。 然后看看你的第二个代码,你必须将“... Exit Function”改成“... Exit Sub”。 –

+0

你说'Exit Function'应该是'Exit Sub'。之后的任何错误都已修复? –