Форма доступа MS привязана к ADO Disconnected Recordset - PullRequest
3 голосов
/ 13 апреля 2011

Кажется, я ничего не понимаю в этом вопросе. Я могу прикрепить набор записей ADO к форме, но я не уверен, как обрабатывать обновления. Я не хочу только UpdateBatch, я хочу быть в состоянии обнаружить, что было изменено для целей ведения журнала. Кто-нибудь может указать мне правильное направление?

Поставляемый SQL содержит одно поле Key, которое является Autonumber с именем «ID».

Private Sub Form_Load()
    Dim rst as Object
    Set rst = CreateObject("ADODB.Recordset")
    rst.CursorLocation = adUseClient
    '...edit out connection
    rst.Open sql, mConnection, adOpenStatic, adLockBatchOptimistic
    set rst.ActiveConnection = Nothing
    Set Me.Recordset =  rst
End Sub 

''Edit records on the form and now click save
Private Sub cmdSave_Click()
    Dim rst As Object
    Set rst = Me.Recordset
    Set rst.ActiveConnection = GetConnection
    rst.UpdateBatch
    'How do I detect deleted, added, or modified records for logging? 
End Sub

1 Ответ

4 голосов
/ 13 апреля 2011

Вы должны иметь возможность использовать формы 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

Я согласен, что не существует простого способа сделать то, что вы пытаетесь сделать. Это кажется довольно сложным.

...