\r\nOption Compare Database\r\nOption Explicit\r\n\r\nPublic decCenterTrigger As Variant \' ИД центра учёта\r\n\r\nPublic Function TriggerB( _\r\n ByVal decID As Variant, _\r\n ByVal bytAct As Byte, _\r\n ByVal strTabName As String, _\r\n ByVal strFildID As String, _\r\n ByVal strFildDel As String _\r\n ) As Boolean \' логирование вносимых изменений в данные\r\n \' автор: Бенедикт, sgobunkov@yandex.ru\r\n \' источник: /topic/545973&hl=%f2%f0%e8%e3%e3%e5%f0\r\n \' связанные ресурсы:\r\n \' /topic/545973&pg=-1\r\n \' /topic/145122&pg=-1&hl=%f2%f0%e8%e3%e3%e5%f0%20%e1%e5%ed%e5%e4%e8%ea%f2%e0\r\n \r\n \'------------------\r\n \' "СЕРВЕРНАЯ" ВЕРСИЯ\r\n \'------------------\r\n Dim bytActOld As Byte \' действие выполненное над текущей записью ранее\r\n Dim bytErrCount As Byte \' число ошибок тригера\r\n Dim Cnxn As ADODB.Connection \' связь\r\n Dim decCenterID As Variant \' ИД текущего центра учёта\r\n Dim decTabName As Variant \' ИД таблицы, в которую вносятся изменения\r\n Dim rstRemote As ADODB.Recordset \' набор записей текущего отчёта\r\n \r\n \'On Error GoTo ErrorHandle\r\n \' получаем ИД текущего центра учёта\r\n decCenterID = decCenterTrigger\r\n \' подключаемся к базе\r\n Set Cnxn = ConnectOpenB(decCenterID)\r\n \' получаем ИД таблицы для отчёта\r\n decTabName = TableIdF(Cnxn, strTabName)\r\n \r\n \' получаем набор записей отчёта, относящихся к текущей базе данных\r\n Set rstRemote = RecordsetOpen(Cnxn, "SELECT tblSincRemote.* " _\r\n & "FROM tblSincRemote " _\r\n & "WHERE (((tblSincRemote.SincRmtCentr)=" & decCenterID & ") " _\r\n & "AND ((tblSincRemote.SincRmtTable)=" & decTabName & "));" _\r\n , adOpenKeyset, adLockOptimistic)\r\n With rstRemote\r\n \' ищем в отчёте требуемую запись\r\n .Find "(((SincRmtRowID)=" & decID & "))"\r\n If .EOF Then\r\n If bytAct = 0 Then bytAct = CByte(50)\r\n .AddNew\r\n .Fields("SincRmtCentr") = decCenterID\r\n .Fields("SincRmtTable") = decTabName\r\n .Fields("SincRmtRowID") = decID\r\n .Fields("SincRmtAct") = bytAct\r\n .Update\r\n Else\r\n bytActOld = GetFirstRecordF(Cnxn, strFildDel, strTabName, "(((" & strFildID & ")=" & decID & "))")\r\n If (bytActOld <> 10 Or bytActOld <> 50) And (bytAct <> 10 Or bytAct <> 20) Then\r\n \' пропускаем из обработки изменяемые записи, которые добавили, но не синхронизировали\r\n .Fields("SincRmtAct") = bytAct\r\n .Update\r\n End If\r\n End If\r\n .Close\r\n End With\r\n \r\n Set rstRemote = Nothing\r\n Cnxn.Close\r\n Set Cnxn = Nothing\r\n TriggerB = True\r\n Exit Function\r\n\r\nErrorHandle:\r\n Select Case Err.Number\r\n Case Is = 3008, 3078\r\n \' 3008 - Случается при установке "триггера" запросом CreateTrigger\r\n \' 3078 - Случается при синхронизации\r\n On Error Resume Next\r\n Case Else\r\n MsgBox "Trigger-error (" & Err.Number & "): " & vbCr & Err.Description, , "Сработка триггера с ошибкой"\r\n Err.Clear\r\n If bytErrCount < 5 Then\r\n \' если ошибок меньше пяти, то продолжаем с места ошибки\r\n bytErrCount = bytErrCount + 1\r\n Resume\r\n Else\r\n MsgBox "Привышен лимит ошибок тригера.", , "Сработка триггера с ошибкой"\r\n On Error GoTo 0\r\n End If\r\n End Select\r\n Call RecordsetClose(rstRemote, "TriggerB - central")\r\n Call ConnectClose(Cnxn, "TriggerB - central")\r\n TriggerB = True\r\nEnd Function\r\n \r\n |