powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / LOG-таблица
14 сообщений из 14, страница 1 из 1
LOG-таблица
    #32278818
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посоветуйте, пожалуйста, как оптимальнее всего оргаизовать ведение таблицы-LOG, т.е. каждое действие юзера должно "записываться" в эту таблицу.
Я вижу решение этой проблемы через запросы на добавление, но мне кажется это не оптимально - типа этих запросов надо делать слишком много. Ничего другого в голову не приходит :)
...
Рейтинг: 0 / 0
LOG-таблица
    #32278823
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Должна быть одна рутина с параметрами, которая будет писать в эту таблицу. А уж как организовывать эту рутину, с запросом ли или без, - это не так важно.
...
Рейтинг: 0 / 0
LOG-таблица
    #32278952
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть вариант с написанием 10-20 запросов для каждой формы это нормально?
...
Рейтинг: 0 / 0
LOG-таблица
    #32278986
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а какие действия отслеживать - сами факты изменения, удаления, добавления?
Вроде 3-4 должно хватить.
...
Рейтинг: 0 / 0
LOG-таблица
    #32279045
Фотография Нуф-нуф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде и одного должно хватить, если запись лога инкапсулировать в процедуру:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Sub WriteLog(
  ActionName as String, _
  FormName as String, _
  UserName as String, _
  Date as String, _
  Time as String, _
  другие_какие_надо_параметры_для_лога)
  'Один-разъединственный запрос вносит все полученные'
  'параметры в лог-таблицу.'
  ЗАПРОС
End Sub
После этого из всех своих форм вызываешь данную процедуру, предварительно заполнив необходимые параметры
...
Рейтинг: 0 / 0
LOG-таблица
    #32279064
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в запросе можно ставить Now() и обойтись без аргументов Date/Time. Разве нет?
...
Рейтинг: 0 / 0
LOG-таблица
    #32279068
Фотография Нуф-нуф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тем более! :)
Просто хотелось показать, что передавать в функцию надо те параметры, запись в лог которых необходима...
...
Рейтинг: 0 / 0
LOG-таблица
    #32279142
OldPferd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Года 3 назад рисовал нечто подобное на МА 97
Там была функция и вызов ее в нужных формах в Form_BeforeUpdate, Form_AfterUpdate, Form_AfterInsert, Form_AfterDelConfirm, Form_Delete
вызов был почти везде однотипым,что-то вроде
jur_write JUR_UPDATE, Me
jur_write JUR_DEL, Me

Проходил по форме,запоминал, что было в измененых полях до, потом, что стало после. Делал возможность настройки на протоколирование разных таблиц, режимов...
Если хочешь - могу дома поискать это и переслать, правда, там хватает и специфики программы,
...
Рейтинг: 0 / 0
LOG-таблица
    #32279185
Фотография Polev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня была такая заморочка... Решил ее так:
Под каждую форму, где юзверь меняет данные создал соответственную таблицу для лога, плюс поля идентификации: userID, time и т.д.
И вот такая вот процедурка на все случаи жизни:
передается рекордсет с букмаркой на измененную запись и имя логовой таблицы.
Через DAO добавляю в логовую таблицу измененную запись.
All.
Процедура одна на все случаи жизни....
Главное, чтобы переданный рекордсет совпадал с таблицей по полям....
...
Рейтинг: 0 / 0
LOG-таблица
    #32279284
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вариант юзать не таблу а тхт-файл ".log" стандартным выводом файла Open....

все то же самое: одна процедура на запись любого события,
а формат csv через ";" легко потом смотреть что в блокноте что в виде прилинкованной таблы.
главное при записи помнить, что нужно добавлять, а не затирать файл:
open logfilename FOR APPEND as 1
(или наподобие)
...
Рейтинг: 0 / 0
LOG-таблица
    #32279718
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо! Очень занимательные идеи :)
-------------------------

Проходил по форме,запоминал, что было в измененых полях до, потом, что стало после
Подскажите кто-нибудь как так пробежаться по измененной форме, чтобы в лог записать значение "до изменения"
...
Рейтинг: 0 / 0
LOG-таблица
    #32279729
