BOM创建和修改

FUNCTION z_rfc_plm_007.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(P_MODE) TYPE  CHAR1 DEFAULT 'N'
*"     VALUE(P_SYSTEM) TYPE  CHAR4 DEFAULT 'PLM'
*"     VALUE(P_UNAME) TYPE  UNAME DEFAULT SY-UNAME
*"     VALUE(P_NAME1) TYPE  CHAR12 OPTIONAL
*"  TABLES
*"      IT_PLM007 STRUCTURE  ZRFCS_PLM007 OPTIONAL
*"----------------------------------------------------------------------
  DATA:it_bomgroup  LIKE bapi1080_bgr_c OCCURS 0 WITH HEADER LINE,
       it_variants  LIKE bapi1080_bom_c OCCURS 0 WITH HEADER LINE,
       it_items     LIKE bapi1080_itm_c OCCURS 0 WITH HEADER LINE,
       it_matrel    LIKE bapi1080_mbm_c OCCURS 0 WITH HEADER LINE,
       it_itemas    LIKE bapi1080_rel_itm_bom_c OCCURS 0 WITH HEADER LINE,
       it_return    LIKE bapiret2 OCCURS 0 WITH HEADER LINE,
       it_subitems  LIKE bapi1080_sui_c OCCURS 0 WITH HEADER LINE,
       it_subitemas LIKE bapi1080_rel_sui_itm_c OCCURS 0 WITH HEADER LINE.
  DATA: lv_meins    TYPE mara-meins,
        lv_potx1    TYPE potx1,
        lv_zmessage TYPE char255,
        lv_potx2    TYPE potx2,
        lv_matnr    TYPE char18,
        lv_end      TYPE char1,
        lv_begin    TYPE char1,
        lv_ztype    TYPE char1,
        lv_len      TYPE p,
        lv_tabixu   TYPE sy-tabix.
  DATA: ls_stko      TYPE stko_api01,
        ls_csap_mbom TYPE csap_mbom.
  DATA: l_return TYPE string.
  DATA: lv_basme TYPE basme,
        lo_stko  TYPE stko_api02.
  DATA p_message TYPE capiflag-flwarning.
  DATA: json_ser TYPE REF TO cl_trex_json_serializer,
        json_des TYPE REF TO cl_trex_json_deserializer.
  DATA: jsonstr TYPE string.
  DATA: lt_zrfc_logs TYPE TABLE OF zrfc_logs,
        ls_zrfc_logs TYPE zrfc_logs.
  DATA: lv_tabix TYPE sy-tabix.
  DATA: date(10) TYPE c.
  DATA: lv_abap_sm59 TYPE string.
  DATA: lv_str1 TYPE string,
        lv_str2 TYPE string.
  DATA: ls_header LIKE csap_mbom,
        lt_stpo   LIKE TABLE OF stpo_api01,
        ls_stpo   LIKE stpo_api01.
  lv_str1 = 'T100 中未发现消息'.
  DATA: lv_bname TYPE usr21-bname.
  CASE sy-mandt.
    WHEN 886.
      lv_abap_sm59 = 'S4PCLNT886'.
    WHEN 520.
      lv_abap_sm59 = 'S4DCLNT520'.
    WHEN 668.
      lv_abap_sm59 = 'S4DCLNT668'.
    WHEN 510.
      lv_abap_sm59 = 'S4DCLNT510'.
    WHEN OTHERS.
      lv_abap_sm59 = ''.
  ENDCASE.

  SELECT COUNT(*)
      FROM zit0004
     WHERE zstop EQ 'X'
       AND name IN ('ALL','Z_RFC_PLM_007').
  IF sy-subrc EQ 0.
    MESSAGE '该功能已暂停使用,请等IT通知,谢谢!' TYPE 'E'.
    EXIT.
  ENDIF.
  DATA t_stpo TYPE STANDARD TABLE OF stpo_api02 WITH HEADER LINE.
  DATA t_stpo2 TYPE STANDARD TABLE OF stpo_api02 WITH HEADER LINE.
  DATA t_stpo3 TYPE STANDARD TABLE OF stpo_api03 WITH HEADER LINE.
  CREATE OBJECT json_ser
    EXPORTING
      data = it_plm007[].
  CALL METHOD json_ser->serialize.
  CALL METHOD json_ser->get_data
    RECEIVING
      rval = jsonstr.

  ls_zrfc_logs-funcname   = 'Z_RFC_PLM_007'.
  ls_zrfc_logs-zsystem    = p_system.
  ls_zrfc_logs-uname      = p_uname.
  ls_zrfc_logs-zname1     = p_name1.
  ls_zrfc_logs-erdat      = sy-datum.
  ls_zrfc_logs-uzeit      = sy-uzeit.
*  ls_zrfc_logs-ep_type    = ep_type.
*  ls_zrfc_logs-ep_message = ep_message.
  ls_zrfc_logs-jsonstr1   = jsonstr.
  IF p_system NE 'SAP'.
    MODIFY zrfc_logs FROM ls_zrfc_logs.
    IF sy-subrc EQ 0.
      COMMIT WORK AND WAIT.
    ELSE.
      ROLLBACK WORK.
    ENDIF.
  ENDIF.

  SELECT *
    INTO TABLE @DATA(lt_t416)
    FROM t416.
  SORT lt_t416[] BY stlan.
*因为PLM那边每次只传一个BOM的,所以select写在循环里也不影响效率

  LOOP AT it_plm007 ASSIGNING FIELD-SYMBOL(<fs_007>).
    CLEAR: lv_matnr.
    lv_matnr = |{ <fs_007>-matnr ALPHA = IN }|. "增加前置0
    <fs_007>-stlal = |{ <fs_007>-stlal ALPHA = IN }|. "增加前置0
    <fs_007>-posnr = |{ <fs_007>-posnr ALPHA = IN }|.
    <fs_007>-matnr = lv_matnr.
    <fs_007>-zpaixu = <fs_007>-posnr.
  ENDLOOP.
  SORT it_plm007[] BY matnr werks stlan stlal zpaixu.
  LOOP AT it_plm007.
    CLEAR: lv_begin,lv_end.
    AT NEW stlal.
      lv_begin = 'X'.
    ENDAT.
    AT END OF stlal.
      lv_end = 'X'.
    ENDAT.
    CLEAR: lv_matnr.
    lv_matnr = |{ it_plm007-matnr ALPHA = IN }|. "增加前置0
    it_plm007-stlal = |{ it_plm007-stlal ALPHA = IN }|. "增加前置0
    it_plm007-posnr = |{ it_plm007-posnr ALPHA = IN }|.
    it_plm007-matnr = lv_matnr.

    IF lv_begin = 'X'.
      SELECT COUNT(*)
*        INTO TABLE @DATA(lt_mast)
        FROM mast
       WHERE werks EQ @it_plm007-werks "工厂
         AND matnr EQ @it_plm007-matnr "物料
         AND stlan EQ @it_plm007-stlan "BOM用途
         AND stlal EQ @it_plm007-stlal."可选的BOM
      IF sy-subrc EQ 0.
*        READ TABLE lt_mast INTO DATA(ls_mast) INDEX 1.
*        SELECT *
*          INTO TABLE @DATA(lt_stko)
*          FROM stko
*         WHERE stlnr EQ @ls_mast-stlnr
*           AND stlal EQ @ls_mast-stlal.
*        SORT lt_stko BY stkoz DESCENDING.
*        READ TABLE lt_stko INTO DATA(ls_stko2) INDEX 1.
*        IF sy-subrc EQ 0.
*          IF ls_stko2-STLST EQ '2'.
        IF it_plm007-aennrt EQ ''.
*已存在BOM,则修改,不需要填写ECN
          lv_ztype = 'S'.
        ELSE.
*已存在BOM,则修改,需要填写ECN,需要更改两次,一次更改有更改编号的,第二次对比没有更改编号的更改项
          lv_ztype = 'U'.
        ENDIF.
*      CLEAR: lt_mast[],lt_stko[],ls_mast,ls_stko2.
      ELSE.
*不存在BOM,则创建
        lv_ztype = 'C'.
      ENDIF.
    ENDIF.

    IF lv_ztype EQ 'U'.
