问题描述
||
我发现如何通过以下链接遍历记录集:
代码遍历MS Access中的所有记录
但是,我想知道是否有可能在不满足我在循环中指定的条件的情况下从记录集中删除记录。
编辑
我现在收到以下代码错误:
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset(\"fieldHistory\",dbOpenTable)
其中fieldHistory是我要打开的查询记录集的名称。为什么会出现此错误?代码的最后一行是错误的来源,Access仅声明“无效操作”
解决方法
是的,您可以使用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
,由于您使用英语(而不是类似英语的技术术语),因此您的意图不是很清楚。您询问是否可以“删除记录...”,这可能意味着要删除它(在这种情况下,您已经有一个很好的HansUp回答形式),或者要过滤它以便将其保留在基础数据库中时看不到它。
如果您的意图是后者(过滤),则有两种选择:
在原始OpenRecordset
调用中使用带有WHERE
子句的SQL语句。
进入循环之前,请使用Recordset的5属性。
访问附带有足够的(如果不是很出色的话)关于任一主题的帮助。