Kach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Когдато на http://www.msaccess.ru/
было все это и очень круто, правда сайт чичас кажеться умер
...
Рейтинг: 0 / 0
LOG-таблица
    #32279782
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сейчас сайт является умирающим...
...
Рейтинг: 0 / 0
LOG-таблица
    #32280113
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что я нашел по этому вопросу:
Это модуль:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
Option Compare Database
Option Explicit

Private Declare Function GetComputerName Lib  "kernel32"  Alias  "GetComputerNameA"  (ByVal lpBuffer As String, nSize As Long) As Long

Public Function Log_ComputerName()
Dim a As String *  40 
Dim nSize As Long
nSize =  40 
Call GetComputerName(a, nSize)
Log_ComputerName = Log_StrZ(a)
End Function

Private Function Log_StrZ(par As String) As String
Dim nSize As Long, i As Long, Rez As String
   nSize = Len(par)
   i = InStr( 1 , par, Chr( 0 )) -  1 
   If i > nSize Then i = nSize
   If i <  0  Then i = nSize
   Log_StrZ = Mid(par,  1 , i)
End Function

Function Log_CompareArrays(varArr1(), varArr2(), rst As DAO.Recordset, varKeyName As String) As Integer
Dim i As Long
Dim rClone As DAO.Recordset
Dim varComp As Integer

If varArr2( 1 , rst.Fields.Count) =  "-1 " Then
    varComp =  2 
ElseIf varArr1( 1 , rst.Fields.Count) =  "-1 " Then
    varComp =  1 
Else
    If (varArr1( 2 , rst.Fields.Count)( 0 ) = varArr2( 2 , rst.Fields.Count)( 0 ) And _
        varArr1( 2 , rst.Fields.Count)( 1 ) = varArr2( 2 , rst.Fields.Count)( 1 ) And _
        varArr1( 2 , rst.Fields.Count)( 2 ) = varArr2( 2 , rst.Fields.Count)( 2 ) And _
        varArr1( 2 , rst.Fields.Count)( 3 ) = varArr2( 2 , rst.Fields.Count)( 3 )) Then
        varComp = - 1 
        For i =  0  To rst.Fields.Count -  1 
            If Nz(varArr1( 2 , i)) <> Nz(varArr2( 2 , i)) Then
                varComp =  0 
                Exit For
            End If
        Next i
    Else
        varComp =  1 
    End If
End If

Dim db As Database
Dim tblLog As DAO.Recordset


Select Case varComp
    'Изменений не было'
    Case - 1 
    'Изменения были'
    Case  0 
        Set db = CurrentDb
        Set tblLog = db.OpenRecordset( "LOG_TABLE" , dbOpenDynaset)
        Set rClone = Screen.ActiveForm.RecordsetClone
        
        For i =  0  To rst.Fields.Count -  1 
            If Nz(varArr1( 2 , i)) <> Nz(varArr2( 2 , i)) Then
                tblLog.AddNew
                tblLog![COMPUTER] = Log_ComputerName()
                tblLog![User] = CurrentUser()
                tblLog![Table] = rst.Fields(varKeyName).SourceTable
                tblLog![Form] = Screen.ActiveForm.NAME
                tblLog![OPERATION] =  "Èçìåíåíèå çàïèñè" 
                tblLog![DATE] = Now()
                tblLog![ref] = rClone( "Ðåô ¹" )
                tblLog![FIELD] = Nz(varArr1( 1 , i))
                tblLog![OLD_VALUE] = Nz(varArr1( 2 , i))
                tblLog![NEW_VALUE] = Nz(varArr2( 2 , i))
                tblLog.Update
            End If
        Next i
        
    'Новая запись'
    Case  1 
        Set db = CurrentDb
        Set tblLog = db.OpenRecordset( "LOG_TABLE" , dbOpenDynaset)
        Set rClone = Screen.ActiveForm.RecordsetClone
        
        For i =  0  To rst.Fields.Count -  1 
        If Nz(varArr2( 2 , i)) <>  "" Then
            tblLog.AddNew
            tblLog![COMPUTER] = Log_ComputerName()
            tblLog![User] = CurrentUser()
            tblLog![Table] = rst.Fields(varKeyName).SourceTable
            tblLog![Form] = Screen.ActiveForm.NAME
            tblLog![OPERATION] = " Íîâàÿ çàïèñü "
            tblLog![DATE] = Now()
            tblLog![ref] = rClone(" Ðåô ¹ ")
            tblLog![FIELD] = Nz(varArr1(1 , i))
            tblLog![OLD_VALUE] = " "
            tblLog![NEW_VALUE] = Nz(varArr2(2 , i))
            tblLog.Update
            End If
        Next i
    'Удаление записи'
    Case  2 
        Set db = CurrentDb
        Set tblLog = db.OpenRecordset("LOG_TABLE ", dbOpenDynaset)
        Set rClone = Screen.ActiveForm.RecordsetClone
        
        For i = 0  To rst.Fields.Count -  1 
            tblLog.AddNew
            tblLog![COMPUTER] = Log_ComputerName()
            tblLog![User] = CurrentUser()
            tblLog![Table] = rst.Fields(varKeyName).SourceTable
            tblLog![Form] = Screen.ActiveForm.NAME
            tblLog![OPERATION] = "Óäàëåíèå çàïèñè "
            tblLog![DATE] = Now()
            tblLog![ref] = rClone(" Ðåô ¹ ")
            tblLog![FIELD] = Nz(varArr1(1 , i))
            tblLog![OLD_VALUE] = Nz(varArr1( 2 , i))
            tblLog![NEW_VALUE] = " "
            tblLog.Update
        Next i
        
    Case Else
