Пожалуйста, объясните, почему изменение формы вызывает ошибку времени выполнения 3464 - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь больше узнать о Access, поэтому, пожалуйста, прости меня за незнание правильной терминологии / жаргона.Я хочу поместить контрольный журнал в мою базу данных и использую код, описанный в здесь .Это работало отлично для меня, пока я не внес некоторые изменения в форму.Теперь он дает мне ошибку времени выполнения 3464 в строке 'db.Execute sSQL, dbFailOnError', и я не понимаю, какие изменения, которые я сделал, вызвали это.Пожалуйста, и спасибо заранее за любую помощь!

Код указан ниже,

    Option Compare Database
   Dim bWasNewRecord As Boolean

Private Sub Form_Delete(Cancel As Integer)
   Call AuditDelBegin("Employee", "audTmpEmployee", "db_number", Nz(Me.EmployeeID, 0))

End Sub

Private Sub Form_AfterDelConfirm(Status As Integer)
   Call AuditDelEnd("audTmpEmployee", "audEmployee", Status)
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
   bWasNewRecord = Me.NewRecord
   Call AuditEditBegin("Employee", "audTmpEmployee", "db_number", Nz(Me.db_number, 0), bWasNewRecord)

End Sub

Private Sub Form_AfterUpdate()
    Call AuditEditEnd("Employee", "audTmpEmployee", "audEmployee", "db_number", Nz(Me!db_number, 0), bWasNewRecord)

End Sub

Private Sub Reset_Click()
  DoCmd.GoToRecord , , acNewRec



End Sub


Option Compare Database
Option Explicit

Private Const conMod As String = "ajbAudit"
Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _
    "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long


Function NetworkUserName() As String
'On Error GoTo Err_Handler

    Dim lngLen As Long
    Dim lngX As Long
    Dim strUserName As String

    NetworkUserName = "Unknown"

    strUserName = String$(254, 0)
    lngLen = 255&
    lngX = apiGetUserName(strUserName, lngLen)
    If (lngX > 0&) Then
        NetworkUserName = Left$(strUserName, lngLen - 1&)
    End If

Exit_Handler:
    Exit Function

Err_Handler:
    Call LogError(Err.Number, Err.Description, conMod & ".NetworkUserName", , False)
    Resume Exit_Handler
End Function


Function AuditDelBegin(sTable As String, sAudTmpTable As String, sKeyField As String,         
lngKeyValue As Long) As Boolean
'On Error GoTo Err_AuditDelBegin

    Dim db As DAO.Database
    Dim sSQL As String

    Set db = DBEngine(0)(0)
    sSQL = "INSERT INTO " & sAudTmpTable & " ( audType, audDate, audUser ) " & _
        "SELECT 'Delete' AS Expr1, Now() AS Expr2, NetworkUserName() AS Expr3, " &         sTable & ".* " & _
        "FROM " & sTable & " WHERE (" & sTable & "." & sKeyField & " = " & lngKeyValue & ");"
    db.Execute sSQL, dbFailOnError

Exit_AuditDelBegin:
    Set db = Nothing
    Exit Function

Err_AuditDelBegin:
    Call LogError(Err.Number, Err.Description, conMod & ".AuditDelBegin()", , False)
    Resume Exit_AuditDelBegin
End Function


Function AuditDelEnd(sAudTmpTable As String, sAudTable As String, Status As Integer) As     Boolean
'On Error GoTo Err_AuditDelEnd
    Dim db As DAO.Database
    Dim sSQL As String

    Set db = DBEngine(0)(0)
    If Status = acDeleteOK Then
        sSQL = "INSERT INTO " & sAudTable & " SELECT " & sAudTmpTable & ".* FROM " &     sAudTmpTable & _
            " WHERE (" & sAudTmpTable & ".audType = 'Delete');"
        db.Execute sSQL, dbFailOnError
    End If

    sSQL = "DELETE FROM " & sAudTmpTable & ";"
    db.Execute sSQL, dbFailOnError
    AuditDelEnd = True

Exit_AuditDelEnd:
    Set db = Nothing
    Exit Function

Err_AuditDelEnd:
    Call LogError(Err.Number, Err.Description, conMod & ".AuditDelEnd()", False)
    Resume Exit_AuditDelEnd
