Случайные ошибки обновления или отмены обновления без добавления или редактирования

#vba #ms-access

#vba #ms-access

Вопрос:

Я использую a listbox для навигации между записями в форме, но иногда я Error Update or CancelUpdate without AddNew or Edit Run-time Error 3020 продолжаю Me.Bookmark = rs.Bookmark . Кажется, я не могу понять, в чем проблема, и мне было интересно, может ли кто-нибудь помочь мне с тем, как это исправить.

 Option Compare Database
Option Explicit
Dim rs As DAO.Recordset

Private Sub listBox_AfterUpdate()
    Dim rs As DAO.Recordset
    If Not IsNull(ItemNo) And Not IsNull(itemName) Then
        Set rs = Me.RecordsetClone
        rs.FindFirst "[ItemNo] = '" amp; Me![listBox] amp; "'"
        If Not rs.NoMatch Then Me.Bookmark = rs.Bookmark
    Else
        Exit Sub
    End If
    
    If IsNull(ItemNo) Or IsNull(itemName) Then
        Exit Sub
    End If
    
    rs.Close
    Set rs = Nothing
End Sub
  

Комментарии:

1. Убедитесь, что поле списка не привязано.

2. @Andre сегодня я просматривал весь модуль, а затем заметил, что у меня было Dim rs As Dao.Recordset вверху. Удаление его сверху и кода работает хорошо и еще не привело к ошибкам. Может ли это быть причиной? Поскольку поле списка используется для навигации между записями, оно привязано к одному столбцу, то есть к ItemNumber полю.

Ответ №1:

Вероятно, вы начали редактировать запись в форме. Сохраните ожидающие изменения перед переходом к другой записи.

     If Not rs.NoMatch Then
        Me.Dirty = False  'Saves any pending changes.
        Me.Bookmark = rs.Bookmark  'Navigate to another record.
    End If
  

Комментарии:

1. @Oliver Jacot-Descombes Me.Dirty , как вы указали, оценивает False , что все Me.Dirty = False еще выдает ту же ошибку.

2. У вас есть другой код, который вызывает rs.AddNew или rs.Edit ?

3. Совсем нет. Приведенный выше единственный код, который у меня сейчас есть в модуле. Разве эта строка в текущем событии формы Me!listBox = Me.ItemNo может быть виновником?

4.Я должен признать, что я не знаю, почему это происходит. Что-то еще: rs.Close Set rs = Nothing должно быть в Then регистре после If Not rs.NoMatch Then Me.Bookmark = rs.Bookmark строки. Тогда Else с the Exit Sub и последнее If с другим Exit Sub являются излишними.

5. @Oliveir Jacot-Decombes у меня был Dim rs As DAO.Recordset в верхней части модуля. Удаление, похоже, решает проблему, и с тех пор ошибка не возникала. Спасибо!