*已存在BOM,且已激活(BOM状态为1),则修改
      IF lv_begin EQ 'X'.
        date = it_plm007-datuv.
        CLEAR: t_stpo , t_stpo[].
        IF lv_abap_sm59 IS NOT INITIAL.
          CALL FUNCTION 'CSAP_MAT_BOM_OPEN'
            DESTINATION lv_abap_sm59
            EXPORTING
              material    = it_plm007-matnr
              plant       = it_plm007-werks
              bom_usage   = it_plm007-stlan
              alternative = it_plm007-stlal "'01'
              change_no   = it_plm007-aennrt
              valid_from  = date
            TABLES
              t_stpo      = t_stpo[]
            EXCEPTIONS
              error       = 1
              OTHERS      = 2.
        ELSE.
          CALL FUNCTION 'CSAP_MAT_BOM_OPEN'
            EXPORTING
              material    = it_plm007-matnr
              plant       = it_plm007-werks
              bom_usage   = it_plm007-stlan
              alternative = it_plm007-stlal "'01'
              change_no   = it_plm007-aennrt
              valid_from  = date
            TABLES
              t_stpo      = t_stpo[]
            EXCEPTIONS
              error       = 1
              OTHERS      = 2.
        ENDIF.
        DELETE t_stpo[] WHERE valid_to LE date.
        LOOP AT t_stpo ASSIGNING FIELD-SYMBOL(<ls_stpo>).
          CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
            EXPORTING
              input  = <ls_stpo>-component
            IMPORTING
              output = <ls_stpo>-component.
        ENDLOOP.
        IF t_stpo[] IS INITIAL.
          it_plm007-ztype = 'E'.
          CLEAR: lv_zmessage.
          CALL FUNCTION 'MESSAGE_TEXT_BUILD'
            EXPORTING
              msgid               = sy-msgid
              msgnr               = sy-msgno
              msgv1               = sy-msgv1
              msgv2               = sy-msgv2
              msgv3               = sy-msgv3
              msgv4               = sy-msgv4
            IMPORTING
              message_text_output = lv_zmessage.
          lv_bname = sy-msgv4.
          SELECT SINGLE name_text
            INTO @DATA(lv_name_text)
            FROM usr21 JOIN v_addr_usr ON usr21~addrnumber EQ v_addr_usr~addrnumber
                                      AND usr21~persnumber EQ v_addr_usr~persnumber
           WHERE usr21~bname EQ @lv_bname.
          it_plm007-zmessage = lv_zmessage && lv_name_text.
        ENDIF.
      ENDIF.

      t_stpo2-item_no           = |{ it_plm007-posnr ALPHA = IN }|."it_plm007-posnr."'0010'.BOM项目号
      t_stpo2-item_categ          = it_plm007-postp.
      t_stpo2-component         = it_plm007-idnrk.
      CLEAR:lv_potx1,lv_potx2.
      lv_len = strlen( it_plm007-potx1 ).
      IF lv_len <= 40.
        lv_potx1 = it_plm007-potx1.
      ELSE.
        lv_potx1 = it_plm007-potx1+0(40).
        lv_potx2 = it_plm007-potx1+40(40).
      ENDIF.
      t_stpo2-item_text1        = lv_potx1. "BOM项目文本1
      t_stpo2-item_text2        = lv_potx2. "BOM项目文本2
      t_stpo2-comp_qty          = it_plm007-menge. "组件数量
      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
        EXPORTING
          input          = it_plm007-meins
        IMPORTING
          output         = t_stpo2-comp_unit
        EXCEPTIONS
          unit_not_found = 1
          OTHERS         = 2.
      IF t_stpo2-comp_unit CA '**' OR t_stpo2-comp_unit EQ ''.
        t_stpo2-comp_unit = it_plm007-meins.
      ENDIF.
*          t_stpo2-comp_unit         = it_plm007-meins."组件基本计量单位
      t_stpo2-comp_scrap        = it_plm007-ausch. "组件报废百分比
      t_stpo2-mat_provis        = it_plm007-beikz."物料供应标识符
      t_stpo2-ai_strateg        = it_plm007-alpst. "替代项目:策略
      t_stpo2-ai_prio           = it_plm007-alprf. "替代项目:评比定单
      t_stpo2-ai_group          = it_plm007-alpgr. "替代项目:组
      t_stpo2-usage_prob        = it_plm007-ewahr. "使用可能性按%
      t_stpo2-follow_grp        = it_plm007-nfgrp. "后继组
      t_stpo2-discon_grp        = it_plm007-nfeag. "中止组
      READ TABLE lt_t416 INTO DATA(ls_t416) WITH KEY stlan = it_plm007-stlan BINARY SEARCH.
      IF sy-subrc EQ 0.
        IF ls_t416-pmpfe EQ '+'."与生产相关项目
          t_stpo2-rel_prod          = 'X'.
        ENDIF.
        IF ls_t416-pmpko EQ '+'."标识:与工程相关项目
          t_stpo2-rel_engin          = 'X'.
        ENDIF.
        IF ls_t416-pmpka EQ '+'."标识:与成本核算相关的项目
          t_stpo2-rel_cost          = 'X'.
        ENDIF.
        IF ls_t416-pmprv EQ '+'."标志: 与销售 & 分销(SD)相关项目
          t_stpo2-rel_sales          = 'X'.
        ENDIF.
*        IF ls_t416-PMPVS EQ '+'."指示器: 与发货相关项目
*          t_stpo2-rel_prod          = 'X'.
*        ENDIF.
        IF ls_t416-pmpin EQ '+'."指示器:与工厂维护相关的项目
          t_stpo2-rel_pmaint          = 'X'.
        ENDIF.
        IF ls_t416-pmper EQ '+'."标识:备件
          t_stpo2-spare_part          = 'X'.
        ENDIF.
      ENDIF.

      t_stpo2-rel_cost          = it_plm007-sanka."成本核算标识相关
*        t_stpo2-CO_PRODUCT = it_plm007-KZKUP1.
*      IF it_plm007-delete_pnr EQ 'X'.
*        t_stpo2-fldelete = 'X'.
*      ENDIF.
      t_stpo2-valid_from        = sy-datum."it_plm007-datuv."it_plm007-datuv. "有效起始日期
      t_stpo2-change_no         = it_plm007-aennr. "更改编号
      APPEND t_stpo2 TO t_stpo2[].
      CLEAR: t_stpo2.
      IF lv_end EQ 'X'.
        LOOP AT t_stpo.
          t_stpo-fldelete = 'X'.
          READ TABLE t_stpo2 WITH KEY item_no = t_stpo-item_no
                                      item_categ = t_stpo-item_categ
                                      component = t_stpo-component.
          IF sy-subrc EQ 0.
            IF t_stpo2-change_no EQ ''.
              CLEAR t_stpo.
              CONTINUE.
            ENDIF.
*            IF t_stpo-change_no NE ''.
*              CLEAR t_stpo.
*              CONTINUE.
*            ENDIF.
*            ELSE.
*              t_stpo-fldelete = ''.
*              t_stpo-item_text1        = t_stpo2-item_text1. "BOM项目文本1
*              t_stpo-item_text2        = t_stpo2-item_text2. "BOM项目文本2
*              t_stpo-comp_qty          = t_stpo2-comp_qty. "组件数量
*              t_stpo-comp_scrap        = t_stpo2-comp_scrap. "组件报废百分比
*              t_stpo-mat_provis        = t_stpo2-mat_provis."物料供应标识符
*              t_stpo-ai_strateg        = t_stpo2-ai_strateg. "替代项目:策略
*              t_stpo-ai_prio           = t_stpo2-ai_prio. "替代项目:评比定单
*              t_stpo-ai_group          = t_stpo2-ai_group. "替代项目:组
*              t_stpo-usage_prob        = t_stpo2-ewahr. "使用可能性按%
*              t_stpo-follow_grp        = t_stpo2-follow_grp. "后继组
*              t_stpo-discon_grp        = t_stpo2-discon_grp. "中止组

*          ELSE.
*            CONTINUE.
          ENDIF.
          CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
            EXPORTING
              input  = t_stpo-component
            IMPORTING
              output = t_stpo-component.

          IF lv_abap_sm59 IS NOT INITIAL.
            CALL FUNCTION 'CSAP_BOM_ITEM_MAINTAIN' "维护BOM
              DESTINATION lv_abap_sm59
              EXPORTING
                i_stpo = t_stpo
              EXCEPTIONS
                error  = 1
                OTHERS = 2.
          ELSE.
            CALL FUNCTION 'CSAP_BOM_ITEM_MAINTAIN' "维护BOM
              EXPORTING
                i_stpo = t_stpo
              EXCEPTIONS
                error  = 1
                OTHERS = 2.
          ENDIF.
          IF sy-subrc NE 0.
            CALL FUNCTION 'MESSAGE_TEXT_BUILD'
              EXPORTING
                msgid               = sy-msgid
                msgnr               = sy-msgno
                msgv1               = sy-msgv1
                msgv2               = sy-msgv2
                msgv3               = sy-msgv3
                msgv4               = sy-msgv4
              IMPORTING
                message_text_output = lv_zmessage.
            IF '项目' CO lv_zmessage.
              IF '不存在' CO lv_zmessage.
                CONTINUE.
              ENDIF.
            ELSE.
              it_plm007-zmessage = |{ it_plm007-zmessage }{ lv_zmessage }|.
              it_plm007-ztype = 'E'.
              ROLLBACK WORK.
              EXIT.
            ENDIF.


          ELSE.
            CALL FUNCTION 'MESSAGE_TEXT_BUILD'
              EXPORTING
                msgid               = sy-msgid
                msgnr               = sy-msgno
                msgv1               = sy-msgv1
                msgv2               = sy-msgv2
                msgv3               = sy-msgv3
                msgv4               = sy-msgv4
              IMPORTING
                message_text_output = lv_zmessage.
            IF lv_str1 CO lv_zmessage.
            ELSE.
              it_plm007-zmessage = |{ it_plm007-zmessage }{ lv_zmessage }|.
            ENDIF.

          ENDIF.
          CLEAR: lv_zmessage,t_stpo.
        ENDLOOP.

        DELETE t_stpo[] WHERE change_no EQ ''.
        LOOP AT t_stpo2 WHERE change_no NE ''.
