2017-03-14 86 views
0

我做了一個MS Access數據庫(舊XP版本),用於無縫工作。微軟Access DAO記錄集更新不起作用

我不得不添加一個例程來將一些數據從表格移動到另一個表格,並編寫了一個函數來執行此操作。 我一直使用的方法是使用動態記錄集(或動態集),但這次它不起作用。 該流程正確打開動態集,查找並將數據從一個記錄集複製到另一個記錄集,但是.update完成時,原始表中沒有任何內容出現。

我使用DAO 3.60。

這裏的(總結)代碼:

On Error Resume Next 

Dim rstDoc As Recordset 
Dim rstAdd As Recordset 
Dim rstDocEmessi As Recordset 
Dim rstAddDocEmessi As Recordset 
Dim Incassato As Integer 

Set rstDoc = CurrentDb.OpenRecordset("Documenti", dbOpenSnapshot) 
Set rstDocEmessi = CurrentDb.OpenRecordset("TS_DocumentiEmessi", dbOpenDynaset) 
Set rstAdd = CurrentDb.OpenRecordset("Addebiti", dbOpenDynaset) 
Set rstAddDocEmessi = CurrentDb.OpenRecordset("TS_Addebiti_DocumentiEmessi", dbOpenDynaset) 

numDoc = Forms!TS_SceltaStampa!IdDocumento 

    With rstDocEmessi 

      rstDocEmessi.AddNew 

      rstDocEmessi!IdDocOriginale = rstDoc!IdDocumento 
      rstDocEmessi!Data = rstDoc!Data 
      rstDocEmessi![#Fattura] = rstDoc![#Fattura] 
      ... 
      rstDocEmessi!TS_Opposizione = rstDoc!TS_Opposizione 
      rstDocEmessi!TS_DataPagamento = rstDoc!TS_DataPagamento 
      rstDocEmessi!IsIncassato = (IIf(Incassato = vbYes, True, False)) 
      rstDocEmessi!IsImportatoInSospesi = False 

      rstDocEmessi.Update 
      rstDocEmessi.Close 

      ' Copia Addebiti 
      If Not (rstAdd.EOF And rstAdd.BOF) Then 
       rstAdd.MoveFirst 
       Do Until rstAdd.EOF = True 
        If rstAdd!Documento = numDoc Then 

         rstAddDocEmessi.AddNew 

         rstAddDocEmessi!IdAddebito = rstAdd!IdAddebito 
         rstAddDocEmessi!Documento = rstAdd!Documento 
         ... 
         rstAdd!TS_TipoSpesa 
         rstAddDocEmessi!Calcola = rstAdd!Calcola 
         rstAddDocEmessi!Totale = rstAdd!Totale 

         rstAddDocEmessi.Update 
        End If 
        rstAdd.MoveNext 
       Loop 
      End If 
      rstAddDocEmessi.Close 
      rstAdd.Close 
      TS_Registra = True` 
+0

你爲什麼要移動記錄?可能使用INSERT SELECT sql操作語句而不是操作記錄集。 – June7

+0

除了這種方法(記錄集vs sql),你是否在我的語法中看到錯誤?順便說一下,我同意你的觀點,並且我習慣在其他環境中使用SQL(PHP <->MySQL),但是在Access中使用記錄集的方式通常會給我更多的控制權,特別是在調試情況下...... – Versatile

+0

Documenti過濾到單個記錄的查詢? Incassato已宣佈但未設置。沒有看到記錄集操作有什麼問題。 – June7

回答

0

我有幾個建議。

首先不要使用On Error Resume Next,除非您希望在您要顯式測試並在下一行代碼中處理的代碼行中(通過測試If Err.Number = ...))發現特定錯誤。您應該有一個錯誤處理代碼塊並使用On Error GoTo ERROR_CODE_BLOCK。如果你將關閉一個特定命令的錯誤處理程序,那麼你應該在處理完預期錯誤後再次打開錯誤處理程序。

由於您關閉了錯誤處理,可能是因爲某些約束違規,您的插入語句失敗,但您只是沒有看到這一點。對於錯誤處理,我會建議像這樣構建代碼:

On Error GoTo PROC_ERR 

    Dim rstDoc As Recordset 
    '... 
    'insert the body of your Procedure here 
    '... 

PROC_EXIT: 
    'Add any tidying up code that always needs to run. For example, release all your Object variables 
    Set rstDoc = Nothing 
    Set rstAdd = Nothing 
    Set rstDocEmessi = Nothing 
    Set rstAddDocEmessi = Nothing 
    Exit Sub 

PROC_ERR: 
    MsgBox "Error " & Err.Number & " - " & Err.Description 
    Resume PROC_EXIT 

End Sub 

通用代碼整理建議。

With rstDocEmessi構造用於爲您節省一些輸入。你的代碼中應該有一個關聯的End With,但我沒有看到這個。

With rstDocEmessi 
    .AddNew 
     !IdDocOriginale = rstDoc!IdDocumento 
     !Data = rstDoc!Data 
     ![#Fattura] = rstDoc![#Fattura] 
     ... 
     !TS_Opposizione = rstDoc!TS_Opposizione 
     !TS_DataPagamento = rstDoc!TS_DataPagamento 
     !IsIncassato = (IIf(Incassato = vbYes, True, False)) 
     !IsImportatoInSospesi = False 
    .Update 
    .Close 
End With 

最後,插入到rstAddDocEmessi可以清理了一下:我會按如下方式更改這段代碼。而不是打開rstAdd的整個記錄​​表,然後依次檢查每條記錄以查看是否需要添加rstAddDocEmessi記錄,爲什麼不直接在rstAdd記錄集中獲取相關記錄?

Set rstAdd = CurrentDb.OpenRecordset("Select * From Addebiti " & _ 
     "Where Documento = " & Forms!TS_SceltaStampa!IdDocumento, dbOpenDynaset) 

'No need to test for (rstAdd.BOF And rstAdd.EOF), and no need for rstAdd.MoveFirst 
'Just go straight into... 
Do Until rstAdd.EOF = True 
    rstAddDocEmessi.AddNew 
     rstAddDocEmessi!IdAddebito = rstAdd!IdAddebito 
     rstAddDocEmessi!Documento = rstAdd!Documento 
     ... 
     rstAddDocEmessi!Calcola = rstAdd!Calcola 
     rstAddDocEmessi!Totale = rstAdd!Totale 
    rstAddDocEmessi.Update 
    rstAdd.MoveNext 
Loop