微软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`
答
我有几个建议。
首先不要使用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
你为什么要移动记录?可能使用INSERT SELECT sql操作语句而不是操作记录集。 – June7
除了这种方法(记录集vs sql),你是否在我的语法中看到错误?顺便说一下,我同意你的观点,并且我习惯在其他环境中使用SQL(PHP MySQL),但是在Access中使用记录集的方式通常会给我更多的控制权,特别是在调试情况下...... – Versatile
Documenti过滤到单个记录的查询? Incassato已宣布但未设置。没有看到记录集操作有什么问题。 – June7