Ошибка MS Access «Update или CancelUpdate» с помощью диалогового окна «Найти» - PullRequest
5 голосов
/ 19 ноября 2010

У нас есть база данных MS Access 2007 с простой формой, отображающей данные таблиц.Мы используем диалоговое окно «Найти» (щелкните бинокль на ленте «Главная»), чтобы найти нужные записи.Это может вызвать ошибку при определенных обстоятельствах.

Действия по воспроизведению проблемы:

  1. Открыть форму.
  2. Открыть диалоговое окно поиска.
  3. Редактировать некоторые поля в записи.Теперь запись находится в режиме обновления (вы увидите карандаш в области «сточной канавы» строки).
  4. Не сохраняя запись, нажмите на УЖЕ открытое диалоговое окно поиска.
  5. Поискзапись, которую невозможно найти.
  6. Нажмите на форму еще раз.Запись все еще находится в режиме редактирования (т.е. карандаш все еще показывает).Попытайтесь сохранить или отредактировать другое поле.
  7. В этом окне сообщения будет отображаться «Обновить или отменить обновление без добавления или изменения».Вы можете нажать кнопку «ОК» или «Справка».

При нажатии кнопки «Справка» отображается:

Вы пытались вызвать Update или CancelUpdate или пытались обновить поле в наборе записей без предварительноговызывая AddNew или Edit.(Ошибка 3020)

В базе данных ядра базы данных Microsoft Access вы вызвали метод Update или CancelUpdate, но не использовали метод AddNew или Edit до записи данных в запись.

В ODBCDirectВ базе данных эта ошибка возникает, когда вы пытаетесь записать данные в запись без предварительного вызова AddNew или Edit.

Мы воспроизвели это в новой базе данных, где нет кода VBA.Таким образом, проблема заключается только в MS Access, и вы сможете легко ее воспроизвести.

Если вы сохраните запись до выполнения поиска, проблема не возникнет.К сожалению, у нас есть пользователи, которые выполняют поиск, пока запись находится в режиме редактирования.

Мы попытались настроить события на уровне формы, на уровне поля данных и Access, а также обработку ошибок.Ничто не может обнаружить или поймать эту ситуацию.В VBA нет способа определить, активно ли диалоговое окно «Найти».

Есть ли у кого-нибудь идеи по предотвращению ошибки или способу сохранить запись до того, как произойдет поиск?Нашей лучшей идеей сейчас является создание сценария AutoHotkey или AutoIt, который ожидает, чтобы диалог Find был в фокусе.Затем мы отправим Ctrl + S, чтобы сохранить текущую запись для принудительного сохранения.

Ответы [ 3 ]

1 голос
/ 07 февраля 2011

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

Мы не хотели распространять скрипт отдельно от базы данных, поэтому скрипт был добавлен в таблицу базы данных как BLOB-объект. Макрос AutoExec базы данных запускает некоторый код VBA, который извлекает сценарий из таблицы Blob и запускает сценарий.

Когда сценарий обнаруживает, что диалоговое окно «Найти» имеет фокус, сценарий запускает макрос VBA в базе данных. Макрос проверяет, является ли текущая запись грязной. Если грязный, макрос вызывает сохранение. Также скрипт AutoIt останавливается при закрытии базы данных.

Это все довольно неловко, но работает.

1 голос
/ 08 февраля 2011

@ Ответ CodeSlave предлагает мне возможность:

Вместо того, чтобы просто удалять бинокль с панели инструментов / ленты, вместо этого измените то, что делает бинокль. То есть вызовите код, который сохраняет текущую запись, если она грязная, а затем запускает диалоговое окно НАЙТИ.

Теперь должен быть какой-то код для проверки того, что форма открыта, и что у нее есть источник данных (тестирование ошибок свойства .Dirty, если источника данных нет), и что поле имеет фокус, но все из этих вещей выполнимо. Вероятно, о многих из них (кроме последнего) можно было бы позаботиться, отображая панель инструментов / ленту только при загрузке формы или редактируя панель инструментов / ленту по умолчанию при открытии формы.

Но это было бы гораздо менее сумасшедшим, чем использование внепроцессного решения, и ваши пользователи не почувствуют никакой разницы.

1 голос
/ 25 января 2011

Я бы предположил, что вы нашли ошибку, которая была введена в MS-Access 2007. Однако я не смог скопировать ее на мою копию. Я предполагаю, что мы оба в курсе наших патчей, так что, возможно, происходит что-то более тонкое.

Если вы хотите принудительно сохранить запись, используйте одно из следующего - не CTRL-S

  • if me.dirty then Me.Dirty = false ''(n.b. often the preferred method)

  • Docmd.RunCommand acCmdSaveRecord

  • DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70 ''(n.b. deprecated)

Проблема, насколько я понимаю, заключается в том, что если они редактируют форму после того, как "find" уже открыта, а затем выполняют "find", получают ошибку.

Я бы попробовал одну из двух вещей:

  1. Найдите способ закрыть встроенную форму поиска и делайте это всякий раз, когда вы делаете грязную текущую запись (Вкл.)
  2. Добавьте свою собственную кнопку «найти» в форму (не открывая встроенную форму поиска) и скройте кнопку на ленте.
...