代码之家  ›  专栏  ›  技术社区  ›  Erika

审核跟踪代码未拾取组合框列表更改

  •  1
  • Erika  · 技术社区  · 9 年前

    Saving changes to a multivalued ComboBox via AuditTrail

    我试着把这些花边新闻放到我的代码中,但它就是不起作用!我并不擅长SQL,但我需要完成这项工作。这是我的代码,它适用于文本框,但有人能告诉我在哪里以及在我的组合框下拉列表更改时需要什么吗?

    Function LogChanges(lngID As Long, Optional strField As String = "")
        Dim dbs As DAO.Database
        Dim rst As DAO.Recordset
        Dim varOld As Variant
        Dim varNew As Variant
        Dim strFormName As String
        Dim strControlName As String
    
    
        varOld = Screen.ActiveControl.OldValue
        varNew = Screen.ActiveControl.Value
        strFormName = Screen.ActiveForm.NAME
        strControlName = Screen.ActiveControl.NAME
        Set dbs = CurrentDb()
        Set rst = dbs.TableDefs("ztblDataChanges").OpenRecordset
    
        With rst
            .AddNew
            !FormName = strFormName
            !ControlName = strControlName
            If strField = "" Then
                !FieldName = strControlName
            Else
                !FieldName = strField
            End If
            !RecordID = lngID
            !UserName = Environ("username")
            If Not IsNull(varOld) Then
                !OldValue = CStr(varOld)
            End If
            !NewValue = CStr(varNew)
            .Update
        End With
        'clean up
        rst.Close
        Set rst = Nothing
        dbs.Close
        Set dbs = Nothing
    End Function
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Erik A    9 年前

    无法使用 .Value .OldValue . 这些属性始终返回 Null . 据我所知,没有可靠的方法来获取旧价值(此外,适当的审计跟踪不需要旧价值,因为如果所有内容都得到适当的审计,旧价值是先前增加的新价值)。

    仅保存新值时,如果要将其保存到文本字段而不是多值字段中,可以使用以下方法:

    使用此函数可以获取所有选定项目的字符串值:

    Public Function JoinMVF(MVFControl As Control, Optional Delimiter As String) As String
        Dim i As Variant
        For Each i In MVFControl.ItemsSelected
            JoinMVF = JoinMVF & MVFControl.ItemData(i) & Delimiter
        Next i
    End Function
    

    With rst
        .AddNew
        !FormName = strFormName
        !ControlName = strControlName
        If strField = "" Then
            !FieldName = strControlName
        Else
            !FieldName = strField
        End If
        !RecordID = lngID
        !UserName = Environ("username")
        If Not IsNull(varOld) Then 'varOld will always be Null for a multi-valued field
            !OldValue = CStr(varOld) 'Thus this will never get called
        End If
        'Add some If multivalued field then
        !NewValue = JoinMVF(Screen.ActiveControl, "; ")
        .Update
    End With