*          READ TABLE t_stpo WITH KEY item_no = t_stpo2-item_no
*                                     item_categ = t_stpo2-item_categ
*                                     component = t_stpo2-component.
*          IF sy-subrc EQ 0.
*            IF t_stpo-change_no NE ''.
*              CONTINUE.
**              t_stpo2-change_no = t_stpo-change_no.
*            ENDIF.
*          ENDIF.
          CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
            EXPORTING
              input  = t_stpo2-component
            IMPORTING
              output = t_stpo2-component.
          IF lv_abap_sm59 IS NOT INITIAL.
            CALL FUNCTION 'CSAP_BOM_ITEM_MAINTAIN' "维护BOM
              DESTINATION lv_abap_sm59
              EXPORTING
                i_stpo = t_stpo2
              EXCEPTIONS
                error  = 1
                OTHERS = 2.
          ELSE.
            CALL FUNCTION 'CSAP_BOM_ITEM_MAINTAIN' "维护BOM
              EXPORTING
                i_stpo = t_stpo2
              EXCEPTIONS
                error  = 1
                OTHERS = 2.
          ENDIF.
          IF t_stpo2-rel_cost EQ ''.
*            MOVE-CORRESPONDING t_stpo2 TO t_stpo3.
*            APPEND t_stpo3 TO t_stpo3[].
*            CLEAR t_stpo3.
          ENDIF.

          IF sy-subrc NE 0.
            CALL FUNCTION 'MESSAGE_TEXT_BUILD'
              EXPORTING
                msgid               = sy-msgid
                msgnr               = sy-msgno
                msgv1               = sy-msgv1
                msgv2               = sy-msgv2
                msgv3               = sy-msgv3
                msgv4               = sy-msgv4
              IMPORTING
                message_text_output = lv_zmessage.
            IF '项目' CO lv_zmessage.
              IF '不存在' CO lv_zmessage.
                CONTINUE.
              ENDIF.
            ELSE.
              it_plm007-zmessage = |{ it_plm007-zmessage }{ lv_zmessage }|.
              it_plm007-ztype = 'E'.
              ROLLBACK WORK.
              EXIT.
            ENDIF.
          ELSE.
            CALL FUNCTION 'MESSAGE_TEXT_BUILD'
              EXPORTING
                msgid               = sy-msgid
                msgnr               = sy-msgno
                msgv1               = sy-msgv1
                msgv2               = sy-msgv2
                msgv3               = sy-msgv3
                msgv4               = sy-msgv4
              IMPORTING
                message_text_output = lv_zmessage.
            IF lv_str1 CO lv_zmessage.
            ELSE.
              it_plm007-zmessage = |{ it_plm007-zmessage }{ lv_zmessage }|.
            ENDIF.
          ENDIF.
          CLEAR: lv_zmessage,t_stpo2.
        ENDLOOP.




        CALL FUNCTION 'MESSAGE_TEXT_BUILD'
          EXPORTING
            msgid               = sy-msgid
            msgnr               = sy-msgno
            msgv1               = sy-msgv1
            msgv2               = sy-msgv2
            msgv3               = sy-msgv3
            msgv4               = sy-msgv4
          IMPORTING
            message_text_output = l_return.
        it_plm007-zmessage = |{ it_plm007-zmessage }{ l_return }|.

        IF lv_abap_sm59 IS NOT INITIAL.
          CALL FUNCTION 'CSAP_MAT_BOM_CLOSE' "关闭BOM
            DESTINATION lv_abap_sm59
            EXCEPTIONS
              error  = 1
              OTHERS = 2.
        ELSE.
          CALL FUNCTION 'CSAP_MAT_BOM_CLOSE' "关闭BOM
            EXCEPTIONS
              error  = 1
              OTHERS = 2.
        ENDIF.

        IF sy-subrc = 0.
          IF it_plm007-ztype NE 'E'.
            it_plm007-ztype = 'S'.
          ENDIF.
          it_plm007-zmessage = it_plm007-zmessage && '已关闭BOM'.
*            UPDATE ZBOM SET STATUS = 'S' WHERE MATNR = GS_ITAB-MATNR AND WERKS = GS_ITAB-WERKS.
*          COMMIT WORK AND WAIT.
        ENDIF.



*第二次修改,不带ECN的修改项
        date = it_plm007-datuv.
        CLEAR: t_stpo , t_stpo[].
        IF lv_abap_sm59 IS NOT INITIAL.
          CALL FUNCTION 'CSAP_MAT_BOM_OPEN'
            DESTINATION lv_abap_sm59
            EXPORTING
              material    = it_plm007-matnr
              plant       = it_plm007-werks
              bom_usage   = it_plm007-stlan
              alternative = it_plm007-stlal "'01'
*             change_no   = it_plm007-aennrt
              valid_from  = date
            TABLES
              t_stpo      = t_stpo[]
            EXCEPTIONS
              error       = 1
              OTHERS      = 2.
        ELSE.
          CALL FUNCTION 'CSAP_MAT_BOM_OPEN'
            EXPORTING
              material    = it_plm007-matnr
              plant       = it_plm007-werks
              bom_usage   = it_plm007-stlan
              alternative = it_plm007-stlal "'01'
*             change_no   = it_plm007-aennrt
              valid_from  = date
            TABLES
              t_stpo      = t_stpo[]
            EXCEPTIONS
              error       = 1
              OTHERS      = 2.
        ENDIF.
        DELETE t_stpo[] WHERE valid_to LE date.
        LOOP AT t_stpo ASSIGNING FIELD-SYMBOL(<ls_stpo3>).
          CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
            EXPORTING
              input  = <ls_stpo3>-component
            IMPORTING
              output = <ls_stpo3>-component.
        ENDLOOP.

        LOOP AT t_stpo.
*          READ TABLE t_stpo2 WITH KEY item_no = t_stpo-item_no
*                                      item_categ = t_stpo-item_categ
*                                      component = t_stpo-component.
*          IF sy-subrc EQ 0.
*            IF t_stpo2-change_no EQ ''.
*              CONTINUE.
*            ENDIF.
**          ELSE.
**            CONTINUE.
*          ENDIF.

          CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
            EXPORTING
              input  = t_stpo-component
            IMPORTING
              output = t_stpo-component.
          t_stpo-fldelete = 'X'.
          IF t_stpo-change_no NE ''.
            t_stpo-fldelete = ''.
            READ TABLE t_stpo2 WITH KEY item_no = t_stpo-item_no
                                        item_categ = t_stpo-item_categ
                                        component = t_stpo-component.
            IF sy-subrc EQ 0.
              IF t_stpo2-change_no NE ''.
                CLEAR t_stpo.
                CONTINUE.
              ENDIF.
*              CONTINUE.
*              t_stpo2-change_no = t_stpo-change_no.
*              t_stpo2-itm_ident = t_stpo-itm_ident.
*              t_stpo2-item_guid = t_stpo-item_guid.

              t_stpo-item_text1        = t_stpo2-item_text1. "BOM项目文本1
              t_stpo-item_text2        = t_stpo2-item_text2. "BOM项目文本2
              t_stpo-comp_qty          = t_stpo2-comp_qty. "组件数量
              t_stpo-comp_scrap        = t_stpo2-comp_scrap. "组件报废百分比
              t_stpo-mat_provis        = t_stpo2-mat_provis."物料供应标识符
              t_stpo-ai_strateg        = t_stpo2-ai_strateg. "替代项目:策略
              t_stpo-ai_prio           = t_stpo2-ai_prio. "替代项目:评比定单
              t_stpo-ai_group          = t_stpo2-ai_group. "替代项目:组
              t_stpo-usage_prob        = t_stpo2-usage_prob. "使用可能性按%
              t_stpo-follow_grp        = t_stpo2-follow_grp. "后继组
              t_stpo-discon_grp        = t_stpo2-discon_grp. "中止组
