BAPI_ALM_ORDER_MAINTAIN
场景一:当发现BOM不准确,且已经生成了生产订单后需要批量修改BOM后 修改生产订单组件数量大。故开发程序批量修改。
场景二:BOM基于既定条件下是准确的,但是由于备料或者库存缺料以及需要消耗呆滞料等问题,需要临时修改改生产订单组件(不修改BOM信息)。CO02这个权限很大且对于多数据修改比较麻烦,所以需开发一个只能修改生产订单组件的功能。
基于开发角度的分析:
1) 使用BDC录屏的方式。
2) 使用BAPI_ALM_ORDER_MAINTAIN(修改生产订单组件)
TYPES:BEGIN OF ty_data , zsel TYPE char10, status TYPE char40, "状态 zmseg TYPE char255, "返回消息 werks TYPE mapl-werks, "工厂 aufnr TYPE aufk-aufnr, "生产订单 aposn TYPE aposn, idnrk1 TYPE stpo-idnrk, zwlms1 TYPE string, idnrk2 TYPE stpo-idnrk, zwlms2 TYPE string, END OF ty_data . DATA:gt_item2 TYPE TABLE OF ty_data, gs_item2 TYPE ty_data. DATA:is_methods LIKE bapi_alm_order_method, it_methods LIKE STANDARD TABLE OF bapi_alm_order_method, is_component LIKE bapi_alm_order_component, "组件信息 it_component LIKE STANDARD TABLE OF bapi_alm_order_component, "组件信息 is_component_up LIKE bapi_alm_order_component_up, it_component_up LIKE STANDARD TABLE OF bapi_alm_order_component_up, return LIKE TABLE OF bapiret2, "返回消息 et_numbers LIKE bapi_alm_numbers. "返回订单编码信息
LOOP AT gt_item2 ASSIGNING FIELD-SYMBOL(<gs_item>). PERFORM frm_read_text USING <gs_item>-idnrk1 CHANGING <gs_item>-zwlms1 . PERFORM frm_read_text USING <gs_item>-idnrk2 CHANGING <gs_item>-zwlms2 . CLEAR :it_methods[],it_component[],it_component_up[],return,lv_msg,lv_index. "组件信息 SELECT * FROM resb INTO TABLE @DATA(lt_resb) WHERE aufnr = @<gs_item>-aufnr AND posnr = @<gs_item>-aposn . IF lt_resb IS NOT INITIAL. READ TABLE lt_resb ASSIGNING FIELD-SYMBOL(<ls_resb>) INDEX 1 . lv_index = '1' . IF sy-subrc = 0 . APPEND INITIAL LINE TO it_methods ASSIGNING FIELD-SYMBOL(<fs_methods>). <fs_methods>-refnumber = lv_index. <fs_methods>-objecttype = 'COMPONENT'. <fs_methods>-method = 'CHANGE'. <fs_methods>-objectkey(12) = <gs_item>-aufnr. <fs_methods>-objectkey+12(4) = <ls_resb>-rspos. APPEND INITIAL LINE TO it_component ASSIGNING FIELD-SYMBOL(<fs_component>). <fs_component>-reserv_no = <ls_resb>-rsnum. <fs_component>-res_item = <ls_resb>-rspos. <fs_component>-activity = <GS_ITEM>-aposn. <fs_component>-material = <gs_item>-idnrk2. APPEND INITIAL LINE TO it_component_up ASSIGNING FIELD-SYMBOL(<fs_component_up>). <fs_component_up>-material = 'X'. APPEND INITIAL LINE TO it_methods ASSIGNING FIELD-SYMBOL(<fs_zmethods>). <fs_zmethods>-refnumber = lv_index. <fs_zmethods>-method = 'SAVE'. <fs_zmethods>-objectkey = <gs_item>-aufnr. ENDIF. CALL FUNCTION 'BAPI_ALM_ORDER_MAINTAIN' TABLES it_methods = it_methods it_component = it_component it_component_up = it_component_up return = return. LOOP AT return ASSIGNING FIELD-SYMBOL(<fs_return>) WHERE type CA 'EA'. lv_msg = lv_msg && condense( <fs_return>-message ). ENDLOOP. <gs_item>-aufnr = |{ <gs_item>-aufnr ALPHA = OUT }| . IF lv_msg IS NOT INITIAL. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. <gs_item>-status = icon_red_light. <gs_item>-zmseg = '生产订单:' && <gs_item>-aufnr && '组件调整错误' && lv_msg. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. <gs_item>-status = icon_green_light. <gs_item>-zmseg = '生产订单:' && <gs_item>-aufnr && '组件调整完毕!' . ENDIF. ELSE . <gs_item>-status = icon_red_light . <gs_item>-zmseg = '找不到生产订单信息!' . ENDIF. ENDLOOP.
根据生产订单组件对应的预留和BOM项目确定修改哪一行组件,系统中的数据可以通过COOIS导出来 。
此时赋值完后还是不能成功。那是因为系统提供的BAPI只能修改PM生产订单。
需要修改源代码跳过检查即可 。