问题描述
我为用户制作了一个数据库来计划工作。处理记录后,我使用复选框将其标记为“已输入”。 我修改了我在互联网上找到的一些代码来跟踪用户所做的更改(仅在我标记之后),以便我知道是否必须编辑某些内容。
这很好用,但只有当我在打开数据库时按下 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