*              MOVE-CORRESPONDING t_stpo2 TO t_stpo.
            ELSE.
              t_stpo-fldelete = 'X'.
            ENDIF.
          ENDIF.
          IF lv_abap_sm59 IS NOT INITIAL.
            CALL FUNCTION 'CSAP_BOM_ITEM_MAINTAIN' "维护BOM
              DESTINATION lv_abap_sm59
              EXPORTING
                i_stpo = t_stpo
              EXCEPTIONS
                error  = 1
                OTHERS = 2.
          ELSE.
            CALL FUNCTION 'CSAP_BOM_ITEM_MAINTAIN' "维护BOM
              EXPORTING
                i_stpo = t_stpo
              EXCEPTIONS
                error  = 1
                OTHERS = 2.
          ENDIF.
          IF sy-subrc NE 0.
            CALL FUNCTION 'MESSAGE_TEXT_BUILD'
              EXPORTING
                msgid               = sy-msgid
                msgnr               = sy-msgno
                msgv1               = sy-msgv1
                msgv2               = sy-msgv2
                msgv3               = sy-msgv3
                msgv4               = sy-msgv4
              IMPORTING
                message_text_output = lv_zmessage.

            IF '项目' CO lv_zmessage.
              IF '不存在' CO lv_zmessage.
                CONTINUE.
              ENDIF.
            ELSE.
              it_plm007-zmessage = |{ it_plm007-zmessage }{ lv_zmessage }|.
              it_plm007-ztype = 'E'.
              ROLLBACK WORK.
              EXIT.
            ENDIF.
          ELSE.
            CALL FUNCTION 'MESSAGE_TEXT_BUILD'
              EXPORTING
                msgid               = sy-msgid
                msgnr               = sy-msgno
                msgv1               = sy-msgv1
                msgv2               = sy-msgv2
                msgv3               = sy-msgv3
                msgv4               = sy-msgv4
              IMPORTING
                message_text_output = lv_zmessage.
            IF lv_str1 CO lv_zmessage.
            ELSE.
              it_plm007-zmessage = |{ it_plm007-zmessage }{ lv_zmessage }|.
            ENDIF.

          ENDIF.
          CLEAR: lv_zmessage,t_stpo.
        ENDLOOP.

        DELETE t_stpo[] WHERE change_no EQ ''.
        LOOP AT t_stpo2 WHERE change_no EQ ''.
          READ TABLE t_stpo WITH KEY item_no = t_stpo2-item_no
                                     item_categ = t_stpo2-item_categ
                                     component = t_stpo2-component.
          IF sy-subrc EQ 0.
            IF t_stpo-change_no NE ''.
              CONTINUE.
*              t_stpo2-change_no = t_stpo-change_no.
            ENDIF.
          ENDIF.
          CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
            EXPORTING
              input  = t_stpo2-component
            IMPORTING
              output = t_stpo2-component.
          IF lv_abap_sm59 IS NOT INITIAL.
            CALL FUNCTION 'CSAP_BOM_ITEM_MAINTAIN' "维护BOM
              DESTINATION lv_abap_sm59
              EXPORTING
                i_stpo = t_stpo2
              EXCEPTIONS
                error  = 1
                OTHERS = 2.
          ELSE.
            CALL FUNCTION 'CSAP_BOM_ITEM_MAINTAIN' "维护BOM
              EXPORTING
                i_stpo = t_stpo2
              EXCEPTIONS
                error  = 1
                OTHERS = 2.
          ENDIF.
          IF t_stpo2-rel_cost EQ ''.
*            MOVE-CORRESPONDING t_stpo2 TO t_stpo3.
*            APPEND t_stpo3 TO t_stpo3[].
*            CLEAR t_stpo3.
          ENDIF.

          IF sy-subrc NE 0.
            CALL FUNCTION 'MESSAGE_TEXT_BUILD'
              EXPORTING
                msgid               = sy-msgid
                msgnr               = sy-msgno
                msgv1               = sy-msgv1
                msgv2               = sy-msgv2
                msgv3               = sy-msgv3
                msgv4               = sy-msgv4
              IMPORTING
                message_text_output = lv_zmessage.
            it_plm007-zmessage = |{ it_plm007-zmessage }{ lv_zmessage }|.
            it_plm007-ztype = 'E'.
            MODIFY it_plm007.
            ROLLBACK WORK.
            EXIT.
          ELSE.
            CALL FUNCTION 'MESSAGE_TEXT_BUILD'
              EXPORTING
                msgid               = sy-msgid
                msgnr               = sy-msgno
                msgv1               = sy-msgv1
                msgv2               = sy-msgv2
                msgv3               = sy-msgv3
                msgv4               = sy-msgv4
              IMPORTING
                message_text_output = lv_zmessage.
            IF lv_str1 CO lv_zmessage.
            ELSE.
              it_plm007-zmessage = |{ it_plm007-zmessage }{ lv_zmessage }|.
            ENDIF.
          ENDIF.
          CLEAR: lv_zmessage,t_stpo2.
        ENDLOOP.

        CALL FUNCTION 'MESSAGE_TEXT_BUILD'
          EXPORTING
            msgid               = sy-msgid
            msgnr               = sy-msgno
            msgv1               = sy-msgv1
            msgv2               = sy-msgv2
            msgv3               = sy-msgv3
            msgv4               = sy-msgv4
          IMPORTING
            message_text_output = l_return.
        it_plm007-zmessage = |{ it_plm007-zmessage }{ l_return }|.

        IF lv_abap_sm59 IS NOT INITIAL.
          CALL FUNCTION 'CSAP_MAT_BOM_CLOSE' "关闭BOM
            DESTINATION lv_abap_sm59
            EXCEPTIONS
              error  = 1
              OTHERS = 2.
        ELSE.
          CALL FUNCTION 'CSAP_MAT_BOM_CLOSE' "关闭BOM
            EXCEPTIONS
              error  = 1
              OTHERS = 2.
        ENDIF.
        CLEAR: ls_stko,ls_csap_mbom.
        ls_stko-base_quan = it_plm007-bmeng.
        ls_stko-base_unit = it_plm007-base_unit.
        ls_stko-bom_status = it_plm007-stlst.
        ls_stko-alt_text = it_plm007-stktx."alt_text.
        ls_stko-laboratory = it_plm007-laboratory.
        ls_stko-delete_ind = it_plm007-delete_ind.
        ls_stko-bom_text = it_plm007-bom_text.
        ls_stko-bom_group = it_plm007-bom_group.
        ls_stko-auth_group = it_plm007-auth_group.
        ls_stko-cad_ind = it_plm007-cad_ind.
*        ls_stko-id_guid = it_plm007-id_guid.
        ls_csap_mbom-matnr = it_plm007-matnr.
        ls_csap_mbom-werks = it_plm007-werks.
        ls_csap_mbom-stlan = it_plm007-stlan.
        ls_csap_mbom-stlal = it_plm007-stlal.
        ls_csap_mbom-datuv = it_plm007-datuv.
*        ls_csap_mbom-datub = it_plm007-datub.
        ls_csap_mbom-aennr = it_plm007-aennrt.
        ls_csap_mbom-revlv = it_plm007-revlv.

        IF lv_abap_sm59 IS NOT INITIAL.
*          IF t_stpo3[] IS NOT INITIAL.
*            CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
*              DESTINATION lv_abap_sm59
*              EXPORTING
*                material    = ls_csap_mbom-matnr
*                plant       = ls_csap_mbom-werks
*                bom_usage   = ls_csap_mbom-stlan
*                alternative = ls_csap_mbom-stlal
*                valid_from  = ls_csap_mbom-datuv
*                change_no   = ls_csap_mbom-aennr
*                i_stko      = ls_stko
*              IMPORTING
*                fl_warning  = p_message
*                o_stko      = lo_stko
*              TABLES
*                t_stpo      = t_stpo3
*              EXCEPTIONS
*                error       = 1
*                OTHERS      = 2.
*          ELSE.
          CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
            DESTINATION lv_abap_sm59
            EXPORTING
              material    = ls_csap_mbom-matnr
              plant       = ls_csap_mbom-werks
              bom_usage   = ls_csap_mbom-stlan
              alternative = ls_csap_mbom-stlal
              valid_from  = ls_csap_mbom-datuv
              change_no   = ls_csap_mbom-aennr
              i_stko      = ls_stko
            IMPORTING
              fl_warning  = p_message
              o_stko      = lo_stko
            EXCEPTIONS
              error       = 1
              OTHERS      = 2.
*          ENDIF.
        ELSE.
*          IF t_stpo3[] IS NOT INITIAL.
*            CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
*              EXPORTING
*                material    = ls_csap_mbom-matnr
*                plant       = ls_csap_mbom-werks
*                bom_usage   = ls_csap_mbom-stlan
*                alternative = ls_csap_mbom-stlal
*                valid_from  = ls_csap_mbom-datuv
*                change_no   = ls_csap_mbom-aennr
*                i_stko      = ls_stko
*              IMPORTING
*                fl_warning  = p_message
*                o_stko      = lo_stko
*              TABLES
*                t_stpo      = t_stpo3
*              EXCEPTIONS
*                error       = 1
*                OTHERS      = 2.
*          ELSE.
          CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
            EXPORTING
              material    = ls_csap_mbom-matnr
              plant       = ls_csap_mbom-werks
              bom_usage   = ls_csap_mbom-stlan
              alternative = ls_csap_mbom-stlal
              valid_from  = ls_csap_mbom-datuv
              change_no   = ls_csap_mbom-aennr
              i_stko      = ls_stko
            IMPORTING
              fl_warning  = p_message
              o_stko      = lo_stko
*            TABLES
*             t_stpo      = t_stpo3
            EXCEPTIONS
              error       = 1
              OTHERS      = 2.
