从 DAO 记录集中删除记录时索引如何变化?

How does indexing change when deleting a record from a DAO recordset?

我正在编写一个 VBA 脚本来 1) 获取一个记录集 [rs],2) 将每条记录 [i] 中的 [数据] 与其他所有记录进行比较 3) 如果这些记录是相同的删除记录 [i], 4) 继续 2)

这里有一个片段供参考:

rs.MoveLast
n_records = rs.RecordCount

For i = 1 to n_records
  rs.Move i
  data = rs![Data]
  Do
     rs.MoveNext
     data_current = rs![Data]
     If (data = data_current) Then 
        rs.Move i
        rs.Delete
        GoTo NextIteration
     End If
  Loop Until rs.EOF
  NextIteration:
Next

我的问题是:删除记录后,记录集的索引会发生什么情况?

例如如果我有 100 条记录并且第一个 For iteration(i=1) 找到了重复和删除的记录[1];索引会重置吗? record[2] 现在会变成 record[1] 并且 #records 会是 99 吗?如果是这样;对于(i=2); rs 正在移动到最初的 record[3] 吗?!

dwirony 的方法很好。

Access 不会明确删除记录。它与事务一起工作,并记录已删除的行。记录集包含已删除行的位置。对已删除的行执行任何操作(导航至该行或从该行导航、读取值)将触发 run-time 错误 3167:记录已删除。

但是,您当前的代码存在许多误解。例如,rs.Move 将记录集从当前记录而不是从头开始移动固定数量的位置。您可以通过在记录集的开头设置书签并将其传递给 rs.Move 来避免此行为。但是如果记录集被删除,这会导致问题。

我的建议:打开记录集两次(使用 .RecordsetClone)。使用 rs.MoveNext 和书签:将第一个记录集的书签设置为与第二个记录集相同(以同步它们),然后将第二个记录集向前移动一个位置。

示例:

Set rs = CurrentDb.OpenRecordset("Something")
Set rsClone = rs.RecordsetClone

Do Until rs.EOF
  rsClone.Bookmark = rs.Bookmark
  Do Until rsClone.EOF
     rsrsClone.MoveNext
     data_current = rs![Data]
     If (data = data_current) Then 
        rsClone.Delete
        GoTo NextIteration
     End If
  Loop Until rsClone.EOF
  NextIteration:
  rs.MoveNext
Loop