您應該能夠使用的形式更新前和更新後的事件檢測添加和編輯。就刪除而言,您需要使用表單刪除事件之一:BeforeDelConfirm,AfterDelConfirm或Delete。
當涉及到檢測用戶何時開始編輯記錄時,Dirty事件也很方便。
我認爲你真的需要使你的第一個Recordset對象成爲表單級別的對象,而不是將它放到Form的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記錄集,而不是使用的MS Access的內置DAO結合。我知道在某些情況下ADO記錄是有意義的,但我認爲它們很少。綁定到諸如XML文件之類的記錄資源可能就是一個例子。我個人喜歡在綁定到遠程SQL Server時使用它。它非常適合在雲中訪問Web服務器上的SQL Server數據庫。但是,您可以使用ODBC表執行相同的操作,因此除了管理DSN或ODBC錶鏈接確實存在挑戰之外,使用ADO記錄集並沒有真正令人信服的理由。
EDIT1:
在回答OP的有關事件趕不上質量的缺失和質量膏的擔憂。刪除事件會觸發選定要刪除的每條記錄,並且在用戶按下「是」後觸發AfterDelConfirm事件。使用粘貼,你並不是那麼幸運,因爲在用戶確認粘貼之後沒有事件觸發。一種解決方法是禁用表單中的添加,並使用其他方法插入新記錄。
您可能會考慮的另一個選擇是使用ADO記錄集事件。看起來事件可能會做所有事情,除了一件非常重要的事情 - 返回正在編輯,刪除或插入的每個記錄的書籤或主鍵。
第三個選項是爲每個記錄設置DateTimeModified。然後,您幾乎可以隨時使用代碼遍歷記錄集並記錄尚未記錄的更改。只需創建一個記錄集克隆和使用記錄的篩選方法,像這樣:
rst.Filter "DateTimeModified > " & LastLoggedDateTime
現在通過過濾重複記錄和日誌記錄。如有必要,您可以將原始記錄集的副本保留在內存中(只讀)並將其用於比較。看看這篇文章:compare two record sets in vb6
我同意,沒有真正簡單的方法來做你想做的事情。它似乎相當複雜。
來源
2011-04-13 02:39:40
HK1
你爲什麼覺得你需要這樣做?爲什麼不將表單的Recordsource屬性設置爲適當的SQL字符串? – 2011-04-13 01:26:36