微软Access DAO记录集更新不起作用

微软Access DAO记录集更新不起作用

问题描述:

我做了一个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

我有几个建议。

首先不要使用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