需求描述:SAP接收MRM接口数据创建采购申请,用户可能会通过同一个采购申请的不同的行项目创建不同的采购订单这种情况,MRM接口这时想针对行项目去进行撤销,先撤销采购订单相应行项目,撤销采购订单前,如果有审批标识先取消审批标识,然后再判断审批状态是否为待审批,如果是,则恢复审批状态为审批中,然后撤销采购申请相应的行项目。
问题描述:问题就出现在“撤销采购订单前,如果有审批标识先取消审批标识”。
调用BAPI:BAPI_PO_RESET_RELEASE取消审批标识有可能会造成采购订单被锁定,所以调用BAPI:BAPI_PO_CHANGE再去修改采购订单的状态会失败,提示“用户XXX正在更改采购订单xxx”。
解决方法:在取消采购订单审批标识后,给它强制解锁,反正是接口的用户锁定的。
CALL FUNCTION 'DEQUEUE_EMEKKOE'
EXPORTING
mode_ekko = 'E'
* MODE_EKPO = 'E'
mandt = sy-mandt
ebeln = ls_order-headernumber.
如果不想强制解锁,可以采取先对该采购订单进行上锁,如果上锁不成功说明确实被锁了,继续对其上锁,直到上锁成功,再对其解锁。
DO.
CALL FUNCTION 'ENQUEUE_EMEKKOE'
EXPORTING
mode_ekko = 'E'
* MODE_EKPO = 'E'
mandt = sy-mandt
ebeln = ls_order-headernumber
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
IF sy-subrc <> 0.
CONTINUE.
ELSE.
CALL FUNCTION 'DEQUEUE_EMEKKOE'
EXPORTING
mode_ekko = 'E'
* MODE_EKPO = 'E'
mandt = sy-mandt
ebeln = ls_order-headernumber.
EXIT.
ENDIF.
ENDDO.
接口过来的操作,不考虑上锁不成功的情况,何况上锁前的取消审批操作就可以规避这种情况了