Код контрольного журнала, не фиксирующий изменения списка списков
Я посмотрел на этот пост: сохранение изменений в многозначный 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