Синтаксическая ошибка (отсутствует оператор) в выражении запроса при запуске модуля Audit Trail в MS Access - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь запустить модуль Audit Trail в форме Invoice, чтобы отслеживать изменения.Этот же модуль отлично работает с несколькими другими моими формами, и моя форма Invoice не вызывает ошибок, когда у меня не запущен Audit Trail.Я не эксперт, и я не уверен, что делать, чтобы решить эту проблему!Вот SQL для источника записи формы, что и вызывает ошибку:

    SELECT tblInvoice.*, tblAssignment.RateOut, tblTaskOrder.TaskOrderID, tblTaskOrder.TaskOrderName, tblPeople.PeopleID, tblPeople.[Firstname] & " " & [Lastname] AS FullName, tblVendor.VendorName
FROM (((tblInvoice INNER JOIN tblAssignment ON tblInvoice.AssignmentID = tblAssignment.AssignmentID) INNER JOIN tblTaskOrder ON tblAssignment.TaskOrderID = tblTaskOrder.TaskOrderID) INNER JOIN tblPeople ON tblAssignment.PeopleID = tblPeople.PeopleID) INNER JOIN tblVendor ON tblPeople.Vendor = tblVendor.VendorID;

А вот код модуля Audit Trail:

Option Compare Database
Option Explicit

Const cDQ As String = """"
Sub AuditTrail(frm As Form, recordid As Control)
  'Track changes to data.
  'recordid identifies the pk field's corresponding
  'control in frm, in order to id record.
  Dim ctl As Control
  Dim varBefore As Variant
  Dim varAfter As Variant
  Dim strControlName As String
  Dim strSQL As String
  On Error GoTo ErrHandler
  'Get changed values.
  For Each ctl In frm.Controls
    With ctl
    'Avoid labels and other controls with Value property.
    If .ControlType = acTextBox Then
      If .Value <> .OldValue Then
        varBefore = .OldValue
        varAfter = .Value
        strControlName = .Name
        'Build INSERT INTO statement.
        strSQL = "INSERT INTO " _
           & "tblAudit (EditDate, RecordID, SourceTable, " _
           & " SourceField, BeforeValue, AfterValue) " _
           & "VALUES (Now()," _
           & cDQ & recordid.Value & cDQ & ", " _
           & cDQ & frm.RecordSource & cDQ & ", " _
           & cDQ & .Name & cDQ & ", " _
           & cDQ & varBefore & cDQ & ", " _
           & cDQ & varAfter & cDQ & ")"
        'View evaluated statement in Immediate window.
        Debug.Print strSQL
        DoCmd.SetWarnings False
        DoCmd.RunSQL strSQL
        DoCmd.SetWarnings True
      End If
    End If
    End With
  Next
  Set ctl = Nothing
  Exit Sub

ErrHandler:
  MsgBox Err.Description & vbNewLine _
   & Err.Number, vbOKOnly, "Error"
End Sub

Есть идеи для меня?ТИА !!

1 Ответ

0 голосов
/ 22 февраля 2019

Ваш код журнала аудита имеет наивное преобразование типов.Простое прикрепление символов к любому концу строки RecordSource не будет работать все время.

Текущее (неправильное) указанное значение RecordSource:

"SELECT ... , tblPeople.[Firstname] & " " & [Lastname] AS FullName, ... "

Проблемазначение " " в середине превращает его в две строки!

Правильное значение для Access SQL:

"SELECT ... , tblPeople.[Firstname] & "" "" & [Lastname] AS FullName, ... "

Теперь, когдакавычки заключены в кавычки, вставка будет работать нормально.

Чтобы исправить код, сделайте что-то вроде:

...
    & cDQ & Replace(frm.RecordSource, cDQ, cDQ & cDQ) & cDQ & ", " _
...

Это неаккуратный код, но вы поняли идею. Вы должны сделать это длявсе строковые значения, которые вы вставляете в журнал аудита.

...