1

Тема: Запись истории изменения полей и других действий в базу логирования

Библиотека LogEvents.

%REM
пишет историю изменения полей и других действий в базу логирования
1. нужна данная библитека,ее необходимо подключить в глобалах формы по которой док будет создаваться
2. прописать вызов AccessPostOpen в событии LogPostOpen нужной формы   
3. прописать вызов AccessPostSave в событии LogPostSave нужной формы
(пункты 2 и 3 нужны для мониторинга изменений полей)
4. нужна вьюшка SettingsLogHistory
5. нужна форма LogAccessHistory
6. ну и для заполнения полей которые нужно мониторить, для удобства, в outline сделать доступ к вышеуказанной вьюшке
7. процедура LogEvents нужна для логирования других действий

Описание процедур см. в каждой процедуре
%END REM
Option Public

Поделиться

2

Re: Запись истории изменения полей и других действий в базу логирования

Декларации

Dim LogMassivU() As String  'наименования полей для пользователя
Dim LogMassivS() As String  'наименования полей системные
Dim LogMassivV() As String  'значения полей при открытии документа
Dim Loginitial As Boolean
Dim Logserv_name As String
Dim Logdb_name As String
Dim Logflag_db As String

Const Logsep="{***}"
Const Logmax_value_bytes=25000 'max кол-во байт которое должно быть в документе

Поделиться

3

Re: Запись истории изменения полей и других действий в базу логирования

%REM
    Sub LogEvents
    Description: логирование любых действий с документом
    вызвается в любом месте кода
аргументы
    info - указываем информацию о совершаемом действии
    header - указываем инфу о документе(по этой информации будут категоризироваться для пользователя документы)
    flag - True/False (True - перезаписывать header
                        False - не перезаписывать header)
                        но в любом случае не зависимо от значения flag(True/False), как минимум один раз, при создании документа лога header запишется   
%END REM
Sub LogEvents(info As String, header As String, flag As Boolean)
    Dim session As New NotesSession, workspace As New NotesUIWorkspace, cd As NotesDocument
    Dim view As NotesView, doc As NotesDocument
   
    Set db = session.CurrentDatabase
    Set cd = workspace.CurrentDocument.document
    Set view = db.GetView("SettingsLogHistory")   
    If view Is Nothing Then
        Print "Нет доступа к представлению настроек логов!"
        Exit Sub
    End If       
    Set doc = view.GetFirstDocument   
    Do While Not(doc Is Nothing)
        If doc.forma(0)=cd.form(0) Then
            If doc.monitor(0)="1" Then
                GoTo cont                       
            End If
        End If       
        Set doc = view.GetNextDocument(doc)
    Loop
    Set doc = view.GetFirstDocument
cont:
    Logserv_name=doc.server_name_log(0)
    Logdb_name=doc.db_name_log(0)
    Logflag_db=doc.flag_db(0)       
   
    Call WriteInDocLog(cd, header, info, flag)
End Sub

Поделиться

4

Re: Запись истории изменения полей и других действий в базу логирования

%REM
    Sub LogPostOpen
    Description: логирование изменений полей в документе
    вызвается в событии PostOpen формы
   
    записываем в массивы исходную информацию при открытии документа
%END REM
Sub LogPostOpen
    Dim workspace As New NotesUIWorkspace, session As New NotesSession, db As NotesDatabase
    Dim view As NotesView, cd As NotesDocument, doc As NotesDocument, item As NotesItem, item1 As NotesItem
   
    Set db = session.CurrentDatabase   
    Set view = db.GetView("SettingsLogHistory")   
    If view Is Nothing Then
        Print "Нет доступа к представлению настроек логов!"
        Exit Sub
    End If   
    Set cd = workspace.CurrentDocument.document
    Set doc = view.GetFirstDocument   
    Do While Not(doc Is Nothing)
        If doc.forma(0)=cd.form(0) Then
            If doc.monitor(0)="1" Then
                Logserv_name=doc.server_name_log(0)
                Logdb_name=doc.db_name_log(0)
                Logflag_db=doc.flag_db(0)       
                d%=0
                Set item1=doc.GetFirstItem("fields")
                ForAll v In item1.Values               
                    If StrRightBack( v, "|" )="да" Then                       
                        ReDim Preserve LogMassivS(d%) ' Системное лотусовое имя поля
                        ReDim Preserve LogMassivU(d%) ' Имя поля на русском
                        ReDim Preserve LogMassivV(d%) ' значение поля
                        LogMassivS(d%)=StrLeft( v, "|" )                       
                        LogMassivU(d%)=StrLeft(Replace(v, StrLeft( v, "|" )+"|", ""), "|" )
                        If cd.HasItem( LogMassivS(d%) ) Then
                            Set item = cd.GetFirstItem( LogMassivS(d%) )
                            LogMassivV(d%)=item.Text                           
                        End If                       
                        d%=d%+1
                        Loginitial=True                       
                    End If                   
                End ForAll                           
                Exit sub
            End if
        End If       
        Set doc = view.GetNextDocument(doc)
    Loop
