2011-04-12 177 views
3

我似乎在這個問題上無能爲力。我可以附加一個ADO記錄集到一個表單,但我不知道如何處理更新。我不想只有UpdateBatch,我希望能夠檢測出爲記錄目的而更改的內容。任何人都可以將我指向正確的方向嗎?綁定到ADO斷開記錄集的MS Access窗體

提供的SQL包含一個名爲「ID」的自動編號的Key字段。

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

你爲什麼覺得你需要這樣做?爲什麼不將表單的Recordsource屬性設置爲適當的SQL字符串? – 2011-04-13 01:26:36

回答

4

您應該能夠使用的形式更新前和更新後的事件檢測添加和編輯。就刪除而言,您需要使用表單刪除事件之一: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

我同意,沒有真正簡單的方法來做你想做的事情。它似乎相當複雜。

+0

我感謝您的意見。我還想指出,這個表單將會在數據表視圖中顯示。 RE事件:數據表視圖中設置的事件不完整,不足以記錄更改。例如,用戶可以刪除15行,並且每行都會觸發所有正確的事件,然後在「您確定」對話框後觸發刪除確認事件。但是,沒有多行粘貼的設置和「你確定」對話框。這打破了依賴事件的整個設置。 – dmaruca 2011-04-13 13:27:13

+0

你測試過了嗎?我最近有一個用戶使用查找和替換,我的審計跟蹤功能記錄每次記錄更改。我不相信沒有大規模刪除和批量粘貼的可捕捉事件。 – HK1 2011-04-13 17:53:08

+0

如果你不想要它們,爲什麼要啓用刪除? – 2011-04-18 01:53:01