Что ж, я почти закончил завершать аудиторскую часть моего приложения, которую я обсуждал здесь . Я делаю это, перебирая все текстовые поля, выпадающие списки и флажки и сохраняя их значения в событии form_load. Затем я делаю то же самое в событии form_afterUpdate и сравниваю их. Если есть разница, я регистрирую это, если нет, я продолжаю. Вот код:
Dim strValues(1 To 32) As String
Private Sub Form_AfterUpdate()
Dim strCurrentValue, strSQL As String
Dim intCurrentField As Integer
intCurrentField = 1
For Each C In Forms!frmVendorsManageVendors.Controls
Select Case C.ControlType
Case acTextBox, acComboBox, acCheckBox
//Doing this because I don't want a NULL as it won't concatenate in the SQL query and don't want 0 or -1 for the boolean fields
strCurrentValue = IIf(IsNull(C), "", IIf(C = vbTrue Or C = vbFalse, IIf(C = vbTrue, "Yes", "No"), C))
If strValues(intCurrentField) <> strCurrentValue Then
strSQL = "INSERT INTO changesTable (change_time,user_affected,field_affected,old_value,new_value) VALUES (NOW()," & [id] & ",'" & C.ControlSource & "','" & strValues(intCurrentField) & "','" & strCurrentValue & "')"
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
//InputBox "", "", strSQL
strSQL = "WEEEE"
DoCmd.SetWarnings True
strValues(intCurrentField) = strCurrentValue
End If
intCurrentField = intCurrentField + 1
End Select
Next
End Sub
Private Sub Form_Open(Cancel As Integer)
Call btnLock_Click
Dim intCurrentField As Integer
intCurrentField = 1
For Each C In Forms!frmVendorsManageVendors.Controls
Select Case C.ControlType
Case acTextBox, acComboBox, acCheckBox
//Doing this because I don't want a NULL as it won't concatenate in the SQL query and don't want 0 or -1 for the boolean fields
strValues(intCurrentField) = IIf(IsNull(C), "", IIf(C = vbTrue Or C = vbFalse, IIf(C = vbTrue, "Yes", "No"), C))
intCurrentField = intCurrentField + 1
End Select
Next
End Sub
Как вы можете видеть, есть закомментированная строка, в которую я вставляю таблицу изменений, которая помещает запрос в поле ввода, чтобы я мог скопировать / вставить его и посмотреть на него. Когда я раскомментирую эту строку, все в порядке. Если это закомментировано, оно генерирует первое точное изменение, но затем не изменит его для других элементов управления. Поэтому, если я изменю field1 и field2, он вставит изменение поля 1 дважды.
Это довольно запутанно, и я не знаю, почему это происходит.
Также я знаю, что я использую неправильный синтаксис комментариев, но если я использую правильный синтаксис, то SO "code color" er не будет отображаться правильно.