Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Microsoft Access - программирование и готовые решения


Выпуск 20. Access Rapid Start - конструктор приложений в Access

Подписка: "Access 2003/2010 - программирование и готовые решения"
Дата: 17.09.2012
Автор: Парусников Алексей
Сайт: http://www.accessoft.ru под редакцией с http://www.leadersoft.ru
Загрузка: ARS 2003 ARS 2007 ARS 2010
Получить ключ: Key_ARS

В данном цикле статей рассказывается о работе с конструктором приложений Access - Access Rapid Start. Дополнительные вопросы по этой теме Вы можете задать на форуме. Вы так же можете заказать персональную консультацию или перенос вашего проекта в ARS, связаться с автором для решения вопросов о создании программы на базе ARS - в последнем случае вы кроме готового продукта получите возможность самостоятельно его развивать.


    Данная статья ориентирована на начинающих разработчиков Access, желающих более углубленно изучить возможности программирования в Access и сделать свои приложения более профессиональными.
Логирование действий пользователя

     Начиная с версии 2.1. в ARS включено автоматическое ведение лог-журнала действий пользователя. Это позволяет вести историю изменений, что актуально в БД, требующих строгого заполнения данных.

     В предыдущих версиях использовалась упрощенная система логирования, причем только последнего изменения. Это делалось при помощи трех обязательных полей в таблице:

RecAdd – дата/время добавления записи
RecEdit – дата/время последнего изменения записи
Oprt_ID – код оператора, внесшего изменения

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

     Под логированием действий пользователей подразумевается отслеживание внесенных ими изменений данных, сделанных через формы ввода/редактирования. При этом есть отличия настройки DAO и ADO форм. Дело в том, что только ADO рекордсет в отличие от DAO рекордсета поддерживает обработку событий изменения записи. Именно на событиях ADO рекордсета построена вся логика логирования ADO форм. Для DAO используются события самой формы (до/после добавления/изменения/удаления), что потребует добавления немного более длинного кода в модуль формы. Мы не стали резервировать их в классе cls_Form, так как они часто используются разработчиками, оставив тем самым им возможность добавлять в них свой код.

     Так же логирование происходит и при работе с поисковыми формами: создание/изменение/удаление записей так же отслеживаются системой. В лог-журнал пишутся данные только тех полей, которые видит пользователь при удалении - это поля списка поисковой формы, а надписи полей берутся из контролов сортировки. Если при удалении произошла ошибка, то производится откат записей лог-журнала.

     Для просмотра журнала изменений на форму редактирования добавлена метка История. При клике по ней открывается журнал с фильтром по объекту (данной форме) и коду открытой записи. Аналогичная метка есть на поисковой – она открывает журнал по всем записям поисковой формы. Для просмотра журнала по всей БД используется пункт меню: Администрирование – Настройки – Журнал действий пользователей. Логии можно выгружать стандартной процедурой выгрузки данных с поисковой в доступные форматы.

     Чтобы запустить логирование изменений нужно сделать следующее:

  1. В разделе: Разработчик – Объекты логирования указать перечень объектов, по которым нужно отслеживать изменения. Это могут быть таблицы и запросы (если они являются источниками данных стандартных справочников ARS), формы редактирования (не поисковые, а именно формы-редакторы поисковых)
  2. Добавить в форму специальный код, запускающий процедуру логирования
  3. Если необходимо просматривать логи с формы, поместить на ней метку История

     Разберем подробно п.2, так как настройка DAO и ADO форм отличаются, причем отличия есть и в типе формы: главная или подчиненная. Для облегчения понимания различия, сделаны два типа форм редакторов: frm_Zakaz/frm_Zakaz_ADO, frm_Zakaz_sub/frm_Zakaz_sub_ADO.

     Общим для всех типов форм является обязательное объявление в разделе General переменной:

Private RecLog As cls_RecordsLog

     А так же ее уничтожение при выгрузке формы:

Private Sub Form_Unload(Cancel As Integer)
   Set RecLog = Nothing
End Sub

В событие текущая запись нужно поместить:

RecLog.SetflgInsert = False

Далее смотрим отличия

Настройка главной DAO формы

Ниже указанный блок является обязательным:

'***************Логирование DAO форм*****************
Private Sub Form_Load()
   Set RecLog = New cls_RecordsLog
   Set RecLog.SetForm = Me.Form
   Set RecLog.SetControlRecID = Me.Zak_ID
End Sub

