Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2013, 19:26   #11
duh_si
Форумчанин
 
Регистрация: 18.04.2013
Сообщений: 118
По умолчанию

Myhaylo посмотрите Триггер который я выложил, как вы думаете его возможно приладить к access2010?
duh_si вне форума Ответить с цитированием
Старый 24.07.2013, 08:28   #12
Myhaylo
Форумчанин
 
Регистрация: 19.07.2012
Сообщений: 520
По умолчанию

Приладить можно всё, что угодно. Поясните, что именно Вы хотите получить.
Окупант, руки прочь от Украины!!! Слава Героям!
Myhaylo вне форума Ответить с цитированием
Старый 24.07.2013, 08:57   #13
duh_si
Форумчанин
 
Регистрация: 18.04.2013
Сообщений: 118
По умолчанию

Смотрите , допустим у нас форма, на ней поле в нем надись "Яблоко" пользователь зашел на эту форму и изменил надпись на "Апельсин" и в журналИзменений получаем запись что на что было изменено. в пример который я выложил здесь, именно так делается, пытаясь приладить к своей программе вылазиют ошибки, ошибку я тоже здесь выкладывал, начал изучать что за ошибка, нашел Возможные варианты ее исправления - это включить поддержку синтаксиса ANSI92. Не моя цитата
Цитата:
"Сейчас для меня важно другое - а что перестанет работать или перестанет правильно работать при переходе с JET SQL на ANSI-92? Всюду говорится, что подстановочные символы иные, в частности, вместо "*", надо использовать "%"."
duh_si вне форума Ответить с цитированием
Старый 24.07.2013, 11:15   #14
Myhaylo
Форумчанин
 
Регистрация: 19.07.2012
Сообщений: 520
По умолчанию

Я не знаю, что это Вы выложили, но если это - триггер, то я - паровоз...
Вам нужно:
1. Создать таблицу "ЖурналИзменений" с полями:
- имя формы;
- имя элемента управления;
- старое значение;
- новое значение;
- дата изменения;
- имя пользователя.
2. Для каждого элемента управления формы в подпрограмме обработки события "После обновления" (UfterUpdate) заполнять журнал либо через объект RecordSet, либо с помощью запросов на добавление (DoCmd.RunSQL).
Старое значение - возвращает свойство OldValue элемента управления, новое значение - имя этого элемента управления.
Окупант, руки прочь от Украины!!! Слава Героям!
Myhaylo вне форума Ответить с цитированием
Старый 24.07.2013, 11:50   #15
Myhaylo
Форумчанин
 
Регистрация: 19.07.2012
Сообщений: 520
По умолчанию

Да, забыл:
- номер записи;
Окупант, руки прочь от Украины!!! Слава Героям!
Myhaylo вне форума Ответить с цитированием
Старый 24.07.2013, 12:02   #16
duh_si
Форумчанин
 
Регистрация: 18.04.2013
Сообщений: 118
По умолчанию

Цитата:
Сообщение от Myhaylo Посмотреть сообщение
Я не знаю, что это Вы выложили, но если это - триггер, то я - паровоз...
Сейчас посмотрел еще раз выложенный мной пример, возможно я его сломал когда ковырялся в нем...вот сейчас выложил пример проверил все работает...откройте таблицу А, занесите любую запись, потом запустите форму F_Audit A там увидете свою запись, откройте снова таблицу А и измените своб запись на новую, обновите форму и будет старая и новая запись....

Цитата:
1. Создать таблицу "ЖурналИзменений" с полями:
- имя формы;
- имя элемента управления;
- старое значение;
- новое значение;
- дата изменения;
- имя пользователя.
это сделано.
Цитата:
2. Для каждого элемента управления формы в подпрограмме обработки события "После обновления" (UfterUpdate) заполнять журнал либо через объект RecordSet, либо с помощью запросов на добавление (DoCmd.RunSQL).
Старое значение - возвращает свойство OldValue элемента управления, новое значение - имя этого элемента управления.
а рекордсетом таким образом делать?
Код:
Dim MyRst As Recordset
Dim MyValue As Integer  
Set MyRst = CurrentDb.OpenRecordset("ЖурналИзменений", dbOpenDynaset)
MyValue = CurrentUser()
With MyRst
    .AddNew
    'Заполнение полей значениями
    ![ФИО] = MyValue 'т.е кто изменения делал
    ![дата изменения] = Now()
    ![Имя объекта] = ?
    ![Старое значение] = ?
    ![Новое значение] = ?
    .Update
