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 的坚持导致了解决方案。