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.
修改的做法:
1)没有ECN:打开BOM后,先删除原本所有的行项目,再新增。再保存关闭BOM。有使用ABAP链接(SM59创建)
2)有ECN:打开BOM后,先删除不存在的行项目,再改ECN为空的,关闭BOM后,再打开BOM,再改有ECN的。
创建:直接创建
分类:
接口
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」