End With
MyRst.Close
Цитата:
(DoCmd.RunSQL).
Акак таким образом делать?
Вложения
Тип файла: rar Trigger.rar (20.6 Кб, 13 просмотров)
duh_si вне форума Ответить с цитированием
Старый 13.08.2013, 16:52   #17
duh_si
Форумчанин
 
Регистрация: 18.04.2013
Сообщений: 118
По умолчанию

Сделал таким образом...Просьба проверить, так как в кодинге я плох

Цитата:
Option Compare Database

Public Function setOldAfter()
'On Error Resume Next
Dim ol As Recordset
Dim ct As Control, ov As String, nv As String
Set ct = Screen.ActiveControl
ov = ct.OldValue
nv = ct.value
'MsgBox ov & " " & nv
Set ol = CurrentDb.OpenRecordset("SELECT * FROM tblLogDoc WHERE LogDocID=" & ID, dbOpenDynaset)
With ol
.Edit
!new_value = nv
.Update
End With
ol.Close
End Function

Public Function setOldBefore()
'On Error Resume Next
Dim ol As Recordset
Dim ct As Control, ov As String, nv As String
Set ct = Screen.ActiveControl
ov = ct.OldValue
nv = ct.value
'MsgBox ov & " " & nv
Set ol = CurrentDb.OpenRecordset("tblLogDoc" , dbOpenDynaset, dbAppendOnly)
With ol
.AddNew
!Old_value = ov
.Update
.Bookmark = .LastModified
ID = ![LogDocID]
End With
ol.Close
End Function
вызываю таким образом
Цитата:
Private Sub ИМЯС_AfterUpdate()
Call setOldAfter
End Sub

Private Sub ИМЯС_BeforeUpdate(Cancel As Integer)
Call setOldBefore
End Sub
И все вроде хорошо, но всегда есть Но
Контролов на формах куча, на каждый вешать эти функции задолбаешься, может есть способ как нибудь сделать это все более удобно?

И вторая проблема:
См.рис
есть вторая функция(в другом модуле) которая делает записи: в какое время какую форму и кто ее открывал...

Хочу соединить все в одной табличке и форму кто какую открывал и какие записи там изменял, проблема в том что:
Записи старой и новой информации делаются на второй строке(На рисунке это видно)
Изображения
Тип файла: jpg 4.jpg (49.2 Кб, 129 просмотров)
duh_si вне форума Ответить с цитированием
Старый 13.08.2013, 16:56   #18
duh_si
Форумчанин
 
Регистрация: 18.04.2013
Сообщений: 118
По умолчанию

Вот второй модуль (Часть!)

Цитата:
Option Compare Database
Option Explicit


'Purpose: Log when your forms/reports are opened/closed.
'Author: Allen Browne
'Usage: Open/close events of forms/reports call LogDocOpen() and LogDocClose()
'Documentation: http://allenbrowne.com/AppLogDocUse.html

'Set this to False to turn all logging off.
Private Const mbLogDox As Boolean = True
'Name of this module (for error logger.)
Private Const conMod = "ajbLogDoc"

'API calls to get the Windows user name and computer name
Private Declare Function apiGetUserName Lib "advapi32.dll" _
Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Private Declare Function apiGetComputerName Lib "kernel32" _
Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Public Function LogDocOpen(Obj As Object) As Long
On Error GoTo Err_Handler
'Purpose: Create a log entry for the form/report being opened.
'Argument: The form or report whose opening we are logging.
'Return: Primary key value of the log entry. Zero on error.
'Usage: For a form, set the On Open property to: =LogDocOpen([Form])
' For a report, set the On Open property to: =LogDocOpen([Report])
Dim rs As DAO.Recordset
Dim lngObjType As Long 'acForm or acReport
Dim strDoc As String 'Name of the form/report
Dim lngHWnd As String 'hWnd of the form/report

If mbLogDox Then
strDoc = Obj.Name
lngHWnd = Obj.Hwnd

Set rs = DBEngine(0)(0).OpenRecordset("tblLo gDoc", dbOpenDynaset, dbAppendOnly)
rs.AddNew
rs!OpenDateTime = Now()
rs!CloseDateTime = Null
rs!DocTypeID = DocType(Obj)
rs!DocName = strDoc
rs!DocHWnd = lngHWnd
rs!ComputerName = ComputerName()
rs!WinUser = NetworkUserName()
rs!JetUser = CurrentUser()
rs!CurView = CurView(Obj)
rs.Update
rs.Bookmark = rs.LastModified
LogDocOpen = rs!LogDocID
rs.Close
End If

