After/Before Update

Casper2002
Дата: 20.01.2016 12:29:03
Казалось бы задача тривиальная, но прозрачного ответа на свой вопрос пока не нашел. Имеется таблица, которую редактируют множество пользователей на главной форме. Необходимо выловить, кем, какое поле и запись была отредактирована.

Как получить пользователя понятно - функция Application.CurrentUser. Также ясно, что перехватывать события нужно через After/Before Update формы. Как сделать все остальное не ясно...
MrShin
Дата: 20.01.2016 13:15:45
Советую посмотреть в сторону Data Macro, в частности Before Change. Вся требуемя информация доступна там, можно вызывать VBA функции. Обязательно нужно предусмотреть отключение кода флагом, ибо тормозит это прилично. Не очень красиво еще получится выявление поля, которое редактировалось, придется перечислять все поля в IF-ах или аналоге
Predeclared
Дата: 20.01.2016 13:23:06
Casper2002
... таблица, которую редактируют ...

Ошибки при проектировании.

В идеальном случае, записи должны только добавляться.
Редактирование записи только в редких случаях, коррекция ошибок ввода и т.п.
Slavinag
Дата: 20.01.2016 13:25:09
Если база на SQL, то журнализацию я бы прикрутил на соответствующие триггеры таблиц/вьюшек.
Сергей Лалов
Дата: 20.01.2016 15:25:15
Casper2002
Казалось бы задача тривиальная, но прозрачного ответа на свой вопрос пока не нашел. Имеется таблица, которую редактируют множество пользователей на главной форме. Необходимо выловить, кем, какое поле и запись была отредактирована.

Как получить пользователя понятно - функция Application.CurrentUser. Также ясно, что перехватывать события нужно через After/Before Update формы. Как сделать все остальное не ясно...



Как быстрый вариант решения задачи в access: На основные события записей формы Form_AfterUpdate() и Form_Delete(Cancel As Integer) пишете простой запрос на добавление записи в дополнительную таблицу (назовем её "логи") .
В таблице "логи" должны присутствовать абсолютно все поля ,которые есть в изменяемой таблице.
Плюс в таблице "логи" добавляете два дополнительных поля - ТипДействия и Пользователь


При срабатывании события обновления в логи добавляется измененная запись , в поле ТипДействия вставляется текст "изменение" . В поле Пользователь вставляется Application.CurrentUser
При срабатывании события удаление в логи добавляется удаленная запись , в поле ТипДействия вставляется текст "удаление" .
В поле Пользователь вставляется Application.CurrentUser

Простенький образец склепал и приложил (на форме измените какуюнить запись,или удалите, а потом посмотрите таблицу логи). В реальности логи лучше не хранить в аксесовской таблице а выгружать в какойнить сторонний файл txt или xml. Самое главное поймите логику работы.
Akina
Дата: 20.01.2016 15:53:49
Casper2002, у Вас явная идеологическая недосказанность.

Самым простым было бы безусловно блокировать запись, взятую пользователем на изменение. Если один пользователь открыл запись для изменения - остальные получают отказ (плюс, возможно, уведомление, кем заблокирована запись).

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

В любом случае настоятельно рекомендую исключить использование в качестве источника данных формы непосредственно таблицы.
Сергей Лалов
Дата: 20.01.2016 16:16:25
Akina
Casper2002,
В любом случае настоятельно рекомендую исключить использование в качестве источника данных формы непосредственно таблицы.


В принципе, начиная с 2010 версии аксесс есть удобный инструмент ведения статистики. Реализовали триггеры на уровне таблиц. Можно отслеживать изменения с уровня таблиц, не привязываясь к формам. На любителя.
Akina
Дата: 20.01.2016 16:25:36
Сергей Лалов, ну это неплохо, когда начинается "разбор полётов". А в качестве инструмента арбитража я бы не рекомендовал...