2017-04-07 134 views
1

我有一個窗體,我已經建立了一個過濾器搜索運行「after_update」。當過濾器沒有記錄時,表格失敗並顯示空白。爲了解決這個問題,我發現幾個帖子建議添加一個「RecordCount」並使用「if」語句來觸發過濾器,如果它不是< 1或= 0。我的問題是,RecordCount的值似乎顯示了上次運行篩選器選擇的記錄數,而不是當前的篩選器。我已經嘗試了幾種方法來「重新查詢」並在應用過濾器後更新RecordCount的值,但無法讓它更新,因爲我打算工作。訪問VBA篩選器RecordCount沒有正確更新值

實施例:

濾波器1:結果在14所記載,debug.print的RecordCount顯示器1個

過濾器2:結果在22所記載,debug.print的RecordCount顯示14

濾波器3 :結果0個記錄,表格失敗,debug.print的RecordCount顯示器22

代碼:

Private Sub ApplyFilterBtn_Click() 
On Error GoTo Err_ApplyFilterBtn_Click 

Dim stFilter As String 

stFilter = "" 

If Nz(Me.FilterOwner, "") <> "" Then 
    stFilter = stFilter & "[MachineOwner] = " & Me.FilterOwner & " AND " 
End If 

If Nz(Me.FilterType, "") <> "" Then 
    stFilter = stFilter & "[MachineType] = " & Me.FilterType & " AND " 
End If 

If Nz(Me.FilterSubType, "") <> "" Then 
    stFilter = stFilter & "[MachineSubType] = " & Me.FilterSubType & " AND " 
End If 

If Nz(Me.FilterMake, "") <> "" Then 
    stFilter = stFilter & "[Make] Like '" & Me.FilterMake & "' AND " 
End If 

If Nz(Me.FilterModel, "") <> "" Then 
    stFilter = stFilter & "[Model] Like '*" & Me.FilterModel & "*' AND " 
End If 

If Nz(Me.FilterSN, "") <> "" Then 
    stFilter = stFilter & "[SN] Like '" & Me.FilterSN & "' AND " 
End If 

If Nz(Me.FilterStatus, "") <> "" Then 
    stFilter = stFilter & "[NewStatus] = " & Me.FilterStatus & " AND " 
End If 



If stFilter <> "" Then 
    stFilter = Left(stFilter, Len(stFilter) - 5) 'Remove the extra AND 

'<<<<<<<Issue starts here<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    Me.Recordset.Clone 

     Me.RecordsetClone.Filter = stFilter 
     Me.RecordsetClone.MoveLast 
'  Me.RecordsetClone.MoveNext 'Tried this - did not help 
'  Me.RecordsetClone.Requery 'tried this - did not help 

'  Me.Filter = stFilter ' Tries this - did not help 

     'debugging to see value of RecordCount 
     Debug.Print stFilter 
     Debug.Print Me.RecordsetClone.RecordCount 

'>>>>>> Recordsetclone.RecordCount value not refreshing properly above, shows previously called filter record count 

    If Me.RecordsetClone.RecordCount < 1 Then ' no records, don't filter 
     'If Not (Me.RecordsetClone.BOF And Me.RecordsetClone.EOF) Then 'work around attempt 2 - failed 
     'If Me.NoMatch Then            'Work around Attempt 3 - failed 
      RemoveFilterBtn_Click ' Call sub that Clears filter 
      MsgBox "Filter Results in No records", vbOKOnly, "No Results" 
     Else ' there are records, turn on filter 
      Me.Filter = stFilter 
      Me.FilterOn = True 
     End If 'Me.RecordCount < 1 
    Else 
     Me.FilterOn = False 
     RemoveFilterBtn_Click ' Clears filter 
    End If 'stFilter <> "" 

Exit_ApplyFilterBtn_Click: 
     Exit Sub 

Err_ApplyFilterBtn_Click: 
     MsgBox Err.Description 
     Resume Exit_ApplyFilterBtn_Click 

End Sub 


Private Sub RemoveFilterBtn_Click() 
On Error GoTo Err_RemoveFilterBtn_Click 

    'Sets Filter Field Values to Blank 
    Me.FilterOwner = "" 
    Me.FilterType = "" 
    Me.FilterMake = "" 
    Me.FilterModel = "" 
    Me.FilterSN = "" 
    Me.FilterStatus = "" 
    Me.FilterSubType = "" 

    'Removes Filter 
    Me.Filter = "" 
    Me.FilterOn = False 

Exit_RemoveFilterBtn_Click: 
    Exit Sub 

Err_RemoveFilterBtn_Click: 
    MsgBox Err.Description 
    Resume Exit_RemoveFilterBtn_Click 

End Sub 
+1

rs.MoveLast THEN rs.recordcount :) –

+0

我不知道你的意思。 recordsetclone.recordcount在.MoveLast之後? – Kelly

+0

如果沒有記錄,'MoveLast'將失敗。所以... – Gustav

回答

0

這是簡單,但你需要正確的語法:

Dim rst As DAO.Recordset 
Dim rstFiltered As DAO.Recordset 

Set rst = Me.RecordsetClone 
rst.Filter = stFilter 

Set rstFiltered = rst.OpenRecordset() 
If rstFiltered.RecordCount > 0 Then 

    ' Do stuff. 

End If 
rstFiltered.Close 

Set rstFiltered = Nothing 
Set rst = Nothing 
+0

謝謝!這個解決方案似乎工作。我之前沒有使用過「OpenRecordset」。我不確定它在做什麼,但我知道這種行爲是正確的! – Kelly

+0

太棒了!然後請標記爲已回答。 – Gustav