Private Sub Form_BeforeInsert(Cancel As Integer)
   Call RecLog.BeforeChanges(adRsnAddNew)
End Sub

Private Sub Form_AfterInsert()
   Call RecLog.AfterChanges(adRsnAddNew)
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
   Call RecLog.BeforeChanges(adRsnFirstChange)
End Sub

Private Sub Form_AfterUpdate()
   Call RecLog.AfterChanges(adRsnFirstChange)
End Sub

Private Sub Form_Delete(Cancel As Integer)
   Call RecLog.BeforeChanges(adRsnDelete)
End Sub

Private Sub Form_AfterDelConfirm(Status As Integer)
   Call RecLog.AfterChanges(adRsnDelete, Status)
End Sub

Private Sub Form_Unload(Cancel As Integer)
   Set RecLog = Nothing
End Sub
'***************Логирование DAO форм*****************

Его можно просто копировать в каждую форму, только в Form_Load() нужно вместо Me.Zak_ID указывать ссылку на ключ главной формы. Как уже говорилось выше, в событие Form_Current() добавляем:

RecLog.SetflgInsert = False

и только после присвоения источника подчиненной делам вызов процедуры установки параметров логирования для подчиненной

CallByName Forms(Me.Name).Controls("frm_sub").Form, "SetLogSettings", VbMethod

Настройка подчиненной DAO/ADO формы

Для DAO формы так же вставляем блок перехвата событий данных формы, затем:

Private Sub Form_Current()
   If Not (RecLog Is Nothing) Then RecLog.SetflgInsert = False
End Sub

И процедуру установки параметров, которая будет запускаться с главной:

Public Sub SetLogSettings()
On Error GoTo Err_
   'Логирование действий пользователей
   Set RecLog = New cls_RecordsLog
   Set RecLog.SetForm = Me.Form
   'Контрол ИД записи подчиненной формы
   Set RecLog.SetControlRecID = Me!ZD_ID
   'Контрол ИД записи родительской формы
   Set RecLog.SetControlRecParentID = Me.Parent.Form.Zak_ID
   Set RecLog.SetControlHistory = Me.Controls("history")
Exit Sub

Err_:
   Call ErrorBases(Err)
End Sub

Здесь меняем только Me!ZD_ID (указываем свой ключ подчиненной формы) и Zak_ID (ключ связи с главной)

Настройка главной ADO формы

Здесь уже не требуется перехват событий формы, так как изменение записей отслеживается через свойства ADO рекордсета. Но в раздел General выносим дополнительно переменные ADO источников главной и подчиненной, так как их тоже потребуется уничтожить при закрытии:

Private RecLog As cls_RecordsLog
Private rs As ADODB.Recordset, rs_Sub As ADODB.Recordset

Их уничтожение происходит в том же событии формы:

'***************Логирование ADO форм*************
Private Sub Form_Unload(Cancel As Integer)
   Set RecLog = Nothing
   If Not rs Is Nothing Then
      If rs.State = 1 Then rs.Close
      Set rs = Nothing
   End If
   If Not rs_Sub Is Nothing Then
      If rs_Sub.State = 1 Then rs_Sub.Close
      Set rs_Sub = Nothing
   End If
End Sub

'***************Логирование ADO форм*************

Так же как в DAO форме, в событие Form_Current() добавляем

RecLog.SetflgInsert = False

и только после присвоения источника подчиненной делам вызов процедуры установки параметров логирования для подчиненной:

CallByName Forms(Me.Name).Controls("frm_sub").Form, "SetLogSettings", VbMethod

А параметры для главной задаем в событии Открытие:

'логирование
Set RecLog = New cls_RecordsLog
Set RecLog.SetForm = Me.Form
Set RecLog.SetControlRecID = Me.Zak_ID

Здесь мы меняем только Me.Zak_ID – пишем свой ключ главной. Есть еще важный момент: для ADO форм источники данных (rs, rs_Sub) закрывается только при закрытии. Это важно, так если их закрыть после присвоения рекордсета форме, например в событии Открытие, логирования не будет.

Настройка логирования поисковой формы сводится к одной строчке, которую нужно прописать сразу после инициализации класса формы

frm.SetObjectNameForHistory = a_FrmEditName


Полезные ссылки

Интернет магазин от Leadersoft.ru
В этом магазине Вы можете купить не только готовое программное обеспечение для бизнеса, а также найти компактные решения для самостоятельного проектирования на Microsoft Access, SQL Server или ASP.NET

В избранное