我有一个非常令人沮丧的问题,我无法在任何地方找到解决方法或解决方案。不幸的是,很难描述(道歉的长度),但这里是:
我有一个连续的表单(让我们称之为“查看”表单),显示银行帐户的交易。这是一个相当简单的表单,只显示单个绑定表中的行。可以通过dbl删除事务。单击记录选择器。确认后,这将从表中删除记录,然后重新计算运行余额。它做了一些jiggery-pokery以保持重新计算尽可能高效,它在99%的时间内工作得很好。可以通过从表单标题上的“添加”按钮调用的单独模式表单添加新记录。保存记录后,“添加”表单将关闭。添加记录后,将重新查询视图表单并重新计算运行余额。这也很好。
现在问题。
如果我添加一条记录,无论它在视图表单中显示的位置(键入日期)并立即删除它,我都会得到一个表单错误(不是正常的可捕获运行时错误),如下所示:
“您试图在未事先开始交易的情况下提交或回滚交易。”
实际上,我确实在余额重新计算程序中使用了一个事务(在其他所有情况下都能正常工作):
strSQL = "Select * from ACTransaction where ACT_BankAccountID = " & Me.ComboBankAccount & " order by ACT_TaxDate, ACT_ID;"
Set rsTrans = CurrentDb.OpenRecordset(strSQL)
wFindString = "ACT_TaxDate >= " & wUSFormatDate
rsTrans.FindFirst wFindString
wStartRecPosition = rsTrans.AbsolutePosition
If wStartRecPosition > 0 Then
rsTrans.MovePrevious
wrunningbalance = rsTrans("ACT_TxtBalance")
Else
wrunningbalance = Me.TxtOpenBal
End If
If wStartRecPosition > 0 Then
rsTrans.MoveNext
End If
On Error GoTo 0
On Error GoTo DoRollback
DBEngine(0).BeginTrans
If Not (rsTrans.EOF And rsTrans.BOF) Then
Do Until rsTrans.EOF = True
wTrans = rsTrans("ACT_ID")
wTxValue = rsTrans("ACT_ValTTC") * rsTrans("ACT_TxtTC_Sign")
wrunningbalance = wrunningbalance + wTxValue
rsTrans.Edit
rsTrans("ACT_TxtBalance") = wrunningbalance
rsTrans.Update
rsTrans.MoveNext
Loop
End If
DBEngine(0).CommitTrans
rsTrans.Close
Set rsTrans = Nothing
现在,我的错误处理/回滚等问题似乎显而易见,但错误并未触发。如果我完全删除了事务处理,它仍然会失败并出现相同的错误。
我用调试来填充我的代码以跟踪事件的过程并且在它甚至达到余额重新计算代码之前呈现错误消息。触发的最后一个事件是before_DelConfirm(我有一个“DoCmd.SetWarnings False”)事件。在出现上述错误后,它告诉我:
“您所做的更改无法保存” “由于另一个用户临时锁定记录,保存操作可能已失败”
如果我'Esc'通过错误消息,那么处理进入after_delConfirm(我有一个“DoCmd.SetWarnings True”),然后进入余额重新计算过程,然后它完美地工作。
鉴于除了错误之外它可以正常工作(虽然显然有些不对劲)我甚至尝试过:
Response = acDataErrContinue
进入Form_Error事件,我还调试了'DataErr'值:它在3034和2111之间无休止地交替。
它必须与记录缓冲和/或事务(我以前没有使用过Access事务)有关,就好像我关闭视图表单并重新打开它然后我可以删除有问题的'新'事务而没有任何事务问题。我已经尝试在模式“添加”表单关闭后以及在Form_Delete中粘贴doEvents但这没有任何区别。
你们的任何帮助都会非常感激;我完全陷入了困境。
编辑:我已经尝试在提交中添加“dbForceOSFlush”,但它没有任何区别。答案 0 :(得分:0)
在添加和查看表单中的每行代码中找到它。与预期一样,它与余额重新计算程序中的交易无关。
在“视图”表单中,我有一个路由,通过简单的记录集书签操作将当前行位置移动到最后几行。当然,每当我编写“set rs = currentdb.openrecordset(..)”时,我立即编码“rs.close”和“set rs = nothing”。在这种情况下,无论出于什么原因,我都没有这样,有一个混乱的物体漂浮在混乱的东西周围。添加这两行代码就可以了。
感谢所有花时间为我看这个的人。令人惊讶的是,经常在问题上睡觉以及一些最后的持久性导致解决方案。