2017-05-26 44 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'。之後的任何錯誤都已修復? –