访问 - 跟踪更改代码仅在我打开数据库时按 shift 时有效

问题描述

我为用户制作了一个数据库来计划工作。处理记录后,我使用复选框将其标记为“已输入”。 我修改了我在互联网上找到的一些代码来跟踪用户所做的更改(仅在我标记之后),以便我知道是否必须编辑某些内容

这很好用,但只有当我在打开数据库时按下 shift 键?!

我使用“Form_BeforeUpdate()”和“Form_AfterUpdate()”事件来执行 sql获取正确的行,然后比较它们。当我在打开数据库时不按“shift”键时,'before' 和 'after' 之间没有区别(两者都是 'before' 值??)

简而言之:在 BeforeEvent 上,记录存储在临时表中。在 AfterEvent 上,记录存储在另一个临时表中。 将这两者进行比较,并将不同的字段存储在记录集中(连同用户名、日期等)并写入 ChangeLog 表。 奇迹般有效。但只有当我在打开数据库时按下 shift...

Private Sub Form_BeforeUpdate(Cancel As Integer)
            Dim ssql    As String
            Dim sUN     As String     'UserName
    bWasNewRec = Me.NewRecord
    sUN = Environ("UserName")
    
    If Me.Ingevoerd = True Then    '"me.ingevoerd is the checkBox
        'Empty TEMP-table          'temp-tables are the 2 tables to store the event values
            ssql = "DELETE FROM temp_BeforeUpdate;"
                CurrentDb.Execute ssql
            ssql = "DELETE FROM temp_AfterUpdate;"
                CurrentDb.Execute ssql
        'copy BeforeUpdate values to TEMP-table
        If Not bWasNewRec Then
            ssql = "INSERT INTO temp_beforeupdate (changedType,changedDate,changedUser,tbl_ID) " & _
                   "SELECT 'OldVal' AS Expr1,Now() AS Expr2,'" & sUN & "' AS Expr3," & Me.planningID & " as Expr4,* FROM tbl_Planning WHERE planningID = " & Me.planningID & ";"
            CurrentDb.Execute ssql
        End If
    End If
End Sub

Private Sub Form_AfterUpdate()
        Dim recBefUp    As DAO.Recordset
        Dim recAftUp    As DAO.Recordset
        Dim recEdited   As DAO.Recordset
        Dim ssql        As String
        Dim sUN         As String
        Dim fld         As Integer
    
    sUN = Environ("UserName")
    If ((Me.Ingevoerd = True) And (Not bWasNewRec)) Then
        ssql = "INSERT INTO temp_AfterUpdate ( changedType,tbl_ID ) " & _
               "SELECT 'NewVal' AS Expr1,* FROM tbl_Planning WHERE planningID = " & Me.planningID & ";"
        
        CurrentDb.Execute ssql
        Set recBefUp = CurrentDb.OpenRecordset("SELECT TOP 1 temp_BeforeUpdate.* FROM temp_BeforeUpdate WHERE (temp_BeforeUpdate.changedType = 'OldVal') ORDER BY temp_BeforeUpdate.changedDate DESC;")             'RecordBeforeUpdate = sql voor update
        Set recAftUp = CurrentDb.OpenRecordset("SELECT TOP 1 temp_AfterUpdate.*  FROM temp_AfterUpdate  WHERE (temp_AfterUpdate.changedType = 'NewVal')  ORDER BY temp_AfterUpdate.changedDate DESC;")               'RecordAfterUpdate = sql na update
        
        'enter in "ChangeLog":
            'Set recEdited = CurrentDb.OpenRecordset("ChangeLog")                                            'ChangeLog is where i check if something was changed
            Set recEdited = CurrentDb.OpenRecordset("SELECT * FROM ChangeLog")                              'Recordset to store the before- and after values
            For fld = 9 To recBefUp.Fields.Count - 1
                If Not (Nz(recBefUp.Fields(fld).Value,0) = Nz(recAftUp.Fields(fld).Value,0)) Then
                    recEdited.AddNew
                        recEdited.Fields(2).Value = recBefUp.Fields(2).Value                                'ChangedDate
                        recEdited.Fields(3).Value = recBefUp.Fields(3).Value                                'ChangedUser
                        recEdited.Fields(4).Value = "tbl_Planning"                                          'Formulier
                        recEdited.Fields(5).Value = recBefUp.Fields(8).Value                                'TOS
                        recEdited.Fields(6).Value = recBefUp.Fields(9).Value                                'Startdatum
                        recEdited.Fields(7).Value = recBefUp.Fields(5).Value                                'planningID
                        recEdited.Fields(8).Value = recBefUp.Fields(4).Value                                'ID-nummer
                        recEdited.Fields(9).Value = recBefUp.Fields(fld).Name                               'Veld
                        recEdited.Fields(10).Value = Nz(recBefUp.Fields(fld).Value,"-")                    'Oude waarde
                        recEdited.Fields(11).Value = Nz(recAftUp.Fields(fld).Value,"-")                    'Nieuwe waarde
                    recEdited.Update
                End If
            Next fld
        'Empty the temp table.
            ssql = "DELETE FROM temp_BeforeUpdate;"
                CurrentDb.Execute ssql
            ssql = "DELETE FROM temp_AfterUpdate;"
                CurrentDb.Execute ssql
        Set recBefUp = nothing
        Set recAftUp = nothing
    End If
End Sub

'''
 

解决方法

我加入了一些代码来与后端(表格)建立稳定的连接。出于某种原因,这搞砸了 AfterEvent。当我禁用下一部分时,它再次起作用...

Public dbConn As DAO.Database
    Private Sub Form_Close()
        Set dbConn = Nothing
    End Sub
    Private Sub Form_Open(Cancel As Integer)
        Set dbConn = OpenDatabase("X:\Arr22_TABLES.accdb")
    End Sub