【问题标题】:MS Access DAO recordset update not workingMS Access DAO 记录集更新不起作用
【发布时间】:2017-03-16 06:55:02
【问题描述】:

我制作了一个 MS Access DB(旧 XP 版本),它曾经可以无缝运行。

我必须添加一个例程来将一些数据从一个表“移动”到另一个,并编写了一个函数来执行此操作。 我一直使用的方法是使用动态记录集(或动态集),但这次它不起作用。 流程正确打开动态集,从一个记录集中查找数据并将其复制到另一个记录集中,但是当 .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`

【问题讨论】:

  • 为什么要移动记录?可能会使用 INSERT SELECT sql 操作语句而不是操作记录集。
  • 除了方法(记录集与 sql)之外,您是否发现我的语法有问题?顺便说一句,我同意你的观点,我习惯于在其他环境(PHP MySQL)中使用 SQL,但在 Access 中使用记录集方式通常可以让我更好地控制正在发生的事情,尤其是在调试情况下......
  • Documenti 是过滤到单个记录的查询吗? Incassato 已声明但未设置。记录集操作没有任何问题。
  • @Versatile:您是否在其他地方解决了您的问题?

标签: ms-access recordset


【解决方案1】:

我有一些建议。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    相关资源
    最近更新 更多