Ошибка" данные были изменены " при переходе из основной формы в подформу
я переношу базу данных Access на SQL Server с помощью Помощника по миграции SQL Server (SSMA). Приложение Access будет по-прежнему использоваться, но со связанными таблицами вместо локальных.
Я столкнулся с проблемой во время тестирования после миграции с формой, которая содержит несколько подформ.
тестирование шага:
1) редактировать поле в основной форме;
2) перенести фокус на поле в подформе;
3) Попытка отредактируйте поле в форме sub.
результат: появляется сообщение об ошибке: "данные были изменены. Другой пользователь отредактировал эту запись и сохранил изменения до того, как вы попытались сохранить изменения."
Как только сообщение об ошибке будет отклонено, поле в форме sub может быть отредактировано. Если поле в основной форме не редактируется, подформу можно редактировать без сообщения об ошибке.
любые идеи о том, что может быть причиной этой ошибки?
Я пробовал сохранение записи основной формы в обработчике событий Enter для элемента управления sub form в основной форме (т. е. это событие происходит в основной форме при вводе элемента управления, содержащего подформу, а не в самой подформе). Это не имеет значения. Я попытался запросить основную форму в том же событии ввода элемента управления подформы, но это не работает - запрос основной формы перемещает фокус от подформы, поэтому ее нельзя редактировать.
форум MS предложил мне.Родитель.Обновление в событие After_Update вложенной формы. Это тоже не сработало.
SQL Profiler показывает один оператор update, обновляющий таблицу, лежащую в основе основной формы, когда я вхожу в форму sub. В базе данных нет других операторов, которые изменяют данные.
одна интересная вещь, которую я заметил: источник записи для основной формы на самом деле является оператором select, который объединяет две таблицы вместе. Основная форма содержит поля, которые могут обновлять столбцы в каждом из таблицы в источнике записи. Редактирование полей в основной форме, обновляющих дочернюю таблицу в связи, не приводит к ошибке "данные изменены". Ошибка возникает только при редактировании полей, обновляющих родительскую таблицу в связи. Я пробовал поля, которые обновляют разные столбцы в каждой из двух таблиц. Результаты согласуются: редактирование записи в родительской таблице вызывает ошибку, редактирование записи в дочерней таблице-нет.
связь между вложенная форма и основная форма присоединяют столбец в таблице вложенной формы к столбцу в дочерней таблице в источнике записи основной формы.
кстати, таблицы в основном источнике записей формы фактически объединены в соотношении 1:1 (одна запись в дочерней таблице для каждой записи в родительской таблице). Дочерняя таблица-это просто таблица расширения для родительской таблицы.
Я лично не стал бы проектировать систему так, если бы я начинал с нуля, но это то, что у меня есть для работы, и я надеюсь, что есть некоторое достаточно простое исправление, которое не потребует серьезной перепроектирования таблиц или форм (учитывая, что основная форма и подформа имеют более 100 элементов управления).
3 ответов
после многих проб и ошибок я решил проблему. В обработчике событий enter для элемента управления sub form в основной форме я запросил саму форму sub.
например, в основной форме:
Private Sub Subform1_Enter()
Me.Subform1.Form.Requery
End Sub
Я не знаю, почему это работает, только то, что он делает.
это происходит, когда запись обновляется в таблице, но источник записи основной формы не был обновлен, чтобы отразить изменение, поэтому Access получает противоречивую информацию и думает, что запись была изменена. См. также: http://support.microsoft.com/kb/302492
Я решаю эту проблему, написав AfterUpdate form-event следующим образом:
Private Sub Form_BeforeUpdate(Cancel As Integer)
cSQL = "update UnderlinedTable set Field1=" & Me.Controls("Field1") & _
", Field2=" & Me.Controls("Field2") & _ ' and all other fields in your form
" where PrimaryKey=" & Me.Recordset.Fields("PrimaryKeyField")
' here command to SQL server that executes this cSQL string
Me.Requery
Cancel = True 'stop Access updating
end sub
можно быть универсальной функцией wriiten BeforeUpdate form-event, которая автоматически генерирует инструкцию Update на основе формы.recordsource и измененные поля формы, которые могут быть вызваны из всех AfterUpdate form-событий, передающих форму в качестве параметра. Я сделал это для себя.