2011-08-10 83 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