原本MM模块,碰到SD用户要求弄个程式批量修改订单的数量,那咱就搞一搞。不管做运维还是实施,偶尔还是要写写ABAP的。
准备用BDC的,本人不喜欢录屏这波操作,准备直接修改内表,怕影响因素较多,于是从网上查询了很多资料,函数BAPI_SALESORDER_CHANGE可以修改销售订单,这个函数可以做到,于是开干!
DATA: SALESDOCUMENT LIKE BAPIVBELN-VBELN,
ORDER_HEADER_IN LIKE BAPISDH1,
ORDER_HEADER_INX LIKE BAPISDH1X,
ORDER_ITEM_IN LIKE BAPISDITM OCCURS 0 WITH HEADER LINE,
ORDER_ITEM_INX LIKE BAPISDITMX OCCURS 0 WITH HEADER LINE,
RETURN1 LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE,
SCHEDULE_LINES LIKE BAPISCHDL OCCURS 0 WITH HEADER LINE,
SCHEDULE_LINESX LIKE BAPISCHDLX OCCURS 0 WITH HEADER LINE.
ORDER_HEADER_INX-UPDATEFLAG = 'U'.
ORDER_ITEM_IN-ITM_NUMBER = POSNR . "行项目
APPEND ORDER_ITEM_IN.
ORDER_ITEM_INX-ITM_NUMBER = POSNR ."行项目
ORDER_ITEM_INX-UPDATEFLAG = 'U'.
APPEND ORDER_ITEM_INX.
SCHEDULE_LINES-ITM_NUMBER = POSNR ."行项目
SCHEDULE_LINES-SCHED_LINE = '0001'."计划行
SCHEDULE_LINES-REQ_QTY = KWMENG."数量
APPEND SCHEDULE_LINES.
SCHEDULE_LINESX-ITM_NUMBER = POSNR ."行项目
SCHEDULE_LINESX-SCHED_LINE = '0001'."计划行
SCHEDULE_LINESX-UPDATEFLAG = 'U'.
SCHEDULE_LINESX-REQ_QTY = 'X'.
APPEND SCHEDULE_LINESX.
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
SALESDOCUMENT = VBELN "销售订单号
ORDER_HEADER_INX = ORDER_HEADER_INX
TABLES
RETURN = RETURN1
ORDER_ITEM_IN = ORDER_ITEM_IN
ORDER_ITEM_INX = ORDER_ITEM_INX
SCHEDULE_LINES = SCHEDULE_LINES
SCHEDULE_LINESX = SCHEDULE_LINESX.
READ TABLE RETURN1 WITH KEY TYPE = 'E'.
IF SY-SUBRC <> '0'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' "提交更改
EXPORTING
WAIT = 'X'.
WRITE: VBELN, POSNR,'修改成功!'.
WRITE : /.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
WRITE: VBELN, POSNR,'修改失败!'.
WRITE : /.
ENDIF.
这样就实现了订单的单个行项的修改。因为需要多笔修改,通过excel上传的方式(excel上传方式很多,就不写了),但是订单、行项、数量这几个栏位必须有。
批量执行的时候,出现这种错误,但是前面的两行20,40,又是成功的。
通过调式发现,如果是批量修改又是不同订单的,每次执行完后,需要清空上一次BAPI_SALESORDER_CHANGE中的内表数据。
CLEAR ORDER_ITEM_IN[] .
CLEAR ORDER_ITEM_INX[].
CLEAR SCHEDULE_LINES[].
CLEAR SCHEDULE_LINESX[] .
CLEAR SALESDOCUMENT .
这样就可以了,测试完美通过!
注意:销售订单和行项前导位记得补‘0’,代码里POSNR KWMENG VBELN,自己替换。如果是通过执行上传后多笔修改,可以循环执行。