Вы должны иметь возможность использовать формы BeforeUpdate и AfterUpdate для обнаружения дополнений и изменений. Для удаления необходимо использовать одно из событий удаления форм: BeforeDelConfirm, AfterDelConfirm или Delete.
Событие Dirty также удобно, когда требуется определить, когда пользователь начал редактировать запись.
Я думаю, вам действительно нужно сделать свой первый объект Recordset объектом уровня формы, а не помещать его в событие Load вашей формы.
Dim rst As Object
Private Sub Form_Load()
Set rst = CreateObject("ADODB.Recordset")
rst.CursorLocation = adUseClient
'...edit out connection
rst.Open sql, mConnection, adOpenStatic, adLockBatchOptimistic
set rst.ActiveConnection = Nothing
'You can close your connection object here now
Set Me.Recordset = rst
End Sub
''Edit records on the form and now click save
Private Sub cmdSave_Click()
Set rst.ActiveConnection = GetConnection
rst.UpdateBatch
End Sub
Private Sub Form_Unload()
'Offer to do batch update here if changes have been made to the recordset
rst.Close
Set rst = Nothing
End Sub
Возможно, вы захотите использовать функцию AuditTrail для регистрации изменений. Однако, если пользователь не выполняет пакетное обновление, эти изменения фактически не будут внесены в базу данных, поэтому я не уверен, как именно вы будете регистрировать свои изменения простым и легким способом.
Вот код контрольного журнала, который должен работать:
http://www.everythingaccess.com/tutorials.asp?ID=Creating-an-Audit-Trail-(Source-Code)
Я вижу, что мистер Фентон задал вопрос, зачем вам нужен отключенный набор записей ADO вместо использования встроенной привязки DAO MS Access. Я знаю, что есть определенные ситуации, когда набор записей ADO имеет смысл, но я думаю, что они немногочисленны. Привязка к источникам записей, таким как файлы XML, может быть одним из примеров. Мне лично нравится использовать его для привязки к удаленному серверу SQL. Он отлично работает для того, чтобы Access мог общаться с базой данных SQL Server на вашем веб-сервере в облаке. Однако вы можете сделать то же самое с таблицами ODBC, так что на самом деле нет веских причин для использования набора записей ADO, за исключением того, что управление ссылками на таблицы DSN или ODBC имеет свои проблемы.
Edit1:
В ответ на опасения ОП по поводу событий не улавливаются массовые удаления и массовые вставки. Событие Delete срабатывает для каждой записи, выбранной для удаления, а событие AfterDelConfirm срабатывает после того, как пользователь нажал «Да». С пастой вам не так повезло, так как нет события, которое срабатывает после того, как пользователь подтвердит вставку. Один из обходных путей - отключение дополнений в форме и использование другого метода для вставки новых записей.
Другой вариант, на который вы можете обратить внимание, - использовать события набора записей ADO. Похоже, что события, скорее всего, будут делать все, кроме одной очень важной вещи - возвращать закладку или первичный ключ для каждой записи, которая редактируется, удаляется или вставляется.
Третий вариант - установить DateTimeModified для каждой записи. Затем вы можете использовать код практически в любое время для перебора набора записей и регистрации изменений, которые еще не были зарегистрированы. Просто создайте клон набора записей и используйте метод Filter набора записей, примерно такой:
rst.Filter "DateTimeModified > " & LastLoggedDateTime
Теперь переберите отфильтрованный набор записей и зарегистрируйте записи. При необходимости вы можете сохранить копию исходного набора записей в памяти (только для чтения) и использовать ее для сравнения. Взгляните на этот пост: сравните два набора записей в vb6
Я согласен, что не существует простого способа сделать то, что вы пытаетесь сделать. Это кажется довольно сложным.