*          ENDIF.
        ENDIF.
        IF sy-subrc EQ 0.
          COMMIT WORK AND WAIT.
          IF it_plm007-ztype NE 'E'.
            it_plm007-ztype = 'S'.
          ENDIF.
        ELSE.
          ROLLBACK WORK.
          it_plm007-ztype = 'E'.
        ENDIF.
      ENDIF.
    ENDIF.

    IF lv_ztype EQ 'S'.
*已存在BOM,且未激活(BOM状态为2),则修改,不需要填写ECN
      IF lv_begin EQ 'X'.
        date = it_plm007-datuv.
        CLEAR: t_stpo , t_stpo[].
        IF lv_abap_sm59 IS NOT INITIAL.
          CALL FUNCTION 'CSAP_MAT_BOM_OPEN'
            DESTINATION lv_abap_sm59
            EXPORTING
              material    = it_plm007-matnr
              plant       = it_plm007-werks
              bom_usage   = it_plm007-stlan
              alternative = it_plm007-stlal "'01'
              change_no   = it_plm007-aennrt
              valid_from  = date
            TABLES
              t_stpo      = t_stpo[]
            EXCEPTIONS
              error       = 1
              OTHERS      = 2.
        ELSE.
          CALL FUNCTION 'CSAP_MAT_BOM_OPEN'
            EXPORTING
              material    = it_plm007-matnr
              plant       = it_plm007-werks
              bom_usage   = it_plm007-stlan
              alternative = it_plm007-stlal "'01'
              change_no   = it_plm007-aennrt
              valid_from  = date
            TABLES
              t_stpo      = t_stpo[]
            EXCEPTIONS
              error       = 1
              OTHERS      = 2.
        ENDIF.
        DELETE t_stpo[] WHERE valid_to LE date.
        LOOP AT t_stpo ASSIGNING FIELD-SYMBOL(<ls_stpo2>).
          CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
            EXPORTING
              input  = <ls_stpo2>-component
            IMPORTING
              output = <ls_stpo2>-component.
        ENDLOOP.
        IF t_stpo[] IS INITIAL.
          it_plm007-ztype = 'E'.
          CLEAR: lv_zmessage.
          CALL FUNCTION 'MESSAGE_TEXT_BUILD'
            EXPORTING
              msgid               = sy-msgid
              msgnr               = sy-msgno
              msgv1               = sy-msgv1
              msgv2               = sy-msgv2
              msgv3               = sy-msgv3
              msgv4               = sy-msgv4
            IMPORTING
              message_text_output = lv_zmessage.
          lv_bname = sy-msgv4.
          SELECT SINGLE name_text
            INTO @DATA(lv_name_text2)
            FROM usr21 JOIN v_addr_usr ON usr21~addrnumber EQ v_addr_usr~addrnumber
                                      AND usr21~persnumber EQ v_addr_usr~persnumber
           WHERE usr21~bname EQ @lv_bname.
          it_plm007-zmessage = lv_zmessage && lv_name_text2.
        ENDIF.
      ENDIF.

      t_stpo2-item_no           = |{ it_plm007-posnr ALPHA = IN }|."it_plm007-posnr."'0010'.BOM项目号
      t_stpo2-item_categ          = it_plm007-postp.
      t_stpo2-component         = it_plm007-idnrk.
      CLEAR:lv_potx1,lv_potx2.
      lv_len = strlen( it_plm007-potx1 ).
      IF lv_len <= 40.
        lv_potx1 = it_plm007-potx1.
      ELSE.
        lv_potx1 = it_plm007-potx1+0(40).
        lv_potx2 = it_plm007-potx1+40(40).
      ENDIF.
      t_stpo2-item_text1        = lv_potx1. "BOM项目文本1
      t_stpo2-item_text2        = lv_potx2. "BOM项目文本2
      t_stpo2-comp_qty          = it_plm007-menge. "组件数量
      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
        EXPORTING
          input          = it_plm007-meins
        IMPORTING
          output         = t_stpo2-comp_unit
        EXCEPTIONS
          unit_not_found = 1
          OTHERS         = 2.
      IF t_stpo2-comp_unit CA '**' OR t_stpo2-comp_unit EQ ''.
        t_stpo2-comp_unit = it_plm007-meins.
      ENDIF.
*          t_stpo2-comp_unit         = it_plm007-meins."组件基本计量单位
      t_stpo2-comp_scrap        = it_plm007-ausch. "组件报废百分比
      t_stpo2-mat_provis        = it_plm007-beikz."物料供应标识符
      t_stpo2-ai_strateg        = it_plm007-alpst. "替代项目:策略
      t_stpo2-ai_prio           = it_plm007-alprf. "替代项目:评比定单
      t_stpo2-ai_group          = it_plm007-alpgr. "替代项目:组
      t_stpo2-usage_prob        = it_plm007-ewahr. "使用可能性按%
      t_stpo2-follow_grp        = it_plm007-nfgrp. "后继组
      t_stpo2-discon_grp        = it_plm007-nfeag. "中止组
      READ TABLE lt_t416 INTO DATA(ls_t4162) WITH KEY stlan = it_plm007-stlan BINARY SEARCH.
      IF sy-subrc EQ 0.
        IF ls_t4162-pmpfe EQ '+'."与生产相关项目
          t_stpo2-rel_prod          = 'X'.
        ENDIF.
        IF ls_t4162-pmpko EQ '+'."标识:与工程相关项目
          t_stpo2-rel_engin          = 'X'.
        ENDIF.
        IF ls_t4162-pmpka EQ '+'."标识:与成本核算相关的项目
          t_stpo2-rel_cost          = 'X'.
        ENDIF.
        IF ls_t4162-pmprv EQ '+'."标志: 与销售 & 分销(SD)相关项目
          t_stpo2-rel_sales          = 'X'.
        ENDIF.
*        IF ls_t4162-PMPVS EQ '+'."指示器: 与发货相关项目
*          t_stpo2-rel_prod          = 'X'.
*        ENDIF.
        IF ls_t4162-pmpin EQ '+'."指示器:与工厂维护相关的项目
          t_stpo2-rel_pmaint          = 'X'.
        ENDIF.
        IF ls_t4162-pmper EQ '+'."标识:备件
          t_stpo2-spare_part          = 'X'.
        ENDIF.
      ENDIF.
      t_stpo2-rel_cost          = it_plm007-sanka."成本核算标识相关
*        t_stpo2-CO_PRODUCT = it_plm007-KZKUP1.
*      IF it_plm007-delete_pnr EQ 'X'.
*        t_stpo2-fldelete = 'X'.
*      ENDIF.
      t_stpo2-valid_from        = sy-datum."it_plm007-datuv."it_plm007-datuv. "有效起始日期
      t_stpo2-change_no         = it_plm007-aennr. "更改编号
      APPEND t_stpo2 TO t_stpo2[].
      CLEAR: t_stpo2.
      IF lv_end EQ 'X'.
        LOOP AT t_stpo.
*          READ TABLE t_stpo2 WITH KEY item_no = t_stpo-item_no
*                                      item_categ = t_stpo-item_categ
*                                      component = t_stpo-component.
*          IF sy-subrc EQ 0.
*            IF t_stpo2-change_no EQ ''.
*              CONTINUE.
*            ENDIF.
**          ELSE.
**            CONTINUE.
*          ENDIF.

          CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
            EXPORTING
              input  = t_stpo-component
            IMPORTING
              output = t_stpo-component.
          t_stpo-fldelete = 'X'.
          IF t_stpo-change_no NE ''.
            t_stpo-fldelete = ''.
            READ TABLE t_stpo2 WITH KEY item_no = t_stpo-item_no
                                        item_categ = t_stpo-item_categ
                                        component = t_stpo-component.
            IF sy-subrc EQ 0.
*              CONTINUE.
*              t_stpo2-change_no = t_stpo-change_no.
*              t_stpo2-itm_ident = t_stpo-itm_ident.
*              t_stpo2-item_guid = t_stpo-item_guid.

              t_stpo-item_text1        = t_stpo2-item_text1. "BOM项目文本1
              t_stpo-item_text2        = t_stpo2-item_text2. "BOM项目文本2
              t_stpo-comp_qty          = t_stpo2-comp_qty. "组件数量
              t_stpo-comp_scrap        = t_stpo2-comp_scrap. "组件报废百分比
              t_stpo-mat_provis        = t_stpo2-mat_provis."物料供应标识符
              t_stpo-ai_strateg        = t_stpo2-ai_strateg. "替代项目:策略
              t_stpo-ai_prio           = t_stpo2-ai_prio. "替代项目:评比定单
              t_stpo-ai_group          = t_stpo2-ai_group. "替代项目:组
              t_stpo-usage_prob        = t_stpo2-usage_prob. "使用可能性按%
              t_stpo-follow_grp        = t_stpo2-follow_grp. "后继组
              t_stpo-discon_grp        = t_stpo2-discon_grp. "中止组
