Запрос на обновление MS Access VBA для снятия всех флажков в форме не работает - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть кнопка в форме MS Access, которая использует VBA для обновления измененной отметки даты / времени во всех записях в форме стиля таблицы данных, для которых установлен флажок в поле «Подтверждение существующего обновления».После того, как он сделает эти обновления, он должен снять все флажки.В настоящее время это выполняется с помощью простого запроса на обновление SQL, который выполняется через VBA после обновления меток даты / времени:

"Update [CMO Deviations Tracker] SET [CMO Deviations Tracker].[Confirm Existing Update] = FALSE WHERE [CMO Deviations Tracker].[Confirm Existing Update] = TRUE"

Проблема заключается в том, что запрос, по-видимому, не хочет снимать последний установленный флажок(в последнем ряду, с которым взаимодействовали).Я проверил запрос, скопировав / вставив его в пустое окно дизайна запроса, и он отлично работает там (снимает все флажки, включая последний нажатый).До сих пор я пытался добавить следующее в код VBA моей кнопки формы:

  • Перенос записи на следующую строку перед запуском запроса на обновление через «Me.Recordset.MoveNext»
  • Сохранение последней записи взаимодействовало с помощью «If Me.Dirty Then Me.Dirty = False»
  • Я добавил «Формы! [Отслеживатель отклонений CMO] .Requery» в конец кода, чтобыЯ видел самую свежую информацию

Похоже, что ни один из них не приводит к снятию последнего установленного флажка.Что может быть причиной этого?

РЕДАКТИРОВАТЬ: Я только что попытался запустить свой отдельный запрос на обновление, когда форма была открыта сразу после попытки и не удалось с помощью кнопки.Не удалось снять последний флажок из-за «нарушения блокировки».Интересно ...

РЕДАКТИРОВАТЬ 2: Таким образом, единственное, что я нашел для работы (в качестве обходного пути), это установить флажки для всех строк, для которых я хочу обновить отметку времени, а затемУстановите флажок и снимите флажок для одной дополнительной строки, прежде чем нажимать кнопку.Затем Access удалит все нужные флажки, как и должно быть.

EDIT3: Просто для ясности.Обновление отметки времени в последней проверенной записи, кажется, работает отлично.По какой-то причине кажется, что блокируется только поле «Подтверждение существующего обновления».Думая, что это может быть используемый метод, я попытался снять эти флажки, отредактировав набор записей и используя цикл, чтобы поле «Подтверждение существующего обновления» для каждой строки в наборе записей было равно «Ложь».Кажется, он по-прежнему снимает все флажки, кроме последнего, только на этот раз код vba будет выдавать ошибку в последней строке, говоря: «Не удалось обновить | в данный момент заблокирован».Та же ошибка, совершенно другая реализация.

EDIT4: Обновление свойства «Блокировка записи» формы на «Отредактированная запись» или «Нет блокировок», похоже, решает проблему, но только если это делается как частькод нажатия кнопки.Если я добавлю VBA для обновления этого свойства в триггере события «При открытии» формы или просто обновлю свойство в графическом интерфейсе, это, похоже, не решит проблему - даже если «Нет блокировок» установлено в качестве свойства по умолчанию,Какого черта?

EDIT5: По запросу, следующий VBA от моей кнопки.Обратите внимание, что я обновил методологию обновления флажков, используя DAO.Recordset, а не исходный запрос SQL Update.

Private Sub Command187_Click()

Dim Temp_ID As String
Dim DBS_Temp1 As DAO.Database
Dim DevTracker As DAO.Recordset
Dim DevUpdates As DAO.Recordset


If MsgBox("This will confirm that the latest update provided is still current for all items with the 'Confirm Existing Update' box checked above.  Are you sure that you want to do this?", vbYesNo) = vbYes Then

    Set DBS_Temp1 = CurrentDb
    Set DevTracker = DBS_Temp1.OpenRecordset("CMO Deviations Tracker")
    Set DevUpdates = DBS_Temp1.OpenRecordset("Deviation Updates")


    DevTracker.MoveFirst
    DevUpdates.MoveFirst

    Do Until DevTracker.EOF = True

    If DevTracker![Confirm Existing Update] = True Then

         DevUpdates.MoveFirst

         Temp_ID = "[Deviation ID] = '" & DevTracker![Deviation ID] & "'"

         DevUpdates.FindLast (Temp_ID)
         DevUpdates.Edit
         DevUpdates![Status Update] = DevUpdates![Status Update] & " "
         DevUpdates![Status Update] = Left(DevUpdates![Status Update], Len(DevUpdates![Status Update]) - 1)
         DevUpdates.Update

         DevTracker.Edit
         DevTracker![Confirm Existing Update] = False
         DevTracker.Update

    End If


    DevTracker.MoveNext


    Loop

    DevUpdates.Close
    DevTracker.Close

    Set DevUpdates = Nothing
    Set DevTracker = Nothing
    Set DBS_Temp1 = Nothing


    MsgBox "Existing updates for the selected deviations have been confirmed."


Else

    DevTracker.MoveFirst

    Do Until DevTracker.EOF = True

        DevTracker.Edit
        DevTracker![Confirm Existing Update] = False
        DevTracker.Update

        DevTracker.MoveNext

    Loop


    MsgBox "Update Confirmation Cancelled."

    Forms![CMO Deviations Tracker].Requery

    Exit Sub

End If

Forms![CMO Deviations Tracker].Requery

End Sub
...