Ошибка, которую вы получаете, обычно возникает, когда:
- вы редактируете запись в форме, а форма грязная (т.е. изменения не сохранены),
И
- вы запускаете код, который использует DAO или ADO для запуска SQL для обновления той же записи.
Для Jet это два «пользователя», потому что это две разные операции редактирования. Базовая таблица была обновлена обновлением SQL, а данные в буфере форм устарели.
Обычным решением является принудительное сохранение перед запуском обновления SQL:
If Me.Dirty Then
Me.Dirty = False
End If
[run your SQL update here]
Но если вы используете формы для редактирования записи, вам следует делать все обновления в форме, а не прибегать к SQL для обновления.
Ситуацию, которую вы описываете с генерацией собственной последовательности, следует делать следующим образом:
пользователь нажимает кнопку NEW RECORD.
рассчитать следующее значение последовательности и сохранить его в переменной.
вставить новую запись с этим значением последовательности через SQL INSERT.
* 1 034 * 4а. если ваша форма связана со всеми записями в таблице, запросите форму редактирования данных (при условии, что кнопка NEW RECORD находится на форме, где пользователи редактируют данные), и используйте навигацию по закладкам, чтобы перейти к новой записи со значением последовательности, которое вы сохранили в переменной на шаге 2.
* * +1036 4b. Если ваша форма
не связана со всеми записями (как это не должно быть, если это хорошо спроектированная база данных), вы просто изменили бы источник записей формы, чтобы загрузить только новую запись.
Другая альтернатива - избегать SQL INSERT и запроса (или сбрасывать источник записей) и просто добавлять новую запись в существующую форму, устанавливать для поля последовательности новое значение и немедленно сохранять запись.
Ключевым моментом является то, что для того, чтобы это работало в многопользовательской среде, запись должна быть сохранена, как только ей присвоено значение последовательности - вы не можете оставить запись висящей там несохраненной, потому что это означает, что идентичное значение последовательности доступно для других пользователей, которые просто запрашивают катастрофу.