Ms access MS Access DAO记录集更新不工作

Ms access MS Access DAO记录集更新不工作,ms-access,recordset,Ms Access,Recordset,我制作了一个MS Access DB(旧XP版本),用于seamlessy 我不得不添加一个例程来将一些数据从一个表“移动”到另一个表,并编写了一个函数来实现这一点。 我一直使用的方法是使用动态记录集(或动态记录集),但这次不起作用。 该流正确地打开动态集,查找数据并将数据从一个记录集复制到另一个记录集,但当.update完成时,原始表中不会显示任何内容 我用的是DAO3.60 以下是(总结)代码: 我有一些建议 首先,不要在错误恢复下一行时使用,,除非您希望在要在下一行代码中显式测试和处理的代

我制作了一个MS Access DB(旧XP版本),用于seamlessy

我不得不添加一个例程来将一些数据从一个表“移动”到另一个表,并编写了一个函数来实现这一点。 我一直使用的方法是使用动态记录集(或动态记录集),但这次不起作用。 该流正确地打开动态集,查找数据并将数据从一个记录集复制到另一个记录集,但当.update完成时,原始表中不会显示任何内容

我用的是DAO3.60

以下是(总结)代码:


我有一些建议

首先,不要在错误恢复下一行时使用
,除非您希望在要在下一行代码中显式测试和处理的代码行中出现特定错误(通过测试
If Err.Number=…
)。您应该有一个错误处理代码块,并使用
On error GoTo error\u code\u block
。如果要关闭某个特定命令的错误处理程序,则应在处理完预期错误后立即重新打开

因为您已经关闭了错误处理,可能是insert语句由于某些约束冲突而失败,但您只是没有看到这一点。对于错误处理,我建议您按照以下方式构建代码:

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
一般代码整理建议

带有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
最后,可以稍微清理一下插入到
rstaddocemessi
中的内容。与其打开
rstAdd
的整个记录表,然后依次检查每条记录以查看是否需要添加
rstaddocemessi
记录,为什么不在
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

你为什么要移动唱片?可能使用INSERT SELECT sql操作语句而不是操作记录集。除了这种方法(记录集与sql)之外,您是否看到我的语法中有错误?顺便说一句,我同意你的看法,我习惯在其他环境(PHP MySQL)中使用SQL,但在Access中,使用记录集的方式通常可以让我更好地控制正在发生的事情,特别是在调试情况下……Documenti是一个过滤到单个记录的查询吗?Incassato已声明但未设置。没有发现记录集操作有任何错误。@多才多艺:您在其他地方找到问题的解决方案了吗?
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