Exit_Handler:
Set rs = Nothing
Exit Function

Err_Handler:
Call LogError(Err.Number, Err.Description, conMod & ".LogDocOpen", "Document " & strDoc, False)
Resume Exit_Handler
End Function
duh_si вне форума Ответить с цитированием
Старый 13.08.2013, 16:56   #19
duh_si
Форумчанин
 
Регистрация: 18.04.2013
Сообщений: 118
По умолчанию

Вот еще чать (не уместилось все в одно сообщение)

Цитата:
Public Function LogDocClose(Obj As Object) As Long
On Error GoTo Err_Handler
'Purpose: Update the log entry created when the form/report was opened, to mark it closed.
' Creates a new entry if the existing one cannot be found.
'Argument: The form or report whose closing we are logging.
'Return: Primary key value of the log entry updated/created. Zero on error.
'Usage: For a form, set the On Close property to: =LogDocClose([Form])
' For a report, set the On Close property to: =LogDocClose([Report])
Dim rs As DAO.Recordset
Dim strSQL As String 'SQL statement
Dim strDoc As String 'Name of the form/report
Dim strWinUser As String 'Name of the Windows user
Dim strJetUser As String 'Name of the JET engine user
Dim strComputer As String 'Name of this workstation
Dim lngObjType As Long 'acForm or acReport
Dim lngHWnd As String 'hWnd of the form/report

If mbLogDox Then
strDoc = Obj.Name
strWinUser = NetworkUserName()
strComputer = ComputerName()
lngHWnd = Obj.Hwnd
lngObjType = DocType(Obj)

'Get the log entry when this user on this computer opened this form/report (same name, type and hWnd)
strSQL = "SELECT tblLogDoc.* FROM tblLogDoc WHERE ((tblLogDoc.DocTypeID = " & lngObjType & ") AND (tblLogDoc.DocName = """ & strDoc & _
""") AND (tblLogDoc.DocHWnd = " & lngHWnd & ") AND (tblLogDoc.ComputerName = """ & strComputer & """) AND (tblLogDoc.WinUser = """ & strWinUser & _
""") AND (tblLogDoc.CloseDateTime Is Null) AND (tblLogDoc.OpenDateTime <= Now())) ORDER BY tblLogDoc.OpenDateTime, tblLogDoc.LogDocID;"
Set rs = DBEngine(0)(0).OpenRecordset(strSQL )
If rs.RecordCount > 0& Then
'Log entry found: update as closed.
rs.Edit
rs!CloseDateTime = Now()
rs.Update
Else
'Can't find when document was opened: create a new one.
rs.AddNew
rs!OpenDateTime = Null
rs!CloseDateTime = Now()
rs!DocTypeID = lngObjType
rs!DocName = strDoc
rs!DocHWnd = lngHWnd
rs!ComputerName = strComputer
rs!WinUser = strWinUser
rs!JetUser = CurrentUser()
rs!CurView = CurView(Obj)
rs.Update
End If
rs.Bookmark = rs.LastModified
LogDocClose = rs!LogDocID
rs.Close
End If

Exit_Handler:
Set rs = Nothing
Exit Function

Err_Handler:
Call LogError(Err.Number, Err.Description, conMod & ".LogDocClose", "Document " & strDoc, False)
Resume Exit_Handler
End Function
duh_si вне форума Ответить с цитированием
Старый 13.08.2013, 16:57   #20
duh_si
Форумчанин
 
Регистрация: 18.04.2013
Сообщений: 118
По умолчанию

Как бы соединить, что бы запись в таблице в одну строку была...
duh_si вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Access 2010 Alex A Microsoft Office Access 4 19.07.2013 15:09
Delphi mysql trigger - как правильно писать? Прошу пример iskurt Помощь студентам 7 03.06.2012 19:03
VB 2010 + Access 2010 iEnRJ Помощь студентам 1 03.03.2012 14:28
Из Access 2010 в Access 2007 Radzhab Microsoft Office Access 3 10.05.2011 22:13
Mysql + trigger crazy horse SQL, базы данных 1 17.03.2010 09:34