VBA和访问表单筛选器

时间:2011-08-10 18:54:57

标签: ms-access 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 个答案:

答案 0 :(得分:1)

我更喜欢使用标准的Access绑定表单,因为它比你看起来更简单。

我可以从 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

如果您担心有人可能会使用已过滤的RecordSource保存表单,您可以使用未过滤的版本使表单始终打开。

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