*              MOVE-CORRESPONDING t_stpo2 TO t_stpo.
            ELSE.
              t_stpo-fldelete = 'X'.
            ENDIF.
          ENDIF.
          IF lv_abap_sm59 IS NOT INITIAL.
            CALL FUNCTION 'CSAP_BOM_ITEM_MAINTAIN' "维护BOM
              DESTINATION lv_abap_sm59
              EXPORTING
                i_stpo = t_stpo
              EXCEPTIONS
                error  = 1
                OTHERS = 2.
          ELSE.
            CALL FUNCTION 'CSAP_BOM_ITEM_MAINTAIN' "维护BOM
              EXPORTING
                i_stpo = t_stpo
              EXCEPTIONS
                error  = 1
                OTHERS = 2.
          ENDIF.
          IF sy-subrc NE 0.
            CALL FUNCTION 'MESSAGE_TEXT_BUILD'
              EXPORTING
                msgid               = sy-msgid
                msgnr               = sy-msgno
                msgv1               = sy-msgv1
                msgv2               = sy-msgv2
                msgv3               = sy-msgv3
                msgv4               = sy-msgv4
              IMPORTING
                message_text_output = lv_zmessage.

            it_plm007-zmessage = |{ it_plm007-zmessage }{ lv_zmessage }|.
            it_plm007-ztype = 'E'.
            ROLLBACK WORK.
            EXIT.
          ELSE.
            CALL FUNCTION 'MESSAGE_TEXT_BUILD'
              EXPORTING
                msgid               = sy-msgid
                msgnr               = sy-msgno
                msgv1               = sy-msgv1
                msgv2               = sy-msgv2
                msgv3               = sy-msgv3
                msgv4               = sy-msgv4
              IMPORTING
                message_text_output = lv_zmessage.
            IF lv_str1 CO lv_zmessage.
            ELSE.
              it_plm007-zmessage = |{ it_plm007-zmessage }{ lv_zmessage }|.
            ENDIF.

          ENDIF.
          CLEAR: lv_zmessage,t_stpo.
        ENDLOOP.

        DELETE t_stpo[] WHERE change_no EQ ''.
        LOOP AT t_stpo2 .
          READ TABLE t_stpo WITH KEY item_no = t_stpo2-item_no
                                     item_categ = t_stpo2-item_categ
                                     component = t_stpo2-component.
          IF sy-subrc EQ 0.
            IF t_stpo-change_no NE ''.
              CONTINUE.
*              t_stpo2-change_no = t_stpo-change_no.
            ENDIF.
          ENDIF.
          CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
            EXPORTING
              input  = t_stpo2-component
            IMPORTING
              output = t_stpo2-component.
          IF lv_abap_sm59 IS NOT INITIAL.
            CALL FUNCTION 'CSAP_BOM_ITEM_MAINTAIN' "维护BOM
              DESTINATION lv_abap_sm59
              EXPORTING
                i_stpo = t_stpo2
              EXCEPTIONS
                error  = 1
                OTHERS = 2.
          ELSE.
            CALL FUNCTION 'CSAP_BOM_ITEM_MAINTAIN' "维护BOM
              EXPORTING
                i_stpo = t_stpo2
              EXCEPTIONS
                error  = 1
                OTHERS = 2.
          ENDIF.
          IF t_stpo2-rel_cost EQ ''.
*            MOVE-CORRESPONDING t_stpo2 TO t_stpo3.
*            APPEND t_stpo3 TO t_stpo3[].
*            CLEAR t_stpo3.
          ENDIF.

          IF sy-subrc NE 0.
            CALL FUNCTION 'MESSAGE_TEXT_BUILD'
              EXPORTING
                msgid               = sy-msgid
                msgnr               = sy-msgno
                msgv1               = sy-msgv1
                msgv2               = sy-msgv2
                msgv3               = sy-msgv3
                msgv4               = sy-msgv4
              IMPORTING
                message_text_output = lv_zmessage.
            it_plm007-zmessage = |{ it_plm007-zmessage }{ lv_zmessage }|.
            it_plm007-ztype = 'E'.
            MODIFY it_plm007.
            ROLLBACK WORK.
            EXIT.
          ELSE.
            CALL FUNCTION 'MESSAGE_TEXT_BUILD'
              EXPORTING
                msgid               = sy-msgid
                msgnr               = sy-msgno
                msgv1               = sy-msgv1
                msgv2               = sy-msgv2
                msgv3               = sy-msgv3
                msgv4               = sy-msgv4
              IMPORTING
                message_text_output = lv_zmessage.
            IF lv_str1 CO lv_zmessage.
            ELSE.
              it_plm007-zmessage = |{ it_plm007-zmessage }{ lv_zmessage }|.
            ENDIF.
          ENDIF.
          CLEAR: lv_zmessage,t_stpo2.
        ENDLOOP.




        CALL FUNCTION 'MESSAGE_TEXT_BUILD'
          EXPORTING
            msgid               = sy-msgid
            msgnr               = sy-msgno
            msgv1               = sy-msgv1
            msgv2               = sy-msgv2
            msgv3               = sy-msgv3
            msgv4               = sy-msgv4
          IMPORTING
            message_text_output = l_return.
        it_plm007-zmessage = |{ it_plm007-zmessage }{ l_return }|.

        IF lv_abap_sm59 IS NOT INITIAL.
          CALL FUNCTION 'CSAP_MAT_BOM_CLOSE' "关闭BOM
            DESTINATION lv_abap_sm59
            EXCEPTIONS
              error  = 1
              OTHERS = 2.
        ELSE.
          CALL FUNCTION 'CSAP_MAT_BOM_CLOSE' "关闭BOM
            EXCEPTIONS
              error  = 1
              OTHERS = 2.
        ENDIF.

        IF sy-subrc = 0.
          IF it_plm007-ztype NE 'E'.
            it_plm007-ztype = 'S'.
          ENDIF.
          it_plm007-zmessage = it_plm007-zmessage && '已关闭BOM'.
*            UPDATE ZBOM SET STATUS = 'S' WHERE MATNR = GS_ITAB-MATNR AND WERKS = GS_ITAB-WERKS.
*          COMMIT WORK AND WAIT.
        ENDIF.

        CLEAR: ls_stko,ls_csap_mbom.
        ls_stko-base_quan = it_plm007-bmeng.
        ls_stko-base_unit = it_plm007-base_unit.
        ls_stko-bom_status = it_plm007-stlst.
        ls_stko-alt_text = it_plm007-stktx."alt_text.
        ls_stko-laboratory = it_plm007-laboratory.
        ls_stko-delete_ind = it_plm007-delete_ind.
        ls_stko-bom_text = it_plm007-bom_text.
        ls_stko-bom_group = it_plm007-bom_group.
        ls_stko-auth_group = it_plm007-auth_group.
        ls_stko-cad_ind = it_plm007-cad_ind.
*        ls_stko-id_guid = it_plm007-id_guid.
        ls_csap_mbom-matnr = it_plm007-matnr.
        ls_csap_mbom-werks = it_plm007-werks.
        ls_csap_mbom-stlan = it_plm007-stlan.
        ls_csap_mbom-stlal = it_plm007-stlal.
        ls_csap_mbom-datuv = it_plm007-datuv.
*        ls_csap_mbom-datub = it_plm007-datub.
        ls_csap_mbom-aennr = it_plm007-aennrt.
        ls_csap_mbom-revlv = it_plm007-revlv.

        IF lv_abap_sm59 IS NOT INITIAL.
*          IF t_stpo3[] IS NOT INITIAL.
*            CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
*              DESTINATION lv_abap_sm59
*              EXPORTING
*                material    = ls_csap_mbom-matnr
*                plant       = ls_csap_mbom-werks
*                bom_usage   = ls_csap_mbom-stlan
*                alternative = ls_csap_mbom-stlal
*                valid_from  = ls_csap_mbom-datuv
*                change_no   = ls_csap_mbom-aennr
*                i_stko      = ls_stko
*              IMPORTING
*                fl_warning  = p_message
*                o_stko      = lo_stko
*              TABLES
*                t_stpo      = t_stpo3
*              EXCEPTIONS
*                error       = 1
*                OTHERS      = 2.
*          ELSE.
          CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
            DESTINATION lv_abap_sm59
            EXPORTING
              material    = ls_csap_mbom-matnr
              plant       = ls_csap_mbom-werks
              bom_usage   = ls_csap_mbom-stlan
              alternative = ls_csap_mbom-stlal
              valid_from  = ls_csap_mbom-datuv
              change_no   = ls_csap_mbom-aennr
              i_stko      = ls_stko
            IMPORTING
              fl_warning  = p_message
              o_stko      = lo_stko
            EXCEPTIONS
              error       = 1
              OTHERS      = 2.
*          ENDIF.
        ELSE.
