[英]BAPI_GOODSMVT_CREATE with multiple material numbers and same PP order?
据我所知,当您同时使用 BAPI_GOODSMVT_CREATE(通过循环或巧合)时,使用相同的材料编号会给您带来有关锁定 object 的错误(材料 XXXX 已被用户 YYYY 锁定)。
但是,据我所知,同时使用 BAPI_GOODSMVT_CREATE,但具有相同生产订单的不同材料编号不会出错。
问题
最近我发现一个关于 M3/897 的错误(物料 XXXX 的工厂数据被用户 XXXX 锁定)当我尝试 GI 用于生产订单时执行 BAPI_GOODSMVT_CREATE,通过并行处理,将不同的物料编号放入同一生产命令。
问题
所以,我问的是 BAPI_GOODSMVT_CREATE 的约束。
到目前为止我知道的是 -
A. 当您为不同的生产订单放置相同的物料编号时,您不能同时为生产订单 (Mvt 261) 发出 GI。
B.(我对此不确定)当您为同一生产订单放置不同的物料编号时,您不能同时为生产订单 (Mvt 261) 发出 GI。
两者都对,还是只有 A 对? 经验丰富的 ABAPer 或 MM 顾问的任何帮助将不胜感激!
要在循环中发布 GI,您需要在每次运行后进行提交,并显式解锁 object,否则您将获得 PP 锁。
试试这样:
LOOP AT lt_orders ASSIGNING <fs>.
...
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
goodsmvt_header = ls_header
goodsmvt_code = ls_code
IMPORTING
goodsmvt_headret = ls_headret
materialdocument = ls_retmtd
TABLES
goodsmvt_item = lt_item
return = lt_return.
IF line_exists( lt_return[ type = 'E' ] ).
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
COMMIT WORK AND WAIT.
CALL FUNCTION 'DEQUEUE_ALL'.
ENDIF.
ENDLOOP.
在每次 BAPI 调用后始终使用带有 WAIT 参数的 BAPI_TRANSACTION_COMMIT 或带有相同参数的 COMMIT WORK。
GR 和隐式 GI 运动也可能存在棘手的问题,请参阅关于此的注释369518 。
您可以使用此 FM - “ENQUE_READ2”在运行时检查现有锁的存在。
data: RAW_ENQ like LOCKSEDX_ENQ_TAB, SUBRC type SY-SUBRC, NUMBER type I.
clear : RAW_ENQ[], SUBRC, NUMBER.
add 1 to COUNTER.
call function 'ENQUE_READ2'
importing
SUBRC = SUBRC
NUMBER = NUMBER
tables
ENQ = RAW_ENQ.
但是如果你必须防止 GOODS mvt 失败。 通常,您必须实施一些重新处理逻辑来存储错误。
步骤是:捕获错误 --> 存储 bapi 信息或 header 文档编号 --> 稍后重试
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.