代码循环和编辑记录集

时间:2011-05-25 14:38:02

标签: ms-access

我已经找到了如何使用以下链接遍历记录集:

Code to loop through all records in MS Access

但是,我想知道是否可以从记录集中删除记录,如果它不符合我在循环中指定的条件。

修改

我现在收到以下代码的错误:


Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("fieldHistory", dbOpenTable)

其中fieldHistory是我要打开的查询记录集的名称。为什么我收到此错误?最后一行代码是错误的来源,Access只是说“无效操作”

2 个答案:

答案 0 :(得分:2)

是的,您可以使用DAO记录集的Delete方法删除当前记录。此示例将删除fname值为“xxx”的行。

Public Sub DeleteRecordsetRow()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("tblDiscardMe", dbOpenTable)
    Do While Not rs.EOF
        If rs!fname = "xxx" Then
            rs.Delete
            '* the next line would trigger *'
            '* error 3167: "Record is deleted." *'
            ''Debug.Print rs!fname
        End If
        rs.MoveNext
    Loop
    rs.Close
    Set rs = Nothing
    Set db = Nothing
End Sub

请注意,在rs.Delete之后(即在MoveNext之前),删除的行仍然是“当前”,但您无法访问其值。您可以取消注释Debug.Print行以进一步检查它。

修改: 由于您的记录源是查询而不是表,因此请尝试这样做以缩小您使用OpenRecordset时出错的原因。

Public Sub foo20110527a()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("fieldHistory")
    If Not (rs.BOF And rs.EOF) Then
        rs.MoveLast
        MsgBox "RecordCount: " & rs.RecordCount
    Else
        MsgBox "No records"
    End If
    rs.Close
    Set rs = Nothing
    Set db = Nothing
End Sub

答案 1 :(得分:1)

由于您使用的是英语(而不是类似英语的技术术语),因此您的意图并不十分明确。你问你是否可以“......删除一条记录......”,这可能意味着你要删除它(在这种情况下,你已经有一个很好的答案形式HansUp),或者你想过滤掉它你没有看到它,而把它留在底层数据库中。

如果你的意图是后者(过滤),你有两个选择:

  1. 在原始WHERE调用中使用带有OpenRecordset子句的SQL语句。
  2. 在进入循环之前使用Recordset的.Filter属性。
  3. Access可以在任何一个主题上提供足够的(如果不是很好的)帮助。