> 本文档对上一篇文档做了补充,供读者参考
>
> 斌将军,公众号:斌将军 [ 关于改造维护工单BAPI_ALM_ORDER_MAINTAIN用于生产订单组件批量修改(一)
> ](https://mp.weixin.qq.com/s?__biz=Mzg5OTg3ODg2MQ==&mid=2247484984&idx=1&sn=331cb0d8fcb13ffd8eb1d3fd99d7805d&chksm=c04ddc9af73a558cf3e4b832cb25affc635c828e57923d21634a9d2d231888d69c44bdae56da#rd)
调用BAPI代码示例:
"--------------------@斌将军--------------------LOOP AT lt_alv INTO DATA(ls_alv) GROUP BY ls_alv-aufnr. REFRESH:lt_methods[],lt_component[],lt_componentup[],lt_return[]. CLEAR:lv_rspos.
CLEAR:ls_methods. ls_methods-refnumber = 1. ls_methods-method = 'SAVE'. ls_methods-objectkey = ls_alv-aufnr. APPEND ls_methods TO lt_methods.
LOOP AT GROUP ls_alv ASSIGNING FIELD-SYMBOL(<fs_alv>).
READ TABLE gt_resb INTO gs_resb WITH KEY aufnr = <fs_alv>-aufnr rspos = <fs_alv>-rspos BINARY SEARCH. IF sy-subrc EQ 0."修改逻辑 IF gs_resb-xloek = 'X'. <fs_alv>-icon = icon_led_red. <fs_alv>-log = <fs_alv>-log && '项目已删除,不允许修改'. MODIFY gt_alv FROM <fs_alv>. CONTINUE. ENDIF.
IF gs_resb-enmng > abs( gs_alv-bdmng ). <fs_alv>-icon = icon_led_red. <fs_alv>-log = <fs_alv>-log && '修改的数量小于已提货数,不允许修改'. MODIFY gt_alv FROM <fs_alv>. CONTINUE. ELSE. lv_rspos = lv_rspos + 1. CLEAR:ls_component.* ls_component-item_number = gs_alv-posnr. "BOM ls_component-reserv_no = gs_resb-rsnum. "预留号 ls_component-res_item = gs_resb-rspos. "预留项目 ls_component-material = <fs_alv>-idnrk. "物料编码 ls_component-requirement_quantity = <fs_alv>-bdmng."数量* ls_component-plant = gs_alv-werks. IF <fs_alv>-lgort IS NOT INITIAL. ls_component-stge_loc = <fs_alv>-lgort."存储地点 ENDIF.
ls_component-batch = <fs_alv>-charg."批次号 ls_component-req_date = <fs_alv>-bdter."组件的需求日期 IF <fs_alv>-rgekz IS NOT INITIAL. ls_component-backflush = 'X'."反冲标识 ELSE. ls_component-backflush = ''."反冲标识 ENDIF. ls_component-special_stock = <fs_alv>-sobkz."特殊库存 ls_component-activity = gs_resb-vornr."操作/活动编号 APPEND ls_component TO lt_component.
CLEAR:ls_componentup.* ls_componentup-item_number = 'X'. "BOM ls_componentup-material = 'X'. "物料编码 ls_componentup-requirement_quantity = 'X'."数量* ls_componentup-plant = 'X'. IF <fs_alv>-lgort IS NOT INITIAL. ls_componentup-stge_loc = 'X'."存储地点 ENDIF. ls_componentup-batch = 'X'."批次号 ls_componentup-req_date = 'X'."组件的需求日期 ls_componentup-backflush = 'X'."反冲标识 ls_componentup-special_stock = 'X'."特殊库存 APPEND ls_componentup TO lt_componentup.
CLEAR:ls_methods. ls_methods-refnumber = lv_rspos. "参照组件编号 ls_methods-objecttype = 'COMPONENT'. "组件 ls_methods-method = 'CHANGE'. "修改 ls_methods-objectkey = <fs_alv>-aufnr. "订单号 ls_methods-objectkey+12(4) = gs_resb-rspos. "预留行 APPEND ls_methods TO lt_methods.
"组件分配 IF <fs_alv>-vornr IS NOT INITIAL. lv_rspos = lv_rspos + 1. CLEAR:ls_component. ls_component-reserv_no = gs_resb-rsnum. "预留号 ls_component-res_item = gs_resb-rspos. "预留项目 ls_component-activity = <fs_alv>-vornr."新分配的工序 APPEND ls_component TO lt_component.
CLEAR:ls_componentup. ls_componentup-activity = 'X'. APPEND ls_componentup TO lt_componentup.
CLEAR:ls_methods. ls_methods-refnumber = lv_rspos. "参照组件编号 ls_methods-objecttype = 'COMPONENT'. "组件 ls_methods-method = 'REASSIGN'. "重新分配 ls_methods-objectkey = <fs_alv>-aufnr. "订单号 ls_methods-objectkey+12(4) = gs_resb-rspos. "预留行 APPEND ls_methods TO lt_methods. ENDIF. ENDIF. ELSE."新增逻辑 lv_rspos = lv_rspos + 1.
CLEAR:ls_component. ls_component-item_number = <fs_alv>-posnr. "BOM ls_component-material = <fs_alv>-idnrk. "物料编码 ls_component-requirement_quantity = <fs_alv>-bdmng."数量 ls_component-plant = <fs_alv>-werks."工厂 ls_component-stge_loc = <fs_alv>-lgort."存储地点 ls_component-batch = <fs_alv>-charg."批次 ls_component-req_date = <fs_alv>-bdter."组件的需求日期 IF <fs_alv>-rgekz IS NOT INITIAL. ls_component-backflush = 'X'."反冲标识 ELSE. ls_component-backflush = ''."反冲标识 ENDIF. ls_component-special_stock = <fs_alv>-sobkz."特殊库存 ls_component-activity = <fs_alv>-vornr."工序 ls_component-item_cat = 'L'."项目类别 APPEND ls_component TO lt_component.
CLEAR:ls_componentup. ls_componentup-item_number = 'X'. "BOM ls_componentup-material = 'X'. "物料编码 ls_componentup-requirement_quantity = 'X'."数量 ls_componentup-plant = 'X'."工厂 ls_componentup-stge_loc = 'X'."存储地点 ls_componentup-batch = 'X'."批次 ls_componentup-req_date = 'X'."组件的需求日期 ls_componentup-backflush = 'X'."反冲标识 ls_componentup-special_stock = 'X'."特殊库存 ls_componentup-activity = 'X'."工序 ls_componentup-item_cat = 'X'."项目类别 APPEND ls_componentup TO lt_componentup.
CLEAR:ls_methods. ls_methods-refnumber = lv_rspos. "参照组件编号 ls_methods-objecttype = 'COMPONENT'. "组件 ls_methods-method = 'CREATE'. "创建 ls_methods-objectkey = <fs_alv>-aufnr. "订单号 APPEND ls_methods TO lt_methods. ENDIF. ENDLOOP.
READ TABLE gt_afko INTO DATA(ls_afko) WITH KEY aufnr = ls_alv-aufnr BINARY SEARCH. IF sy-subrc EQ 0. CALL FUNCTION 'T350_READ' EXPORTING auart = ls_afko-auart EXCEPTIONS no_t350_entry = 1 OTHERS = 2.
* override buffered table T350 ASSIGN ('(SAPLINST)T350') TO <t350>. IF sy-subrc = 0. <t350>-auart = ls_afko-auart. ENDIF. ENDIF.
"调用ZBAPI CALL FUNCTION 'ZBAPI_ALM_ORDER_MAINTAIN' TABLES it_methods = lt_methods it_component = lt_component[] it_component_up = lt_componentup[] return = lt_return.
CLEAR:lv_check,lv_message. LOOP AT lt_return INTO ls_return WHERE type CA 'AEX'. lv_check = 'E'. lv_message = lv_message && ls_return-message. CLEAR:ls_return. ENDLOOP.
IF lv_check = 'E'. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ls_alv-icon = icon_led_red. ls_alv-log = lv_message.
ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. ls_alv-icon = icon_led_green. ls_alv-log = '添加成功'. ENDIF. MODIFY gt_alv FROM ls_alv TRANSPORTING icon log WHERE aufnr = ls_alv-aufnr AND xloek = '' AND item = 'X' AND icon <> icon_led_red.CLEAR:ls_alv. ENDLOOP."--------------------@斌将军--------------------