我有以下代码(为了便于说明,它已被简化)。我在proc1,proc2和proc3中的不同数据库表中创建记录。我想要实现的是......如果我在任何时候循环访问临时表时遇到错误(即使我已经创建了一堆数据库记录),我想要回滚一切,所以没有记录是创建。如果proc1,proc2和proc3没有问题,它会捕获错误,但我无法弄清楚如何将这些错误传递给主处理块,以便它理解它并将所有内容卷回来。换句话说,消息('错误@ main trans block')永远不会弹出,因此已创建的记录会保留在DB中。事实上,没有任何东西可以回滚。
DO TRANSACTION ON ERROR UNDO, THROW:
FOR EACH tt1:
RUN proc1.
FOR EACH tt2 WHERE tt2.field1 EQ tt1.field1:
RUN proc2.
FOR EACH tt3 WHERE tt3.field2 EQ tt2.field2:
RUN proc3.
END.
END.
END.
CATCH e AS PROGRESS.Lang.AppERROR:
MESSAGE 'error @ main trans block'
VIEW-AS ALERT-BOX INFO BUTTONS OK.
END CATCH.
END.
PROCEDURE proc1.
DO TRANSACTION ON ERROR UNDO, THROW:
/* creating some DB records */
CATCH e AS PROGRESS.Lang.ERROR:
RETURN ERROR 'Proc1 ' + e:getmessage(1).
END CATCH.
END.
END PROCEDURE.
PROCEDURE proc2.
DO TRANSACTION ON ERROR UNDO, THROW:
/* creating some DB records */
CATCH e AS PROGRESS.Lang.ERROR:
RETURN ERROR 'Proc2 ' + e:getmessage(1).
END CATCH.
END.
END PROCEDURE.
PROCEDURE proc3.
DO TRANSACTION ON ERROR UNDO, THROW:
/* creating some DB records */
CATCH e AS PROGRESS.Lang.ERROR:
RETURN ERROR 'Proc3 ' + e:getmessage(1).
END CATCH.
END.
END PROCEDURE.
TIA
答案 0 :(得分:1)
有几个潜在的问题。
首先,需要在没有var readings = [Double]()
标志的情况下定义临时表tt1和tt2。
其次,FOR EACH块正在使用它们的默认错误处理行为,即NO-UNDO
因此,FOR EACH块中引发的错误将导致当前迭代被撤消,而不是整个事务。
我建议添加
ON ERROR UNDO, NEXT.
到程序的顶部。或者至少
BLOCK-LEVEL ON ERROR UNDO, THROW .
与所有ROUTINE-LEVEL ON ERROR UNDO, THROW .
块上的ON ERROR UNDO, THROW
选项结合使用。
自OpenEdge 11.3(左右)以来,FOR EACH
错误处理选项可用。