*          IF t_stpo3[] IS NOT INITIAL.
*            CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
*              EXPORTING
*                material    = ls_csap_mbom-matnr
*                plant       = ls_csap_mbom-werks
*                bom_usage   = ls_csap_mbom-stlan
*                alternative = ls_csap_mbom-stlal
*                valid_from  = ls_csap_mbom-datuv
*                change_no   = ls_csap_mbom-aennr
*                i_stko      = ls_stko
*              IMPORTING
*                fl_warning  = p_message
*                o_stko      = lo_stko
*              TABLES
*                t_stpo      = t_stpo3
*              EXCEPTIONS
*                error       = 1
*                OTHERS      = 2.
*          ELSE.
          CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
            EXPORTING
              material    = ls_csap_mbom-matnr
              plant       = ls_csap_mbom-werks
              bom_usage   = ls_csap_mbom-stlan
              alternative = ls_csap_mbom-stlal
              valid_from  = ls_csap_mbom-datuv
              change_no   = ls_csap_mbom-aennr
              i_stko      = ls_stko
            IMPORTING
              fl_warning  = p_message
              o_stko      = lo_stko
*            TABLES
*             t_stpo      = t_stpo3
            EXCEPTIONS
              error       = 1
              OTHERS      = 2.
*          ENDIF.
        ENDIF.
        IF sy-subrc EQ 0.
          COMMIT WORK AND WAIT.
          IF it_plm007-ztype NE 'E'.
            it_plm007-ztype = 'S'.
          ENDIF.
        ELSE.
          ROLLBACK WORK.
          it_plm007-ztype = 'E'.
        ENDIF.


      ENDIF.
    ENDIF.

    IF lv_ztype EQ 'C'.
*不存在BOM,则创建
**      IF lv_begin = 'X'.
*
*
*        CLEAR  it_bomgroup.
*        it_bomgroup-bom_group_identification = 'BAPI_SMP_COL1'.
*        it_bomgroup-object_type = 'BGR'.
*        it_bomgroup-object_id = 'SIMPLE1'.
*        it_bomgroup-bom_usage = it_plm007-stlan. "BOM用途
**      it_bomgroup-bom_group = it_plm007-stlan. "BOM分组
*        it_bomgroup-ltxt_lang = sy-langu. "语言
*        it_bomgroup-technical_type = ''. "技术类型
*        it_bomgroup-created_in_plant = it_plm007-werks. "生成BOM 或 可选/变式的工厂
*        it_bomgroup-bom_text = it_plm007-stktx." ''. "BOM文本
*        APPEND it_bomgroup.
*
*        CLEAR it_variants.
*        it_variants-bom_group_identification = 'BAPI_SMP_COL1'.
*        it_variants-object_type = 'BOM'.
*        it_variants-object_id = 'SIMPLE1'.
*        it_variants-alternative_bom = it_plm007-stlal."'01'. "可选的BOM
*        it_variants-bom_status = it_plm007-stlst."'01'. "BOM状态
*        it_variants-base_qty = it_plm007-bmeng. "BOM基本数量
*        CLEAR: lv_meins.
*        SELECT SINGLE meins INTO lv_meins FROM mara WHERE matnr EQ it_plm007-matnr.
*        CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
*          EXPORTING
*            input          = lv_meins
*          IMPORTING
*            output         = it_variants-base_unit
*          EXCEPTIONS
*            unit_not_found = 1
*            OTHERS         = 2.
*        IF it_variants-base_unit CA '**' OR it_variants-base_unit EQ ''.
*          it_variants-base_unit = lv_meins."BOM基本单位
*        ENDIF.
*
**        it_variants-base_unit  = lv_meins. "it_plm007-meins.
*        it_variants-alt_text = it_plm007-stktx. "可选BOM文本
*        it_variants-valid_from_date = it_plm007-datuv. "有效起始日期 AENNR
**        it_variants-change_no = it_plm007-aennr. "更改编号
*        it_variants-function = 'NEW'.
*        APPEND it_variants.
*
*
*      CLEAR it_matrel.
*      it_matrel-bom_group_identification = 'BAPI_SMP_COL1'.
*      it_matrel-material = it_plm007-matnr. "物料编号,18字符
*      it_matrel-plant = it_plm007-werks.
*      it_matrel-bom_usage = it_plm007-stlan. "BOM用途
*      it_matrel-alternative_bom = it_plm007-stlal. "可选的BOM(备选物料清单)
**      it_matrel-alternative_bom = '01'.
*      it_matrel-material_long = it_plm007-matnr.
*      APPEND it_matrel.
*
*      CLEAR it_itemas.
*      it_itemas-bom_group_identification = 'BAPI_SMP_COL1'.
*      it_itemas-sub_object_type = 'ITM'.
*      it_itemas-sub_object_id = 'SIMPLE1'.
*      it_itemas-super_object_type = 'BOM'.
*      it_itemas-super_object_id = 'SIMPLE1'.
*      it_itemas-valid_from_date = it_plm007-datuv.
*      it_itemas-function = 'NEW'.
*      APPEND it_itemas.
*
**      ENDIF.
*
*
*      CLEAR it_items.
*      it_items-bom_group_identification = 'BAPI_SMP_COL1'.
*      it_items-object_type       = 'ITM'.
*      it_items-object_id         = 'SIMPLE1'.
*      it_items-item_no           = |{ it_plm007-posnr ALPHA = IN }|."'0010'.BOM项目号
*      it_items-item_cat          = it_plm007-postp.
*      it_items-component         = it_plm007-idnrk.
*      CLEAR:lv_potx1,lv_potx2.
*      lv_len = strlen( it_plm007-potx1 ).
*      IF lv_len <= 40.
*        lv_potx1 = it_plm007-potx1.
*      ELSE.
*        lv_potx1 = it_plm007-potx1+0(40).
*        lv_potx2 = it_plm007-potx1+40(40).
*      ENDIF.
*      it_items-item_text1        = lv_potx1. "BOM项目文本1
*      it_items-item_text2        = lv_potx2. "BOM项目文本2
*      it_items-comp_qty          = it_plm007-menge. "组件数量
*      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
*        EXPORTING
*          input          = it_plm007-meins
*        IMPORTING
*          output         = it_items-comp_unit
*        EXCEPTIONS
*          unit_not_found = 1
*          OTHERS         = 2.
*      IF it_items-comp_unit CA '**'.
*        it_items-comp_unit = it_plm007-meins."BOM基本单位
*      ENDIF.
**      it_items-comp_unit         = it_plm007-meins."组件基本计量单位
*      it_items-comp_scrap        = it_plm007-ausch. "组件报废百分比
*      it_items-mat_provision     = it_plm007-beikz."物料供应标识符
*      it_items-alt_item_strategy = it_plm007-alpst. "替代项目:策略
*      it_items-alt_item_prio     = it_plm007-alprf. "替代项目:评比定单
*      it_items-alt_item_group    = it_plm007-alpgr. "替代项目:组
*      it_items-usage_prob        = it_plm007-ewahr. "使用可能性按%
*      it_items-follow_up_group   = it_plm007-nfgrp. "后继组
*      it_items-discon_group      = it_plm007-nfeag. "中止组
*      READ TABLE lt_t416 INTO DATA(ls_t4164) WITH KEY stlan = it_plm007-stlan BINARY SEARCH.
*      IF sy-subrc EQ 0.
*        IF ls_t4164-pmpfe EQ '+'."与生产相关项目
*          it_items-prod_rel          = 'X'.
*        ENDIF.
*        IF ls_t4164-pmpko EQ '+'."标识:与工程相关项目
*          it_items-eng_rel          = 'X'.
*        ENDIF.
*        IF ls_t4164-pmpka EQ '+'."标识:与成本核算相关的项目
*          it_items-cost_rel          = 'X'.
*        ENDIF.
*        IF ls_t4164-pmprv EQ '+'."标志: 与销售 & 分销(SD)相关项目
*          it_items-sales_rel          = 'X'.
*        ENDIF.
**        IF ls_t416-PMPVS EQ '+'."指示器: 与发货相关项目
**          it_items-rel_prod          = 'X'.
**        ENDIF.
*        IF ls_t4164-pmpin EQ '+'."指示器:与工厂维护相关的项目
*          it_items-pm_rel          = 'X'.
*        ENDIF.
*        IF ls_t4164-pmper EQ '+'."标识:备件
*          it_items-spare_part          = 'X'.
*        ENDIF.
*      ENDIF.
*
**      t_stpo2-rel_cost          = it_plm007-sanka."成本核算标识相关
*      it_items-cost_rel          = it_plm007-sanka."成本核算标识相关
**        IT_ITEMS-CO_PRODUCT = it_plm007-KZKUP1.
*      it_items-valid_from_date   = it_plm007-datuv. "有效起始日期
**      it_items-change_no = it_plm007-aennr. "更改编号
*      APPEND it_items.
*
*
*
*      IF lv_end EQ 'X'.
*        CALL FUNCTION 'BAPI_MATERIAL_BOM_GROUP_CREATE'
*          EXPORTING
**           TESTRUN           = ' '
*            all_error         = 'X'
*          TABLES
*            bomgroup          = it_bomgroup
*            variants          = it_variants
*            items             = it_items
**           subitems          =
*            materialrelations = it_matrel
*            itemassignments   = it_itemas
**           subitemassignments =
**           texts             =
*            return            = it_return.
*        READ TABLE it_return WITH KEY type = 'E'.
*        IF sy-subrc EQ 0.
*          it_plm007-ztype = 'E'.
*          ROLLBACK WORK.
*        ELSE.
*          READ TABLE it_return WITH KEY type = 'A'.
*          IF sy-subrc EQ 0.
*            it_plm007-ztype = 'E'.
*            ROLLBACK WORK.
*          ELSE.
*            it_plm007-ztype = 'S'.
*            COMMIT WORK AND WAIT.
*          ENDIF.
*        ENDIF.
*        LOOP AT it_return.
*          it_plm007-zmessage = |{ it_plm007-zmessage }{ it_return-message }|.
*        ENDLOOP.
**        MOVE-CORRESPONDING it_plm007 TO it_re_007.
**        APPEND it_re_007.
*        CLEAR: it_return[],it_itemas[],it_matrel[],it_items[],it_variants[],it_bomgroup[].
*      ENDIF.
      IF lv_begin EQ 'X'.