End Select

End Function

Sub Log_FillRecordArray(varArr(), rst As DAO.Recordset, frm As Form)
On Error GoTo err_log_FillRecordArray
Set rst = frm.RecordsetClone
rst.Bookmark = frm.Bookmark
Dim i As Long
For i = 0  To rst.Fields.Count -  1 
    varArr( 1 , i) = rst.Fields(i).NAME
    varArr( 2 , i) = rst.Fields(i).Value
    'Debug.Print varArr( 1 , i) & " ->  " & varArr(2 , i)
Next i
varArr( 1 , i) = "Bookmark "
varArr(2 , i) = frm.Bookmark

Exit_log_FillRecordArray:
    Exit Sub

err_log_FillRecordArray:
    If Err.Number =  3021  Then
        varArr( 1 , rst.Fields.Count) = "- 1 "
    End If
    Resume Exit_log_FillRecordArray
End Sub


А вот это в соответствующую форму:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
Option Compare Database
Option Explicit

Private varOldRecord() As Variant
Private varNewRecord() As Variant
Private varKeyName As String
Private db As Database
Private rst As DAO.Recordset
Private tdf As TableDef
Private fld As FIELD

Private Sub Log_Initialize()
Set db = CurrentDb
Set rst = Me.RecordsetClone
varKeyName = rst.Fields( 0 ).NAME
ReDim varOldRecord( 1  To  2 ,  0  To rst.Fields.Count) As Variant
ReDim varNewRecord( 1  To  2 ,  0  To rst.Fields.Count) As Variant
End Sub



Private Sub Form_AfterDelConfirm(status As Integer)
If status = acDeleteOK Then
    varNewRecord( 1 , rst.Fields.Count) = - 1 
    Call Log_CompareArrays(varOldRecord(), varNewRecord(), rst, varKeyName)
End If
End Sub

Private Sub Form_AfterUpdate()
Call Log_FillRecordArray(varNewRecord, rst, Me)
Call Log_CompareArrays(varOldRecord(), varNewRecord(), rst, varKeyName)
End Sub


Private Sub Form_BeforeUpdate(Cancel As Integer)
Call Log_FillRecordArray(varOldRecord, rst, Me)
End Sub

Private Sub Form_Delete(Cancel As Integer)
varNewRecord( 1 , rst.Fields.Count) = - 1 
    Call Log_CompareArrays(varOldRecord(), varNewRecord(), rst, varKeyName)
Call Log_FillRecordArray(varOldRecord, rst, Me)

End Sub

Private Sub Form_Open(Cancel As Integer)
Call Log_Initialize
End Sub
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / LOG-таблица
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]