Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / LOG-таблица / 14 сообщений из 14, страница 1 из 1
29.09.2003, 19:19
    #32278818
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LOG-таблица
Посоветуйте, пожалуйста, как оптимальнее всего оргаизовать ведение таблицы-LOG, т.е. каждое действие юзера должно "записываться" в эту таблицу.
Я вижу решение этой проблемы через запросы на добавление, но мне кажется это не оптимально - типа этих запросов надо делать слишком много. Ничего другого в голову не приходит :)
...
Рейтинг: 0 / 0
29.09.2003, 19:23
    #32278823
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LOG-таблица
Должна быть одна рутина с параметрами, которая будет писать в эту таблицу. А уж как организовывать эту рутину, с запросом ли или без, - это не так важно.
...
Рейтинг: 0 / 0
29.09.2003, 22:52
    #32278952
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LOG-таблица
То есть вариант с написанием 10-20 запросов для каждой формы это нормально?
...
Рейтинг: 0 / 0
30.09.2003, 02:52
    #32278986
Alexander G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LOG-таблица
а какие действия отслеживать - сами факты изменения, удаления, добавления?
Вроде 3-4 должно хватить.
...
Рейтинг: 0 / 0
30.09.2003, 09:08
    #32279045
Нуф-нуф
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LOG-таблица
Вроде и одного должно хватить, если запись лога инкапсулировать в процедуру:
Код: 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
30.09.2003, 09:36
    #32279064
Лифчик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LOG-таблица
А в запросе можно ставить Now() и обойтись без аргументов Date/Time. Разве нет?
...
Рейтинг: 0 / 0
30.09.2003, 09:39
    #32279068
Нуф-нуф
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LOG-таблица
Тем более! :)
Просто хотелось показать, что передавать в функцию надо те параметры, запись в лог которых необходима...
...
Рейтинг: 0 / 0
30.09.2003, 10:50
    #32279142
OldPferd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LOG-таблица
Года 3 назад рисовал нечто подобное на МА 97
Там была функция и вызов ее в нужных формах в Form_BeforeUpdate, Form_AfterUpdate, Form_AfterInsert, Form_AfterDelConfirm, Form_Delete
вызов был почти везде однотипым,что-то вроде
jur_write JUR_UPDATE, Me
jur_write JUR_DEL, Me

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

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

Проходил по форме,запоминал, что было в измененых полях до, потом, что стало после
Подскажите кто-нибудь как так пробежаться по измененной форме, чтобы в лог записать значение "до изменения"
...
Рейтинг: 0 / 0
30.09.2003, 16:12
    #32279729
Kach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LOG-таблица
Когдато на http://www.msaccess.ru/
было все это и очень круто, правда сайт чичас кажеться умер
...
Рейтинг: 0 / 0
30.09.2003, 16:49
    #32279782
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LOG-таблица
сейчас сайт является умирающим...
...
Рейтинг: 0 / 0
30.09.2003, 23:48
    #32280113
Vsevolod V
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LOG-таблица
Вот что я нашел по этому вопросу:
Это модуль:
Код: 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
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / LOG-таблица / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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