2011-08-10 116 views
1

我有這樣的形式訪問,它的目的是爲可通過這種形式進行編輯的表的前端工作。最初,當它加載我在表單中的數據從以下查詢的記錄顯示:VBA和訪問窗體篩選

SELECT * FROM DATA 

我希望能夠篩選上記錄一次數據的形式是開放的。我嘗試了以下VBA代碼來完成此操作:

Private Sub Filter_Click() 
    If (IsNull(Me.Find_Field) Or Me.Find_Field = "") Then 
     rs.Close 
     Set rs = db.OpenRecordset("Select * from DATA ORDER BY ID) 
     rs.MoveFirst 
     LoadData (True) 
     Exit Sub 
    End If 

    Set rs = db.OpenRecordset("Select * from DATA WHERE ID = " & Me.Find_Field) 


    rs.MoveFirst 
    LoadData (True) ' Function that loads the data into the form 
Exit Sub 

正如大家可以看到的,我使用新的過濾查詢重新加載記錄集。到目前爲止,它起作用,當我嘗試修改記錄時,問題就開始了。

原來,當窗體加載記錄數據,我能夠編輯數據,編輯後的數據將在表格中顯示(這是我想要的)。但在我申請我的過濾器後,我的代碼給我的運行時錯誤「3027」:不能更新。數據庫或對象是隻讀的。

我幾乎使用相同的代碼一遍又一遍地重新加載從表中的數據,直到我「改寫」記錄的來源也從來沒有給我一個問題。任何想法如何解決這個問題?由於

回答

1

我寧願使用綁定形式的標準訪問,因爲它比你看起來是在做簡單。

我可以從我的cmdApplyFilter按鈕的單擊事件更改窗體的RecordSource。

Private Sub cmdApplyFilter_Click() 
    Dim strSql As String 
    If Len(Me.txtFind_Field & vbNullString) > 0 Then 
     strSql = "SELECT * FROM tblFoo WHERE id = " & _ 
      Me.txtFind_Field & " ORDER BY id;" 
     Me.RecordSource = strSql 
    End If 
End Sub 

如果您擔心有人會保存與過濾的記錄源的形式,可以使窗體始終與未過濾的版本中打開。

Private Sub Form_Open(Cancel As Integer) 
    Dim strSql As String 
    strSql = "SELECT * FROM tblFoo ORDER BY id;" 
    Me.RecordSource = strSql 
End Sub