我在访问时有这个表单,它的目的是作为表的前端工作,可以通过这个表单进行编辑。最初加载时,我使用以下查询显示来自记录集的表单数据:
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':无法更新。数据库或对象是只读的。
我几乎一遍地使用相同的代码从表中重新加载数据,直到我'覆盖'记录集的源代码之后它才给我带来问题。不知道如何解决这个问题?感谢
答案 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