2011-08-17 96 views
0

我想通过ADODB结果集循环并在条件为真时删除记录。但是,当我这样做时,只有记录的第一个字段被删除,剩下的记录仍然存在。VBA通​​过迭代ADODB结果集来删除记录

任何想法? 我有以下代码:

Set ytdRS = New ADODB.Recordset 
ytdRS.Source = SQL_YTD 
ytdRS.CursorType = adOpenStatic 
ytdRS.LockType = adLockBatchOptimistic 

rst.MoveFirst 
Do Until rst.EOF 
    if (value = 1) then 
    rst.Delete 
    rst.MoveNext 
    end if  
Loop 

回答

0

我没有看到的一件事是ytdRS.Open命令。这可能是(问题的一部分)?

编辑:一些其他的东西:

  1. 你没有使用相同的名字记录在本块(ytdRS),所以我不知道你的意图是使用两个不同的记录(我假设它不是)
  2. 我不确定“值”是否打算作为记录集中字段的值(即ytdRS!FieldName.Value)或变量名称。在这种情况下,它是一个变量名称。
  3. 无论哪种方式,你几乎低保你要通过具有if语句中的MoveNext的打一个死循环,因为你的记录不会移动到除非Value下一个记录等于1
  4. 我不得不改变CursorType和LockType来让你的例子在测试表上工作。我不认为adOpenStatic会允许你删除记录(我相信它会给你一个静态的或不可更改的光标)。当您遇到更新数据的问题时,通常似乎是一种方法。您用于锁定的adLockBatchOptimistic假定您以批处理模式运行;通常adLockOptimistic正常工作。如果需要,请参阅here以获取关于删除方法和批处理操作的更多信息。

下面的代码适用于我;您将不得不为您的特定应用程序进行编辑。尤其是,您需要编辑ytdRS.SourceOpen()方法中的ActiveConnection:=ytdRs![Order ID].Value = 36行,以符合您发布的代码块中的“Value”语句。

希望这会有所帮助!

如果您有任何问题,请让我知道。

Sub testme() 
    Dim ytdRs As ADODB.Recordset 
    Set ytdRs = New ADODB.Recordset 

    ytdRs.Source = "SELECT * FROM [Order Summary 2]" 
    ytdRs.CursorType = adOpenKeyset 
    ytdRs.LockType = adLockOptimistic 
    ytdRs.Open ActiveConnection:=CurrentProject.Connection 

    ytdRs.MoveFirst 
    Do Until ytdRs.EOF 
     If (ytdRs![Order ID].Value = 36) Then 
     ytdRs.Delete 
     End If 
     ytdRs.MoveNext 
    Loop 
End Sub 
+0

如果您需要使用批处理模式...从Microsoft文档:“如果您处于批量更新模式,记录被标记为从缓存中删除,并且实际删除发生在您调用UpdateBatch方法。“_因此,在删除所有需要的记录后,您需要调用ytdRs.UpdateBatch。同样,如果您需要处于批处理模式,则仅为_only_。 – transistor1