2011-08-17 85 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