MS Access "запись изменений" журнал - PullRequest
2 голосов
/ 28 октября 2011

Всякий раз, когда запись удаляется или обновляется в форме, я хочу сохранить ее старые значения в таблице истории (назовем ее Revised).Я думаю, мне нужно сделать следующее:

Для изменений записи :

  • использовать событие BeforeUpdate для сохранения данных где-то (коллекция «массив» или в набор записей - пересмотренная таблица - без сохранения - пока нет?)
  • используйте событие AfterUpdate для добавления / сохранения этих данных в пересмотренную таблицу

Для удалений :

  • использовать событие OnDelete для сохранения данных - но опять же как?несколько записей могут быть удалены одновременно, так как форма (фактически подчиненная форма) находится в виде таблицы
  • , используйте AfterDelConfirm для добавления этих данных в пересмотренную таблицу.

Есть ли у васкакие-либо подсказки, комментарии или ссылки для этого?
На данный момент все это в «чистом доступе» (без SQL Server).Большое спасибо!


Редактировать: как обычно, правильная постановка вопроса дает мне идеи:

опция 1

использовать BeforeUpdate или OnDelete для построения оператора SQLи используйте AfterUpdate или AfterDelConfirm для выполнения инструкции SQL.Но это не сработает для множественных удалений?

опция 2

имеет пересмотренный набор записей, определенный на уровне формы, вставьте запись «До», но только «Обновить» после ».Опять же, проблема с несколькими удалениями.

Ответы [ 3 ]

3 голосов
/ 28 октября 2011

Я успешно использовал вариант подхода Аллена Брауна в паре разных проектов.Посетите его веб-сайт для получения более подробной информации:

Создание журнала аудита

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

3 голосов
/ 28 октября 2011

Другой подход, который я рассмотрел совсем недавно, но у которого не было возможности реально реализовать, - это использование транзакций для отслеживания изменений. Основной алгоритм будет:

  1. используйте BeginTrans в рабочей области перед внесением каких-либо изменений
  2. в событии OnDelete
    • выполнить удаления в коде, выполняя запросы Delete для рабочей области с шага 1
    • добавить запись в таблицу аудита изменений
  3. в событии BeforeDelConfirm
    • set Cancel = True
    • показать свой собственный диалог подтверждения
    • если пользователь подтверждает, то CommitTrans в рабочей области
    • в противном случае Откат транзакции в рабочей области

Аналогичный подход для обновлений / вставок. Это позволило бы избежать необходимости во временных таблицах / массивах / коллекциях и т. Д., Но я не до конца продумал все. Дьявол может быть в деталях.

0 голосов
/ 28 октября 2011

«Простое» и универсальное решение, которое может быть реализовано для нескольких таблиц, будет иметь таблицу отслеживания, состоящую из следующего:

Track_Table
==================================================
id_track as primary key
id_table as name of the table which has been updated
id_primaryKey as the record identifier (the PK of the updated record)
changeType, being either DEL or UPDATE
changeDate, as dateTime value
fieldName, as text
oldValue, as text or memo
newValue, as text or memo

, если вам необходимо идентифицировать пользователя, который сделалобновление, просто добавьте

userId

в вашу таблицу ...

Затем вы можете создать некоторые общие функции "перед обновлением" и "после обновления", которые будут вызываться в выбранной форме beforeUpdate исобытия после обновления.Функция beforeUpdate сохранит старое значение в переменной, а функция afterUpdate заполнит отсутствующие данные и вставит новую запись в таблицу треков.

Вам нужно будет найти способ выяснить правильное значение \соответствующее имя таблицы и имя поля.Это может быть сложно, если вы используете представления или псевдонимы полей для отображения ваших данных в формах.

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

oldValues ​​и newValues ​​придется преобразовать в текст, чтобы их можно было сохранить в текстовом или памятном поле

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