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生產訂單。
需要修改源代碼跳過檢查即可 。