End Sub

Поделиться

5

Re: Запись истории изменения полей и других действий в базу логирования

%REM
    Sub LogPostSave
    Description: логирование изменений полей в документе
    вызвается в событии PostSave формы
   
    сравниваем значения полей м исходными данными и если были изменения - записываем в лог
аргументы
    header - указываем инфу о документе(по этой информации будут категоризироваться для пользователя документы)
    flag - True/False (True - перезаписывать header
                        False - не перезаписывать header)
                        но в любом случае не зависимо от значения flag(True/False), как минимум один раз, при создании документа лога header запишется
%END REM
Sub LogPostSave(header As String, flag as boolean)
    If Not Loginitial Then Exit sub
    Dim workspace As New NotesUIWorkspace, cd As NotesDocument      
    Dim history_info As String, item As NotesItem, tmp As String, IsSave As Boolean
   
    Set cd=workspace.CurrentDocument.Document
    IsSave=false
       
    For i%=0 To UBound(LogMassivU)
        Set item = cd.GetFirstItem( LogMassivS(i%) ) ' Системное лотусовое имя поля
        If Not (item Is nothing) Then
            If LogMassivV(i%)<>item.Text Then   ' старое значение поля <> текущему
                tmp=LogMassivU(i%)+" ("+LogMassivS(i%)+")"+Logsep+"Было: "+Replace(LogMassivV(i%),Chr(13)+Chr(10),Logsep)+Logsep+"Стало: "+Replace(item.Text,Chr(13)+Chr(10),Logsep)
                If history_info="" Then
                    history_info=tmp
                Else
                    history_info=history_info+Logsep+" "+Logsep+tmp   
                End If                   
                IsSave=true
            End If
        End If       
    Next
   
    If IsSave Then Call WriteInDocLog(cd, header, history_info, flag)
End Sub

Поделиться

6

Re: Запись истории изменения полей и других действий в базу логирования

%REM
    Sub WriteInDocLog
    Description: запись в лог (используется другими процедурами данной библиотеки)
%END REM
Sub WriteInDocLog(cd As NotesDocument, header As String, info As String, flag As Boolean)
    Dim session As New NotesSession, item As NotesItem
    Dim db_log As NotesDatabase, view_log As NotesView, doc_log As NotesDocument   
    Dim arr_history_date As Variant, arr_history_info As Variant, arr_history_Name As Variant
   
    Set db_log = session.GetDatabase(Logserv_name, Logdb_name)
    If Not db_log.Isopen Then
        Print "Нет доступа к БД логов!"
        Exit Sub
    End If   
    Set view_log=db_log.Getview("log_system_"+Logflag_db)
    If view_log Is Nothing Then
        Print "Нет доступа к представлению логов!"
        Exit Sub
    End If
   
    Set doc_log=view_log.Getdocumentbykey(cd.Universalid)
    If doc_log Is Nothing Then
        GoSub CreateDocLog           
    Else
        If doc_log.Size>Logmax_value_bytes Then
            doc_log.flag=1
            Call doc_log.Save(True, False)   
            GoSub CreateDocLog
        Else
            arr_history_date=ArrayAppend( doc_log.history_date, Now )
            arr_history_info=ArrayAppend( doc_log.history_info, info )
            arr_history_Name=ArrayAppend( doc_log.history_Name, session.UserName )
           
            doc_log.history_date=arr_history_date
            doc_log.history_info=arr_history_info
            doc_log.history_Name=arr_history_Name   
        End If           
    End If       
    'будем или нет перезаписывать инфу о документе
    If flag And doc_log.header(0)<>header Then doc_log.header=header       
   
    Call doc_log.Save(True, False)   
    Exit Sub
   
CreateDocLog:
    Set doc_log = db_log.CreateDocument       
    doc_log.form="LogAccessHistory"
    doc_log.header=header
    doc_log.history_UNID=cd.Universalid
    doc_log.flag=0
    doc_log.flag_db=Logflag_db
    doc_log.Author="*"
    doc_log.Reader="*"
    Set item=doc_log.Getfirstitem("Author")
    item.Isauthors=True
    Set item=doc_log.Getfirstitem("Reader")
    item.isreaders=True
    doc_log.history_date=Now
    doc_log.history_info=info
    doc_log.history_Name=session.UserName
    Return
End Sub

Поделиться