在这个函数中,参数No_COMMIT,是默认为空的,也就是说函数执行后会默认将数据提交到数据库,当我对多条数据进行审批时,如果遇到失败的数据,想将之前已经审批通过的数据进行回滚,这时候发现已经回滚不了了,数据已经被提交到数据库了,所以,这种情况就需要给NO_COMMIT赋值'X'。
代码:
LOOP AT l_tab_oadata INTO l_rec_oadata.
CLEAR l_wrk_status.
CLEAR l_wrk_sapno.
l_wrk_status = l_rec_oadata-status.
l_wrk_sapno = l_rec_oadata-sap_no.
CASE l_wrk_status.
WHEN 'A'. "审批通过
CLEAR l_wrk_relcod.
REFRESH l_tab_return.
l_wrk_relcod = 'B2'.
CALL FUNCTION 'BAPI_PO_RELEASE'
EXPORTING
purchaseorder = l_wrk_sapno
po_rel_code = l_wrk_relcod
use_exceptions = 'X'
no_commit = 'X'
TABLES
return = l_tab_return
EXCEPTIONS
authority_check_fail = 1
document_not_found = 2
enqueue_fail = 3
prerequisite_fail = 4
release_already_posted = 5
responsibility_fail = 6
OTHERS = 7.
LOOP AT l_tab_return INTO l_rec_return WHERE type = 'E' OR type = 'A'.
EXIT.
ENDLOOP.
IF sy-subrc = 0.
l_flg_err = 'X'.
EXIT.
ENDIF.
WHEN 'B'."审批拒绝
CLEAR l_wrk_relcod.
REFRESH l_tab_return.
l_wrk_relcod = 'B1'.
CALL FUNCTION 'BAPI_PO_RESET_RELEASE'
EXPORTING
purchaseorder = l_wrk_sapno
po_rel_code = l_wrk_relcod
use_exceptions = 'X'
TABLES
return = l_tab_return
EXCEPTIONS
authority_check_fail = 1
document_not_found = 2
enqueue_fail = 3
prerequisite_fail = 4
release_already_posted = 5
responsibility_fail = 6
no_release_already = 7
no_new_release_indicator = 8
OTHERS = 9.
LOOP AT l_tab_return INTO l_rec_return WHERE type = 'E' OR type = 'A'.
EXIT.
ENDLOOP.
IF sy-subrc = 0.
l_flg_err = 'X'.
EXIT.
ENDIF.
WHEN OTHERS.
ENDCASE.
APPEND l_rec_send TO l_tab_send.
CLEAR : l_rec_send,l_rec_oadata.
ENDLOOP.
IF l_flg_err IS INITIAL.
l_rec_send-code = 0. "成功
IF l_rec_send-message = ''.
l_rec_send-message = '操作处理成功!'.
ENDIF.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ELSE.
l_rec_send-code = 1. "失败
l_rec_send-message = l_rec_return-message.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.