*        MOVE-CORRESPONDING it_plm007 TO ls_header.
        ls_header-matnr = it_plm007-matnr.
        ls_header-datuv = it_plm007-datuv.
        ls_header-werks = it_plm007-werks.
        ls_header-stlan = it_plm007-stlan.

        ls_stko-base_quan = it_plm007-bmeng."基准数量
        ls_stko-bom_status = it_plm007-stlst."BOM状态
        ls_stko-bom_text = it_plm007-bom_text."BOM文本
        CLEAR: lv_meins.
        SELECT SINGLE meins INTO lv_meins FROM mara WHERE matnr EQ it_plm007-matnr.
        CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
          EXPORTING
            input          = lv_meins
          IMPORTING
            output         = ls_stko-base_unit
          EXCEPTIONS
            unit_not_found = 1
            OTHERS         = 2.
        IF ls_stko-base_unit CA '**' OR ls_stko-base_unit EQ ''.
          ls_stko-base_unit = lv_meins."BOM基本单位
        ENDIF.

      ENDIF.
      CLEAR ls_stpo.
*      ls_stpo-bom_group_identification = 'BAPI_SMP_COL1'.
*      ls_stpo-object_type       = 'ITM'.
*      ls_stpo-object_id         = 'SIMPLE1'.
      ls_stpo-item_no           = |{ it_plm007-posnr ALPHA = IN }|."'0010'.BOM项目号
      ls_stpo-item_categ          = it_plm007-postp.
      ls_stpo-component         = it_plm007-idnrk.
      CLEAR:lv_potx1,lv_potx2.
      lv_len = strlen( it_plm007-potx1 ).
      IF lv_len <= 40.
        lv_potx1 = it_plm007-potx1.
      ELSE.
        lv_potx1 = it_plm007-potx1+0(40).
        lv_potx2 = it_plm007-potx1+40(40).
      ENDIF.
      ls_stpo-item_text1        = lv_potx1. "BOM项目文本1
      ls_stpo-item_text2        = lv_potx2. "BOM项目文本2
      ls_stpo-comp_qty          = it_plm007-menge. "组件数量
      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
        EXPORTING
          input          = it_plm007-meins
        IMPORTING
          output         = ls_stpo-comp_unit
        EXCEPTIONS
          unit_not_found = 1
          OTHERS         = 2.
      IF ls_stpo-comp_unit CA '**'.
        ls_stpo-comp_unit = it_plm007-meins."BOM基本单位
      ENDIF.
*      ls_stpo-comp_unit         = it_plm007-meins."组件基本计量单位
      ls_stpo-comp_scrap        = it_plm007-ausch. "组件报废百分比
      ls_stpo-mat_provis        = it_plm007-beikz."物料供应标识符
      ls_stpo-ai_strateg        = it_plm007-alpst. "替代项目:策略
      ls_stpo-ai_prio           = it_plm007-alprf. "替代项目:评比定单
      ls_stpo-ai_group          = it_plm007-alpgr. "替代项目:组
      ls_stpo-usage_prob        = it_plm007-ewahr. "使用可能性按%
      ls_stpo-follow_grp        = it_plm007-nfgrp. "后继组
      ls_stpo-discon_grp        = it_plm007-nfeag. "中止组
      READ TABLE lt_t416 INTO DATA(ls_t4164) WITH KEY stlan = it_plm007-stlan BINARY SEARCH.
      IF sy-subrc EQ 0.
        IF ls_t4164-pmpfe EQ '+'."与生产相关项目
          ls_stpo-rel_prod          = 'X'.
        ENDIF.
        IF ls_t4164-pmpko EQ '+'."标识:与工程相关项目
          ls_stpo-rel_engin          = 'X'.
        ENDIF.
        IF ls_t4164-pmpka EQ '+'."标识:与成本核算相关的项目
          ls_stpo-rel_cost          = 'X'.
        ENDIF.
        IF ls_t4164-pmprv EQ '+'."标志: 与销售 & 分销(SD)相关项目
          ls_stpo-rel_sales          = 'X'.
        ENDIF.
*        IF ls_t416-PMPVS EQ '+'."指示器: 与发货相关项目
*          ls_stpo-rel_prod          = 'X'.
*        ENDIF.
        IF ls_t4164-pmpin EQ '+'."指示器:与工厂维护相关的项目
          ls_stpo-rel_pmaint          = 'X'.
        ENDIF.
        IF ls_t4164-pmper EQ '+'."标识:备件
          ls_stpo-spare_part          = 'X'.
        ENDIF.
      ENDIF.

*      t_stpo2-rel_cost          = it_plm007-sanka."成本核算标识相关
      ls_stpo-rel_cost          = it_plm007-sanka."成本核算标识相关
*        ls_stpo-CO_PRODUCT = it_plm007-KZKUP1.
      ls_stpo-valid_from        = it_plm007-datuv. "有效起始日期
*      ls_stpo-change_no = it_plm007-aennr. "更改编号
      APPEND ls_stpo TO lt_stpo[].
      IF lv_end EQ 'X'.
*        BREAK it0003.
*        IF sy-tcode eq 'ZIT0010'.
*          BREAK IT0003.
*        ENDIF.
        IF lv_abap_sm59 IS NOT INITIAL.
          CALL FUNCTION 'CSAP_MAT_BOM_CREATE'
            DESTINATION lv_abap_sm59
            EXPORTING
              material          = ls_header-matnr
              plant             = ls_header-werks
              bom_usage         = ls_header-stlan
              valid_from        = ls_header-datuv
              i_stko            = ls_stko
              fl_default_values = 'X'
            TABLES
              t_stpo            = lt_stpo
            EXCEPTIONS
              error             = 1
              OTHERS            = 2.
          IF sy-subrc EQ 0.
            it_plm007-ztype = 'S'.
            COMMIT WORK AND WAIT.
          ELSE.
            it_plm007-ztype = 'E'.
            ROLLBACK WORK.
          ENDIF.
        ELSE.
          CALL FUNCTION 'CSAP_MAT_BOM_CREATE'
            EXPORTING
              material          = ls_header-matnr
              plant             = ls_header-werks
              bom_usage         = ls_header-stlan
              valid_from        = ls_header-datuv
              i_stko            = ls_stko
              fl_default_values = 'X'
            TABLES
              t_stpo            = lt_stpo
            EXCEPTIONS
              error             = 1
              OTHERS            = 2.
          IF sy-subrc EQ 0.
            it_plm007-ztype = 'S'.
            COMMIT WORK AND WAIT.
          ELSE.
            it_plm007-ztype = 'E'.
            ROLLBACK WORK.
          ENDIF.
        ENDIF.

        CLEAR: lv_zmessage.
        CALL FUNCTION 'MESSAGE_TEXT_BUILD'
          EXPORTING
            msgid               = sy-msgid
            msgnr               = sy-msgno
            msgv1               = sy-msgv1
            msgv2               = sy-msgv2
            msgv3               = sy-msgv3
            msgv4               = sy-msgv4
          IMPORTING
            message_text_output = lv_zmessage.
        IF lv_str1 CO lv_zmessage.
        ELSE.
          it_plm007-zmessage = |{ it_plm007-zmessage }{ lv_zmessage }|.
        ENDIF.
*      CLEAR: lv_zmessage.
        CLEAR: ls_header,ls_stko,lt_stpo[].
      ENDIF.
    ENDIF.
    MODIFY it_plm007.
    CLEAR: it_plm007.
  ENDLOOP.

  DELETE it_plm007[] WHERE ztype EQ ''.


ENDFUNCTION.
View Code
 修改的做法:

  1)没有ECN:打开BOM后,先删除原本所有的行项目,再新增。再保存关闭BOM。有使用ABAP链接(SM59创建)

  2)有ECN:打开BOM后,先删除不存在的行项目,再改ECN为空的,关闭BOM后,再打开BOM,再改有ECN的。

  创建:直接创建

 

posted @ 2021-08-31 08:27  蛀牙首领  阅读(780)  评论(0编辑  收藏  举报