VBA Удаление записей путем итерации по ADODB Result Set - PullRequest
0 голосов
/ 18 августа 2011

Я пытаюсь перебрать набор результатов 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

1 Ответ

0 голосов
/ 18 августа 2011

Одна вещь, которую я не вижу, это команда ytdRS.Open.Может ли это быть (частью) проблемы?

РЕДАКТИРОВАТЬ: Несколько других вещей:

  1. Вы не используете одно и то же имя набора записей в этом блоке (ytdRS), поэтому яЯ не уверен, что вы собираетесь использовать два разных набора записей (я предполагаю, что это не так)
  2. Я не уверен, что «Значение» предназначено для значения поля в наборе записей (т.е.ytdRS!FieldName.Value) или имя переменной.В этом контексте это имя переменной.
  3. В любом случае вы почти гарантируете, что попадете в бесконечный цикл, указав свой MoveNext в операторе if, поскольку ваш набор записей не будет перемещаться.к следующей записи, если Value не равен 1.
  4. Мне пришлось изменить CursorType и LockType, чтобы ваш пример работал на тестовой таблице.Я не думаю, что adOpenStatic позволит вам удалять записи (я считаю, что это дает вам статический или неизменный курсор). adOpenKeyset обычно кажется подходящим способом, когда вы сталкиваетесь с проблемами при обновлении данных.AdLockBatchOptimistic, который вы использовали для блокировки, предполагает, что вы работаете в пакетном режиме;нормально adLockOptimistic работает нормально.См. здесь для получения дополнительной информации о методе удаления и пакетной операции, если вам это необходимо.

Код ниже работал для меня;вам придется отредактировать его для вашего конкретного приложенияВ частности, вам нужно отредактировать ytdRS.Source, ActiveConnection:= в методе Open() и строку 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
...