Конфликт записи MS Access - SQL Сервер - Я = Грязный - PullRequest
0 голосов
/ 07 апреля 2020

Я получаю сообщение об ошибке:

Эта запись была изменена другим пользователем, так как вы начали ее редактировать. Если вы сохраните запись, вы перезапишете изменения, сделанные другим пользователем ...

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

  1. В моей базе данных нет ни одного битового поля
  2. Все таблицы имеют первичный ключ, тип данных = идентификатор
  3. Все таблицы имеют создание / измененный триггер времени при обновлении и вставке

Я вполне уверен, что проблема связана с тем, когда форма (и несколько подчиненных форм) создают поля идентификаторов и / или триггеры отметки времени. В частности, я получаю эту ошибку только в таблице «Individual Fi sh», когда я go возвращаюсь для редактирования старого 'fi sh' (как показано на скриншоте). Если я просто пролистываю форму и ничего не редактирую, она работает нормально. Но если мне нужно что-то отредактировать на предыдущем 'fi sh' - после срабатывания идентификатора / триггера - тогда это выдаст мне ошибку.

Я прошел и добавил If Me.Dirty Then Me.Dirty = False End If к каждой форме для следующих событий: On Current, On Load, On Click, After Update, Before Update, Before Insert, On Dirty.

Я также добавил DoCmd.RunCommand acCmdSaveRecord к On Deactivate. Я признаю, что я не очень хорош в VBA, поэтому я мог бы сделать что-то глупое. Код прилагается. Я также возился с Record Locks = Edited Record.

Пока что, похоже, ничего не работает. Пожалуйста, дайте мне знать, если вы думаете, что я что-то упустил. Кроме того, если у вас есть какие-либо случайные комментарии или предложения по поводу моей базы данных или чего-либо еще, я всегда буду рад обратной связи.

Спасибо!

ОБНОВЛЕНИЕ:

Ответы Альберта заставили меня правильное место. Короткая версия заключается в добавлении поля rowversion (aka timestamp) во все таблицы. Об этом упоминалось в нескольких других постах, но я не осознавал, что [ужасно названная] «метка времени» на самом деле не имела отношения к дате или времени. Спасибо за помощь!

Access Form Error

Form VBA Code[![Entity-Relationship Diagram] 3

VBA

1 Ответ

0 голосов
/ 08 апреля 2020

Хорошо, здесь есть много вещей, которые нужно проверить. Во-первых, размещение me.Dirty = false во включенном состоянии или события, подобные предыдущему обновлению, приведут к тому, что «то же самое» событие будет выполнено снова. Вы действительно (но на самом деле) не хотите этого делать. (настолько дикое случайное добавление me.dirty в этих событиях только усугубит эту проблему и часто вызывает повторное срабатывание того же самого события.

next:

All tables have a create/modified timestamp trigger on updates and insert

Ok Теперь вышесказанное сбивает с толку. Есть ли у вас фактический триггер - так как это отдельная проблема, и она часто приводит к тому, что запись была изменена кем-то другим.

Также, когда мы говорим о столбце метки времени, оставайтесь в Имейте в виду, что такие столбцы имеют значение ZERO ZERO ZERO для datetime. На протяжении многих лет Microsoft пыталась «изменить» используемое имя. Правильное имя - ROWVERSION, и этот столбец НЕ является столбцом типа данных datetime, но называется меткой времени. Ни в коем случае не путайте эту систему / столбец строк со столбцом даты и времени.

Итак, предположения таковы: у вас есть столбец отметки времени - это отметка времени типа данных. Этот столбец НЕ затрагивается вашим кодом или триггер ЛЮБЫМ. Этот столбец НЕ имеет ни datetime, ни datetime2, но имеет тип данных timestamp.

Если вы это сделаете Здесь нет фактического столбца меток времени (он не должен быть в форме), тогда вы получите постоянные «грязные» предупреждения. Вы также получаете это с любыми реальными столбцами типа данных - особенно если они установлены кодом сервера. (доступ будет округляться иначе).

Итог: вам нужен фактический столбец версии строки (типа timestamp) в этой таблице. За кулисами, если доступ НЕ находит этот столбец, он будет сравнивать столбец за столбцом и без вопросов с триггером для установки некоторого столбца LastUpdated с GETDATE () на триггер на стороне сервера, тогда это не вызовет ничего, кроме проблем. Введение столбца метки времени ОСТАНОВИТ доступ к выполнению сравнения столбец за столбцом после обновления, и он будет смотреть ТОЛЬКО на столбец метки времени. Таким образом, теперь ваш триггер может обновлять LastUpdated, и столбец отметки времени не должен меняться с точки зрения доступа.

Итак, вы должны быть уверены:

Столбец PK виден при доступе - для всех sql таблиц требуется PK.

Все таблицы должны иметь столбец версии строки.

Если вы добавите столбец метки времени (rowverison) в таблицу проблем, убедитесь, что вы повторно связались на стороне клиента доступа. Фактически, после ЛЮБОГО изменения или модификации серверной стороны, вам следует повторно связать клиентскую сторону.

Я бы удалил любого заблудившегося меня. Грязный = Ложный код в этой форме.

Вы можете поместить кнопку "сохранить" в форму, если вы sh, и просто получить ее go

if me.dirty = true then me.Dirty = False

Редактировать

При вышеописанной настройке вы сможете повторно запустить серверный триггер, который устанавливает LastUpdated. Однако вам не нужен код в форме, который «касается» или использует этот столбец. Однако вы можете иметь возможность вставить этот столбец LastUpdated в форму и увидеть его обновление после сохранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...