Access 2010 Audit Trail on SubForms

前端 未结 3 1733
梦如初夏
梦如初夏 2021-01-16 03:45

I am having trouble getting the code I found for an audit trail to work with sub forms. The origninal code is from http://www.fontstuff.com/access/acctut21.htm. I would rath

3条回答
  •  刺人心
    刺人心 (楼主)
    2021-01-16 04:15

    I'm presuming your error is with the line (it would help if you would verify):

    ![RecordID] = Screen.ActiveForm.Controls(IDField).Value
    

    The issue as you've stated is that you can't access subform controls this way but must reference in this manner:

    ![RecordID] = Forms![main form name]![subform control name].Form![control name].Value
    

    In your case, you need to first find the subform control name (presuming you only have 1 subform)

    ' Visit each control on the form
    Dim ctl As Control
    Dim SubFormName as string
    SubFormName = ""
    For Each ctl In Screen.ActiveForm
        If ctl.ControlType = acSubform Then
            SubFormName = ctl.Name
            exit for
        End If
    Next ctl
    Set ctl = Nothing
    

    Now in your code when setting RecordID, you can do it like this:

    ' you should check that SubFormName is not empty before this next line...
    ![RecordID] = Forms![Screen.ActiveForm.Name]![SubformName].Form![IDField].Value
    

    I have not tested this and I'm a bit rusty on Access, so take the concept and fix the syntax.

    ** UPDATE** - Here is the code I would try with the new information you have provided. I am presuming that the controls (e.g. the one with ctl.Tag = "Audit") are all on the subform

    Sub AuditChanges(IDField As String, UserAction As String)
    On Error GoTo AuditChanges_Err
    Dim cnn As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim ctl As Control
    Dim datTimeCheck As Date
    Dim strUserID As String
    
    'added code
    Dim SubFormName As String
    
    Set cnn = CurrentProject.Connection
    Set rst = New ADODB.Recordset
    rst.Open "SELECT * FROM tblAuditTrail", cnn, adOpenDynamic, adLockOptimistic
    datTimeCheck = Now()
    strUserID = Forms!Login!cboUser.Column(1)
    
    'msgbox to display name (just for now to test code)
    MsgBox (" " & Screen.ActiveForm.Name & " ")
    
    'IF THEN statement to check if user is using form with subform
    If Screen.ActiveForm.Name = "Cal Form" Then
      SubFormName = "Cal Form Sub"
    
        Select Case UserAction
        Case "EDIT"
            For Each ctl In Forms![Cal Form]![Cal Form Sub].Form
                If ctl.Tag = "Audit" Then
                    If Nz(ctl.Value) <> Nz(ctl.OldValue) Then
                        With rst
                            .AddNew
                            ![DateTime] = datTimeCheck
                            ![UserName] = strUserID
                            ![FormName] = SubFormName
                            ![Action] = UserAction
                            ![RecordID] = Forms![Cal Form]![Cal Form Sub].Form![IDField].Value
                            ![FieldName] = ctl.ControlSource
                            ![OldValue] = ctl.OldValue
                            ![NewValue] = ctl.Value
                            .Update
                        End With
                    End If
                End If
            Next ctl
        Case Else
            With rst
                .AddNew
                ![DateTime] = datTimeCheck
                ![UserName] = strUserID
                ![FormName] = SubFormName
                ![Action] = UserAction
                ![RecordID] = Forms![Cal Form]![Cal Form Sub].Form![IDField].Value
                .Update
            End With
            Set ctl = Nothing
        End Select
    
    Else
    
      Select Case UserAction
          Case "EDIT"
              For Each ctl In Screen.ActiveForm.Controls
                  If ctl.Tag = "Audit" Then
                      If Nz(ctl.Value) <> Nz(ctl.OldValue) Then
                          With rst
                              .AddNew
                              ![DateTime] = datTimeCheck
                              ![UserName] = strUserID
                              ![FormName] = Screen.ActiveForm.Name
                              ![Action] = UserAction
                              ![RecordID] = Screen.ActiveForm.Controls(IDField).Value
                              ![FieldName] = ctl.ControlSource
                              ![OldValue] = ctl.OldValue
                              ![NewValue] = ctl.Value
                              .Update
                          End With
                      End If
                  End If
              Next ctl
          Case Else
              With rst
                  .AddNew
                  ![DateTime] = datTimeCheck
                  ![UserName] = strUserID
                  ![FormName] = Screen.ActiveForm.Name
                  ![Action] = UserAction
                  ![RecordID] = Screen.ActiveForm.Controls(IDField).Value
                  .Update
              End With
      End Select
    End If
    
    AuditChanges_Exit:
        On Error Resume Next
        rst.Close
        cnn.Close
        Set rst = Nothing
        Set cnn = Nothing
        Exit Sub
    AuditChanges_Err:
        MsgBox Err.Description, vbCritical, "ERROR!"
        Resume AuditChanges_Exit
        End Sub
    

提交回复
热议问题