【问题标题】:How does indexing change when deleting a record from a DAO recordset?从 DAO 记录集中删除记录时,索引如何变化?
【发布时间】:2018-04-06 15:27:18
【问题描述】:

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

这里有一个sn-p供参考:

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 迭代(i=1)发现重复并删除了记录[1];索引会重置吗? record[2] 现在会变成 record[1] 并且 #records 会是 99 吗?如果是这样;在 For(i=2); rs 是否正在移动到最初记录的内容[3]?!

【问题讨论】:

  • 我不擅长访问,但我很确定 n_records 将保持 100 并且记录 [2] 将保持记录 [2]。如果这与 excel 类似,则需要通过循环删除记录来后退(即For i = n_records to 1 Step -1

标签: vba ms-access indexing dao recordset


【解决方案1】:

dwirony 的方法很好。

Access 不会明确删除记录。它适用于事务,并记录已删除的行。记录集包含已删除行的位置。对已删除的行执行任何操作(往返导航、读取值)将触发运行时错误 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    相关资源
    最近更新 更多