0

我想为我创建的表单创建一个审计跟踪,记录用户在此表单上运行某些操作时的记录。

该表单称为“作业”,上面有许多拨动开关。

当用户单击打开/关闭切换开关时,我想在名为“历史”的表中自动记录一些信息。

“历史”表将包含以下字段:

  • HistoryId(主键;自动编号)
  • JobId(将把它作为“工作”表单中当前记录的外键)
  • 用户名(将得到这个CreateObject("WScript.Network").UserName
  • DateClicked(将得到这个Now()
  • ToggleButtonName.Caption (将通过切换按钮的属性获取此信息)
  • ToggleOnOff(将通过.Value切换按钮的属性获得此信息)

下面是我尝试过的一些测试代码。

出于测试目的,我只在 History 表中填充了JobID外键字段,并创建了一个HistoryDe​​sc字段,只是为了查看是否可以在记录中获取一些其他值。

请注意,我使用“作业”表中的字段Ad_PerfChecks来存储togAd_PerfChecks切换按钮的切换状态以供以后使用。

Public Sub RefreshSubData()

    tblHistory_sub.Form.Requery

End Sub

Private Sub togAd_PerfChecks_Click()

    If Me.Ad_PerfChecks = 0 Or IsNull(Me.Ad_PerfChecks) Then

        Dim rs1 As Recordset
        Set rs1 = CurrentDb.OpenRecordset("tblHistory")

        rs1.AddNew
        rs1!JobID = Me.JobID
        rs1!HistoryDesc = "Ad_PerfChecks was turned ON"
        rs1.Update

        Set rs1 = Nothing

        RefreshSubData

        Me.togAd_PerfChecks.Value = True
        Me.togAd_PerfChecks.PressedColor = RGB(34, 177, 76)
        Me.Ad_PerfChecks = 1

    ElseIf Me.Ad_PerfChecks = 1 Then

        Dim rs2 As Recordset
        Set rs2 = CurrentDb.OpenRecordset("tblHistory")

        rs2.AddNew
        rs2!JobID = Me.JobID
        rs2!HistoryDesc = "Ad_PerfChecks was turned OFF"
        rs2.Update

        Set rs2 = Nothing

        RefreshSubData

        Me.togAd_PerfChecks.Value = False
        Me.togAd_PerfChecks.BackColor = RGB(36, 36, 36)
        Me.Ad_PerfChecks = 0

    End If

End Sub

在大多数情况下,这工作正常,除了第一次单击由于某种原因在“历史”表中创建了一条没有 JobId 外键的记录。之后,每次单击都会使用我想要的数据创建一条新记录。

这是单击切换按钮 4 次时“历史记录”表中的示例输出:

| HistoryId | JobId |           History Desc           |
|     1     |       |     Ad_PerfChecks was turned ON  |
|     2     |   1   |     Ad_PerfChecks was turned OFF |
|     3     |   1   |     Ad_PerfChecks was turned ON  |
|     4     |   1   |     Ad_PerfChecks was turned OFF |

任何想法如何确保第一次点击获得 JobID 外键?也让我知道是否有更好的方法来解决这个问题。有点接近我的 VBA 知识的边缘。

4

1 回答 1

0

我想我可以自己回答这个问题。在我的测试数据中,我有在添加历史记录更新工作记录的代码,因此工作记录还没有完成更新,我假设还没有收到它的自动编号。

如下移动代码似乎可以解决问题:

Private Sub togAd_PerfChecks_Click()

    If Me.Ad_PerfChecks = 0 Or IsNull(Me.Ad_PerfChecks) Then

        Me.togAd_PerfChecks.Value = True
        Me.togAd_PerfChecks.PressedColor = RGB(34, 177, 76)
        Me.Ad_PerfChecks = 1

        Dim rs1 As Recordset
        Set rs1 = CurrentDb.OpenRecordset("tblHistory")

        rs1.AddNew
        rs1!JobID = Me.JobID
        rs1!HistoryDesc = "Ad_PerfChecks was turned ON"
        rs1.Update

        Set rs1 = Nothing

        RefreshSubData

    ElseIf Me.Ad_PerfChecks = 1 Then

        Me.togAd_PerfChecks.Value = False
        Me.togAd_PerfChecks.BackColor = RGB(36, 36, 36)
        Me.Ad_PerfChecks = 0

        Dim rs2 As Recordset
        Set rs2 = CurrentDb.OpenRecordset("tblHistory")

        rs2.AddNew
        rs2!JobID = Me.JobID
        rs2!HistoryDesc = "Ad_PerfChecks was turned OFF"
        rs2.Update

        Set rs2 = Nothing

        RefreshSubData

    End If

End Sub
于 2013-11-06T13:48:38.497 回答