Ошибка" данные были изменены " при переходе из основной формы в подформу

я переношу базу данных 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-событий, передающих форму в качестве параметра. Я сделал это для себя.