Код контрольного журнала, не фиксирующий изменения списка списков

Я посмотрел на этот пост: сохранение изменений в многозначный ComboBox через 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 ответ

Решение

Вы не можете получить значения многозначных полей, используя .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
Другие вопросы по тегам