End Function


Function AuditEditBegin(sTable As String, sAudTmpTable As String, sKeyField As String, _
    lngKeyValue As Long, bWasNewRecord As Boolean) As Boolean
'On Error GoTo Err_AuditEditBegin

    Dim db As DAO.Database
    Dim sSQL As String

    Set db = DBEngine(0)(0)
    sSQL = "DELETE FROM " & sAudTmpTable & ";"
    db.Execute sSQL


    If Not bWasNewRecord Then
        sSQL = "INSERT INTO " & sAudTmpTable & " ( audType, audDate, audUser ) " & _
            "SELECT 'EditFrom' AS Expr1, Now() AS Expr2, NetworkUserName() AS Expr3, " & sTable & ".* " & _
            "FROM " & sTable & " WHERE (" & sTable & "." & sKeyField & " = " &     lngKeyValue & ");"
        db.Execute sSQL, dbFailOnError
    End If
    AuditEditBegin = True

Exit_AuditEditBegin:
    Set db = Nothing
    Exit Function

Err_AuditEditBegin:
    Call LogError(Err.Number, Err.Description, conMod & ".AuditEditBegin()", , False)
    Resume Exit_AuditEditBegin
End Function


    Function AuditEditEnd(sTable As String, sAudTmpTable As String, sAudTable As String, _
    sKeyField As String, lngKeyValue As Long, bWasNewRecord As Boolean) As Boolean
'On Error GoTo Err_AuditEditEnd

    Dim db As DAO.Database
    Dim sSQL As String
    Set db = DBEngine(0)(0)

    If bWasNewRecord Then

        sSQL = "INSERT INTO " & sAudTable & " ( audType, audDate, audUser ) " & _
            "SELECT 'Insert' AS Expr1, Now() AS Expr2, NetworkUserName() AS Expr3, " & sTable & ".* " & _
            "FROM " & sTable & " WHERE (" & sTable & "." & sKeyField & " = " & lngKeyValue & ");"
        db.Execute sSQL, dbFailOnError
    Else

        sSQL = "INSERT INTO " & sAudTable & " SELECT TOP 1 " & sAudTmpTable & ".* FROM " & sAudTmpTable & _
            " WHERE (" & sAudTmpTable & ".audType = 'EditFrom') ORDER BY " & sAudTmpTable & ".audDate DESC;"
        db.Execute sSQL

        sSQL = "INSERT INTO " & sAudTable & " ( audType, audDate, audUser ) " & _
            "SELECT 'EditTo' AS Expr1, Now() AS Expr2, NetworkUserName() AS Expr3, " & sTable & ".* " & _
            "FROM " & sTable & " WHERE (" & sTable & "." & sKeyField & " = " & lngKeyValue & ");"
        db.Execute sSQL
        ' Empty the temp table.
        sSQL = "DELETE FROM " & sAudTmpTable & ";"
        db.Execute sSQL, dbFailOnError
    End If
    AuditEditEnd = True

Exit_AuditEditEnd:
    Set db = Nothing
    Exit Function

Err_AuditEditEnd:
    Call LogError(Err.Number, Err.Description, conMod & ".AuditEditEnd()", , False)
    Resume Exit_AuditEditEnd
End Function

1 Ответ

0 голосов
/ 14 октября 2018

Я вижу, что в INSERT INTO вы определили 3 поля, когда вы вводите 4 поля с частью SELECT.При выполнении запроса INSERT INTO в части VALUES/SELECT необходимо сопоставить все столбцы, указанные в запросе (и правильный порядок), (если столбцы не определены, то все столбцы должны быть учтены (вслучай SELECT, если столбцы второй таблицы совпадают с первой, тогда это тоже хорошо). Я отметил проблему в полужирный (правка: я вижу, что полужирный не отображается в *Блок 1008 *, я пометил его как завернутый в **). sSQL = "INSERT INTO " & sAudTmpTable & " ( **audType, audDate, audUser** ) " & _ "SELECT 'Delete' AS Expr1, Now() AS Expr2, NetworkUserName() AS Expr3, " **& sTable & ".* "** & _ "FROM " & sTable & " WHERE (" & sTable & "." & sKeyField & " = " & lngKeyValue & ");" db.Execute sSQL, dbFailOnError

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...