Access 2007 Form Error: You tried to commit or Rollback a Transaction
Access 2007 Form Error: You tried to commit or Rollback a Transaction
我有一个非常令人沮丧的问题,我无法在任何地方找到解决方法或解决方案。不幸的是,它很难描述(为长度道歉)但这里是:
我有一个显示银行账户交易的连续表格(我们称之为 'view' 表格)。这是一种相当简单的形式,仅显示来自单个边界 table 的行。可以通过 dbl 删除交易。单击记录选择器。确认后,这将删除 table 中的记录,然后重新计算 运行 余额。它做了一些 jiggery-pokery 来尽可能保持重新计算的效率,并且它在 99% 的时间里工作得很好。可以通过从表单 header 上的 'Add' 按钮调用的单独模式表单添加新记录。 'add' 表单在保存记录后关闭。添加记录后,视图表单为 re-queried,运行 余额为 re-caclulated。这也很好用。
现在进入正题。
如果我添加一条记录,不管它出现在视图表单中的什么位置(键入日期)并立即删除它,我都会收到如下表单错误(不是正常的可捕获运行时错误):
"You tried to commit or Rollback a Transaction without first beginning a transaction."
碰巧的是,我确实在余额重新计算例程中使用了一个交易(在所有其他情况下都可以正常工作):
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")事件。出现上述错误后,它告诉我:
"The changes you've made can't be saved"
"The save operation may have failed due to the temporary locking of the records by another user"
如果我 'Esc' 通过错误消息然后处理继续到 after_delConfirm(我有一个 "DoCmd.SetWarnings True"),然后进入余额重新计算程序,然后它完美地工作。
鉴于除了错误之外它工作正常(尽管显然有问题)我什至尝试过放置:
Response = acDataErrContinue
进入 Form_Error 事件,我还调试了 'DataErr' 值:它在 3034 和 2111 之间无休止地交替。
这一定与记录缓冲有关 and/or 事务(我以前没有使用过 Access Transactions)就好像我关闭了视图表单并 re-open 它然后我可以删除有问题的'new'交易没有任何问题。我试过在模态 'add' 表单关闭后和 Form_Delete 中粘贴一个 doEvents 但这没有区别。
非常感谢各位聪明人的帮助;我完全糊涂了。
编辑:我试过在 Commit 上添加 "dbForceOSFlush",但没有任何区别。
在浏览添加和查看表单中的每一行代码时找到了它。正如预期的那样,它与余额重新计算例程中的事务无关。
在 'view' 表单中,我有一个路由,通过一个简单的记录集书签操作将当前行位置移动到最后几行。当然,每当我编码 "set rs = currentdb.openrecordset(..)" 时,我都会立即编码 "rs.close" 和 "set rs = nothing"。在这种情况下,无论出于何种原因,我都没有这样做,所以有一个杂散的物体漂浮在令人困惑的事物周围。添加这两小行代码就可以了。
感谢所有花时间为我看这篇文章的人。令人惊奇的是,解决问题的频率和一点 last-ditch 的坚持导致了解决方案。
我有一个非常令人沮丧的问题,我无法在任何地方找到解决方法或解决方案。不幸的是,它很难描述(为长度道歉)但这里是:
我有一个显示银行账户交易的连续表格(我们称之为 'view' 表格)。这是一种相当简单的形式,仅显示来自单个边界 table 的行。可以通过 dbl 删除交易。单击记录选择器。确认后,这将删除 table 中的记录,然后重新计算 运行 余额。它做了一些 jiggery-pokery 来尽可能保持重新计算的效率,并且它在 99% 的时间里工作得很好。可以通过从表单 header 上的 'Add' 按钮调用的单独模式表单添加新记录。 'add' 表单在保存记录后关闭。添加记录后,视图表单为 re-queried,运行 余额为 re-caclulated。这也很好用。
现在进入正题。
如果我添加一条记录,不管它出现在视图表单中的什么位置(键入日期)并立即删除它,我都会收到如下表单错误(不是正常的可捕获运行时错误):
"You tried to commit or Rollback a Transaction without first beginning a transaction."
碰巧的是,我确实在余额重新计算例程中使用了一个交易(在所有其他情况下都可以正常工作):
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")事件。出现上述错误后,它告诉我:
"The changes you've made can't be saved" "The save operation may have failed due to the temporary locking of the records by another user"
如果我 'Esc' 通过错误消息然后处理继续到 after_delConfirm(我有一个 "DoCmd.SetWarnings True"),然后进入余额重新计算程序,然后它完美地工作。
鉴于除了错误之外它工作正常(尽管显然有问题)我什至尝试过放置:
Response = acDataErrContinue
进入 Form_Error 事件,我还调试了 'DataErr' 值:它在 3034 和 2111 之间无休止地交替。
这一定与记录缓冲有关 and/or 事务(我以前没有使用过 Access Transactions)就好像我关闭了视图表单并 re-open 它然后我可以删除有问题的'new'交易没有任何问题。我试过在模态 'add' 表单关闭后和 Form_Delete 中粘贴一个 doEvents 但这没有区别。
非常感谢各位聪明人的帮助;我完全糊涂了。
编辑:我试过在 Commit 上添加 "dbForceOSFlush",但没有任何区别。
在浏览添加和查看表单中的每一行代码时找到了它。正如预期的那样,它与余额重新计算例程中的事务无关。
在 'view' 表单中,我有一个路由,通过一个简单的记录集书签操作将当前行位置移动到最后几行。当然,每当我编码 "set rs = currentdb.openrecordset(..)" 时,我都会立即编码 "rs.close" 和 "set rs = nothing"。在这种情况下,无论出于何种原因,我都没有这样做,所以有一个杂散的物体漂浮在令人困惑的事物周围。添加这两小行代码就可以了。
感谢所有花时间为我看这篇文章的人。令人惊奇的是,解决问题的频率和一点 last-ditch 的坚持导致了解决方案。