Sql ABAP在程序退出时执行某些操作

Sql ABAP在程序退出时执行某些操作,sql,events,abap,sap-gui,Sql,Events,Abap,Sap Gui,在我的ABAP程序中,我在开始时更新表tab1中的字段X,在最后一步中,如果一切正常,我将反转此更新。在程序执行过程中,字段X的值必须正确,这一点很重要 但是,当我使用关闭按钮而不是SAP取消按钮(F12)退出事务时,程序终止,并且不会转到程序的末尾,因此不会反转开始时进行的更新 是否有一种方法可以在关闭报表后执行某些代码?我认为您正在尝试添加锁定机制。ABAP有自己的对象锁定机制。如果用户注销、关闭报告或会话终止,系统将自动解锁它。我更喜欢使用锁定机制 如果你工作的场景不同;将user和lo

在我的ABAP程序中,我在开始时更新表tab1中的字段X,在最后一步中,如果一切正常,我将反转此更新。在程序执行过程中,字段X的值必须正确,这一点很重要

但是,当我使用关闭按钮而不是SAP取消按钮(F12)退出事务时,程序终止,并且不会转到程序的末尾,因此不会反转开始时进行的更新


是否有一种方法可以在关闭报表后执行某些代码?

我认为您正在尝试添加锁定机制。ABAP有自己的对象锁定机制。如果用户注销、关闭报告或会话终止,系统将自动解锁它。我更喜欢使用锁定机制

如果你工作的场景不同;将user和lock time的新列添加到同一个表中,并检查用户是否联机,否则移除锁

如果您不想通过用户操作解除锁定,可以启动新的后台作业5分钟并更新记录。此作业可以检查用户和记录,如果用户从报告(t代码SM04)注销,则删除作业记录,否则自行重新安排。

程序无法控制“关闭窗口”按钮(这适用于“外部模式”)例如,全屏窗口,这似乎是您的问题,但不适用于弹出窗口,其关闭按钮可以控制)

因此,SAP通过以下方式对其Dynpro应用程序进行编程:

  • 保存时,SAP会在整个应用程序结束时更新数据库
  • 最后,如果屏幕的某些部分由“外部”应用程序处理,则SAP会通过“更新任务”记录中间更新(即延迟到应用程序结束时完成提交工作)。请注意,SAP也经常只在最后使用更新任务,但这只是为了获得更好的对话框响应时间

自定义应用程序也应该遵循同样的原则。

谢谢,这些都是非常好的建议,我可能会选择2或3选项,因为在程序退出之前可能还没有类似的mechanizm。如果用户连接丢失,则无法在用户客户端上触发某些内容。在服务器端,我认为您需要向用户出口(用户注销、程序转储、会话超时、用户踢等)添加大量代码(如果存在)。我更喜欢更改应用程序流程以安装锁机制。Dynpro应用程序应该在用户保存时在最后更新数据库。我将在另一个答案中详细描述。这里描述的锁定机制不应该是这个一般问题的第一个答案。这是z程序,我不能允许两个用户同时访问同一个文档。所以,在有人打开文档后,我立即更改表中的标志,这样可以修改文档。对其他用户不可见。这就是为什么我不能等到事务结束后才更新表的原因,因为在此期间,其他人可能会打开此文档。@user3463645您的观点与最初的问题不同。请把它当作一个新问题来问,这样人们才能回答。不,这是同一个问题。我在程序开始时设置了标志,以阻止其他用户访问文档。但当有人通过关闭窗口退出交易时,该标志不会反转,文档对任何人都不可见。您最初的问题是当按下关闭按钮时如何反应。这里绝对没有提到并发用户(您只提到“更新表tab1中的字段X”,其目标没有解释)。虽然您的问题很清楚,但您在问题中使用的词语不足以理解您的实际问题。因此,要坚持您的实际情况,您应该使用SAP lock对象锁定/解锁,不需要在表中有专用列,不需要更新表,不需要创建恢复程序。