为什么更新数据库表IN UPDATE TASK总是进行回滚

时间:2017-11-24 05:29:46

标签: sap abap function-module

在更新实际数据库表(使用SAP LUW)时,IN UPDATE TASK始终是在实际表中进行的回滚更改。

APPEND ls_emp TO lt_up_emp.
call function 'ZFM_UPDATE_EMPLOYEE' in update task
      tables
        lt_update = lt_up_emp.
COMMIT WORK.
if sy-subrc <> 0.
  ROLLBACK WORK.
endif.

这是我的UPDATE FUNCTION MODULE,用于更新实际的DB表:

IF sy-subrc = 0.
  ""--- insert the data.
  IF lt_insert[] IS NOT INITIAL.
    INSERT ztadept FROM TABLE lt_insert.
    IF sy-subrc <> 0.
      RAISE not_inserted.
    ENDIF.
  ENDIF.
  "-- delete....
  IF lt_delete[] IS NOT INITIAL.
    DELETE ztadept FROM TABLE lt_delete.
    IF sy-subrc <> 0.
      RAISE not_deleted.
    ENDIF.
  ENDIF.
  "--Update.........
  IF lt_update[] IS NOT INITIAL.
    UPDATE ztadept FROM TABLE lt_update.
    IF sy-subrc <> 0.
      RAISE not_updated.
    ENDIF.
  ENDIF.
ENDIF.
CALL FUNCTION 'DEQUEUE_EZDEPT_LOC'.

为什么要回滚更新?

1 个答案:

答案 0 :(得分:0)

COMMIT WORK的ABAP文档说:

  

如果未指定AND AND WAIT,则语句COMMIT WORK始终将sy-subrc设置为0。

因此,这意味着回退更新的不是您的ROLLBACK WORK(并且您可以通过删除此无用的行来清理代码)。

剩下的唯一可能性是:

  • 两个更新功能模块都存在错误,并且不更新任何内容,
  • 或更新功能模块引发异常(RAISE)。

在第一种情况下,您可以通过激活“调试更新”来调试功能模块,在第二种情况下,可以通过运行事务代码SM13来查看更新功能模块的错误。

注释:在更新任务中显式删除锁并不常见,因为通常将锁设置为scope'2'(默认值),该锁会在更新任务结束时自动释放锁。