ABAP修改生产订单组件BAPI 'BAPI_ALM_ORDER_MAINTAIN'


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生产订单。

需要修改源代码跳过检查即可 。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM