Microsoft Access: Приложения и утилитыАвтор Allen Browne, февраль 2009 г. Последнее обновление: апрель 2010 г. Оригинал http://allenbrowne.com/AppLogDocUse.html Перевел с английского Александр Артамонов Лог использования форм и отчетовЭта утилита позволяет отслеживать, кто и когда открывает какую форму или отчет в вашем приложении. Логирование обеспечивает информацию, как люди используют ваше приложение и может помочь в диагностике сбоев или порчи приложения. Чтобы использовать его, скопируйте таблицу лога и код из приложенного образца базы данных, и установите два свойства для каждой формы и отчета. Вам не придется писать или изменить какой-либо код. Чтобы использовать лог в своей базе данных:
Если эти свойства уже установлены на [Обработка событий], нажмите кнопку построителя (...) возле свойства. Аксесс откроет окно кода. Вставьте код в процедуру обработки события таким образом: Чтобы временно отключить логирование для всех форм/отчетов в базе данных, измените True на False в этой строке (ближе к верху модуля): Можно посмотреть код для этой утилиты в отдельном окне. Что находится в логе?Поля в таблице лога:
Обрабатываются ли все случаи?Каждый раз, когда вы открываете форму/отчет, вызывается LogDocOpen() чтобы записать событие. Когда закрываете документ снова, LogdocClose() находит соответствующую запись и записывает время закрытия. Основная сложность здесь, это идентифицировать 'соответствующую запись', чтобы убедиться, что обновлена правильная запись лога, когда вы закрываете форму. Так как Аксесс является многопользовательской средой, он должен обрабатывать случаи вроде таких:
Случай 8 важен. Если событие Open формы или отчета отменено в коде или макросом, форма/отчет не откроются и событие Close не сработает. Поэтому вы должны вызывать команду записи лога, только если событие Open не отменено. Вот таким образом: Private Sub Form_Open(Cancel As Integer) Вы не можете избежать ситуации, описанной выше, используя событие формы Load вместо Open. Есть случаи, когда Аксесс запускает событие Load, даже когда событие Open отменено, т.е. если вы включаете такую строку в Form_Open: Случай 9 также может быть проблемой. Код записи в лог предполагает ,что вы закроете форму после того, как открыли ее. Такое предположение может быть не выполнено, если системная дата изменилась (вами или скриптом синхронизации) после открытия формы. Если дата была передвинута вперед после открытия формы, код не найдет правильной записи для обновления. В этом случае будет создана новая запись, у которой OpenDateTime будет null. И наоборот, если вы открыли эту форму вчера и было аварийное завершение без закрытия формы, у вас будет запись, датированная вчерашним днем, где CloseDateTime содержит null. Теперь, если системная дата была установлена назад на вчерашний день, и вы случайно получили такой же идентификатор hWnd, как для этой формы вчера, логирующая процедура обновит неправильную запись. Случае, иные, чем описаны выше, не должны вызывать проблем. Переключение в или с режима конструктора записывается в лог корректно. Закрытие формы в режиме "Фильтр-по-форме" все равно запускает Form_Close. Некоторые события не действуют для отчетов в Аксессе 2007 и более поздних (события разделов в новых режимах Отчет или Макет), но события отчетов Open и Close все еще срабатывают. Если вы знаете о неучтенном случае, свяжитесь с нами. Интерпретация логаЛог может обеспечить информацию для диагностирования проблем:
Расширение программыВы вероятно захотите создать отчеты для показа записей, у которых пустые OpenDateTime или CloseDateTime. После проверки того, что это все работает, вам, вероятно, захочется подавить все сообщения об ошибках записи в лог, чтобы для пользователя запись в лог проходила незаметно. Удалите одиночный апостроф в строках с If и End If в функции LogError(). Еще лучше, замените ее настоящей процедурой логирования ошибок Если есть необходимость фиксировать каждого пользователя, "посещающего" каждую запись, воспользуйтесь событием Form_Current чтобы записывать имя формы и значение первичного ключа в еще одну таблицу. Примечание переводчика. Обсуждение решения автора по логированию использования форм и отчетов можно посмотреть на форуме сайта www.sql.ru начиная с этого поста http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&msg=11586642 |