2011-08-10 4 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'を与えます:Can not Update。データボックスまたはオブジェクトは読み取り専用です。

テーブルからデータをリロードするのに、同じコードを繰り返し使用していますが、レコードセットのソースを上書きするまで問題は発生しませんでした。どのように私はこの問題を解決できますか?ありがとう

答えて

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