当前位置: 首页 > article >正文

SAP PP ECN CSAP_MAT_BOM_MAINTAIN

刚开始的时候ECN总是加不上,

参考kimi给出的案例

点击链接查看和 Kimi 智能助手的对话 https://kimi.moonshot.cn/share/cth1ipmqvl7f04qkggdg

效果 加上了

FUNCTION ZPBOM_PLM2SAP.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  EXPORTING
*"     VALUE(OUTPUT) TYPE  ZSM8_SALESORDER_CREATE_OUTPUT
*"  TABLES
*"      INPUT_PBOM STRUCTURE  ZPBOM
*"      OUTPUT_MESSAGE STRUCTURE  ZMAT_MESSAGE
*"----------------------------------------------------------------------
*  新增 input_bom
*  修改 input_bom
*  删除 ECN  日期

  TABLES: MAST,STPO,STKO,STPU.
  DATA: TEMP_MAT     TYPE MATNR,
        TEMP_WERKS   TYPE WERKS_D,
        TEMP_STLNR   LIKE MAST-STLNR, "物料单号(bom号)
        RETURN(220)  TYPE C,
        ISFIND(1)    TYPE C,
        FROMDATE(10) TYPE C.
  DATA:TEMP_MATNR TYPE MATNR.
  DATA: BEGIN OF ZLOG,
          MATNR             TYPE MATNR,
          WERKS             TYPE WERKS_D,
          INTERFACENAME(60) TYPE C,
          LOGDATE           TYPE DATUM,
          LOGTIME           TYPE UZEIT,
          MAKTX             TYPE MAKTX,
          MEINS             TYPE MEINS,
          MBRSH             TYPE MBRSH,
          LVORM             TYPE LVORM,
          MTART             TYPE MTART,
          SPART             TYPE SPART,
          MATKL             TYPE MATKL,
          BISMT             TYPE BISMT,
          LGFSB             TYPE LGFSB,
          EORIGINNO(40)     TYPE C,
          CREATER(20)       TYPE C,
          MESSAGETYPE(1)    TYPE C,
          MESSAGE(220)      TYPE C,
        END OF ZLOG.

  DATA: BEGIN OF SUBMATNR_COUNT,"用于记录在同一层级下相同子物料,相同数量,出现的次数。
          SUBMATNR TYPE MATNR,
          MENGE    TYPE KMPMG,
          COUNT    TYPE I,
        END OF SUBMATNR_COUNT.

  DATA:SAP_SUBMATNR_COUNT LIKE SUBMATNR_COUNT,
       PLM_SUBMATNR_COUNT LIKE SUBMATNR_COUNT.

  DATA: NO1 TYPE I,
        NO2 TYPE I.

  DATA:I_STKO LIKE STKO_API01.

  DATA:BEGIN OF GS_INPUTPBOM,
         MATNR   TYPE MATNR,
         WERKS   TYPE WERKS_D,
         IDNRK   TYPE IDNRK,
         KMPMG   TYPE KMPMG,
         XUHAO   TYPE I,
         MEINS   TYPE MEINS,
         SORTP   TYPE SORTP,
         LOGDATE TYPE DATUM,
         LOGTIME TYPE UZEIT,
       END OF GS_INPUTPBOM.

  DATA:GT_STPO_INPUT LIKE TABLE OF STPO_API03 WITH HEADER LINE.

  DATA: SAP_STPO LIKE TABLE OF STPO WITH HEADER LINE.
  DATA: PDATAV LIKE  CSAP_MBOM-DATUV.

*1. 根据父物料字段,对输入BOM表排序:
  SORT INPUT_PBOM BY STLAN WERKS MATNR IDNRK KMPMG.

*2.将plm的bom格式转化为SAP能处理的单层bom,并处理(行项目新建或修改和删除的处理)

  CLEAR TEMP_MAT.
  CLEAR TEMP_WERKS.
  I_STKO-BASE_QUAN = 1.
  I_STKO-BOM_STATUS = '01'.

  LOOP AT INPUT_PBOM.
    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        INPUT  = INPUT_PBOM-MATNR
      IMPORTING
        OUTPUT = INPUT_PBOM-MATNR.

    TRANSLATE INPUT_PBOM-MATNR TO UPPER CASE.

*    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        INPUT  = INPUT_PBOM-IDNRK
      IMPORTING
        OUTPUT = INPUT_PBOM-IDNRK.

    TRANSLATE INPUT_PBOM-IDNRK TO UPPER CASE.

    CLEAR GS_INPUTPBOM.

*2.1   当从一个小bom切换到另一个小bom时的处理;
*2.1.1 可以是第一个bom的第一条记录,
*2.1.2 或者是另开始一个小bom数据
    IF ( TEMP_MAT <> INPUT_PBOM-MATNR OR TEMP_WERKS <> INPUT_PBOM-WERKS ).

      "2.1.1当是第一个bom的第一条数据时
      IF ( TEMP_MAT IS INITIAL ) AND ( TEMP_WERKS IS INITIAL ).
        TEMP_MAT = INPUT_PBOM-MATNR.
        TEMP_WERKS = INPUT_PBOM-WERKS.

        CLEAR PLM_SUBMATNR_COUNT.
        PLM_SUBMATNR_COUNT-SUBMATNR = INPUT_PBOM-IDNRK.
        PLM_SUBMATNR_COUNT-MENGE = INPUT_PBOM-KMPMG.
        PLM_SUBMATNR_COUNT-COUNT = PLM_SUBMATNR_COUNT-COUNT + 1.

        "保存传入的数据到zinputpbom透视表中,作为记录。
        GS_INPUTPBOM-MATNR = INPUT_PBOM-MATNR.
        GS_INPUTPBOM-WERKS = INPUT_PBOM-WERKS.
        GS_INPUTPBOM-IDNRK = INPUT_PBOM-IDNRK.
        GS_INPUTPBOM-KMPMG = INPUT_PBOM-KMPMG.
        GS_INPUTPBOM-XUHAO = PLM_SUBMATNR_COUNT-COUNT.
        GS_INPUTPBOM-MEINS = INPUT_PBOM-MEINS.
        GS_INPUTPBOM-SORTP = INPUT_PBOM-SORTP.
        GS_INPUTPBOM-LOGDATE = SY-DATUM.
        GS_INPUTPBOM-LOGTIME = SY-UZEIT.

        CLEAR TEMP_MATNR.
        SELECT SINGLE MATNR INTO TEMP_MATNR FROM ZINPUTPBOM
        WHERE MATNR = INPUT_PBOM-MATNR
        AND WERKS = INPUT_PBOM-WERKS
        AND IDNRK = INPUT_PBOM-IDNRK
        AND KMPMG = INPUT_PBOM-KMPMG
        AND XUHAO = PLM_SUBMATNR_COUNT-COUNT.

        IF TEMP_MATNR IS INITIAL.
          INSERT INTO ZINPUTPBOM VALUES GS_INPUTPBOM.
        ELSE.
          UPDATE ZINPUTPBOM SET SORTP = GS_INPUTPBOM-SORTP LOGDATE = SY-DATUM  LOGTIME = SY-UZEIT
          WHERE MATNR = INPUT_PBOM-MATNR
          AND WERKS = INPUT_PBOM-WERKS
          AND IDNRK = INPUT_PBOM-IDNRK
          AND KMPMG = INPUT_PBOM-KMPMG
          AND XUHAO = PLM_SUBMATNR_COUNT-COUNT.
        ENDIF.
        COMMIT WORK AND WAIT.

        "准备行项目数据
        CLEAR TEMP_STLNR.
        SELECT SINGLE STLNR INTO TEMP_STLNR FROM MAST WHERE MATNR = TEMP_MAT AND WERKS = TEMP_WERKS AND STLAN = '1'.
        IF TEMP_STLNR IS INITIAL.  "sap原数据没有bom时的处理
          CLEAR GT_STPO_INPUT.
          IF INPUT_PBOM-STVKN IS NOT INITIAL.
            GT_STPO_INPUT-ITEM_NODE = INPUT_PBOM-STVKN.
          ENDIF.
          GT_STPO_INPUT-CHG_NO_TO = INPUT_PBOM-AENRA.
          GT_STPO_INPUT-VALID_TO = INPUT_PBOM-DATUB+0(4) && '-' && INPUT_PBOM-DATUB+4(2) && '-' && INPUT_PBOM-DATUB+6(2).
          GT_STPO_INPUT-REL_PROD = 'X'."标识 与生产相关项目
          GT_STPO_INPUT-AI_GROUP = 'A'."替代组
          GT_STPO_INPUT-AI_PRIO = '1'."优先级
          GT_STPO_INPUT-AI_STRATEG = '01'."策略
          GT_STPO_INPUT-USAGE_PROB = '100'."使用比例
          GT_STPO_INPUT-IDENTIFIER = '1'."标识
          GT_STPO_INPUT-ITEM_NO = INPUT_PBOM-POSNR.     "项目号 默认9000
          GT_STPO_INPUT-ITEM_CATEG = INPUT_PBOM-POSTP.  "项目类别ICT 默认L
          GT_STPO_INPUT-COMPONENT = INPUT_PBOM-IDNRK.   "组件:即子物料
          GT_STPO_INPUT-COMP_QTY = INPUT_PBOM-KMPMG.    "数量
          GT_STPO_INPUT-COMP_UNIT = INPUT_PBOM-MEINS.   "单位
          GT_STPO_INPUT-REL_COST = 'X'.                 "成本核算标准相关
          GT_STPO_INPUT-SORTSTRING = INPUT_PBOM-SORTP.  "排序字符串
          GT_STPO_INPUT-CHANGE_NO = INPUT_PBOM-AENNR.
          PDATAV = INPUT_PBOM-DATUV+0(4) && '-' && INPUT_PBOM-DATUV+4(2) && '-' && INPUT_PBOM-DATUV+6(2) .
          GT_STPO_INPUT-VALID_FROM = PDATAV.

*        gt_stpo_input-comp_scrap = ."部件废品用百分比表示(BTCI)
*        gt_stpo_input-issue_loc = ."生产订单的发货地点
          APPEND GT_STPO_INPUT.

        ELSE.                     "sap原数据有bom时的处理,指定bom中要更改的具体条目
          CLEAR GT_STPO_INPUT.
          IF INPUT_PBOM-STVKN IS NOT INITIAL.
            GT_STPO_INPUT-ITEM_NODE = INPUT_PBOM-STVKN.
          ENDIF.
          GT_STPO_INPUT-CHG_NO_TO = INPUT_PBOM-AENRA.
          GT_STPO_INPUT-VALID_TO = INPUT_PBOM-DATUB+0(4) && '-' && INPUT_PBOM-DATUB+4(2) && '-' && INPUT_PBOM-DATUB+6(2).
          GT_STPO_INPUT-REL_PROD = 'X'."标识 与生产相关项目
          GT_STPO_INPUT-AI_GROUP = 'A'."替代组
          GT_STPO_INPUT-AI_PRIO = '1'."优先级
          GT_STPO_INPUT-AI_STRATEG = '01'."策略
          GT_STPO_INPUT-USAGE_PROB = '100'."使用比例
          GT_STPO_INPUT-IDENTIFIER = '1'."标识
          GT_STPO_INPUT-ITEM_NO = INPUT_PBOM-POSNR.     "项目号 默认9000
          GT_STPO_INPUT-ITEM_CATEG = INPUT_PBOM-POSTP.  "项目类别ICT 默认L
          GT_STPO_INPUT-COMPONENT = INPUT_PBOM-IDNRK.   "组件:即子物料
          GT_STPO_INPUT-COMP_QTY = INPUT_PBOM-KMPMG.    "数量
          GT_STPO_INPUT-COMP_UNIT = INPUT_PBOM-MEINS.   "单位
          GT_STPO_INPUT-REL_COST = 'X'.                 "成本核算标准相关
          GT_STPO_INPUT-SORTSTRING = INPUT_PBOM-SORTP.  "排序字符串
          GT_STPO_INPUT-CHANGE_NO = INPUT_PBOM-AENNR.
          PDATAV = INPUT_PBOM-DATUV+0(4) && '-' && INPUT_PBOM-DATUV+4(2) && '-' && INPUT_PBOM-DATUV+6(2) .
          GT_STPO_INPUT-VALID_FROM = PDATAV.
*         gt_stpo_input-comp_scrap = ."部件废品用百分比表示(BTCI)
*         gt_stpo_input-issue_loc = ."生产订单的发货地点

          CLEAR SAP_STPO.
          CLEAR SAP_STPO[].
          SELECT * INTO CORRESPONDING FIELDS OF TABLE  SAP_STPO FROM STPO
          WHERE STLNR = TEMP_STLNR AND STLTY = 'M' AND IDNRK = INPUT_PBOM-IDNRK AND MENGE = INPUT_PBOM-KMPMG ORDER BY STLKN STPOZ.
          IF LINES( SAP_STPO[] ) >= PLM_SUBMATNR_COUNT-COUNT.
            CLEAR NO1.
            LOOP AT SAP_STPO.
              NO1 = NO1 + 1.
              IF NO1 = PLM_SUBMATNR_COUNT-COUNT.
                GT_STPO_INPUT-BOM_NO = SAP_STPO-STLNR.
                GT_STPO_INPUT-ITEM_NODE = SAP_STPO-STLKN.
                GT_STPO_INPUT-ITEM_COUNT = SAP_STPO-STPOZ.
                IF ( SAP_STPO-SORTF IS NOT INITIAL ) AND ( INPUT_PBOM-SORTP IS INITIAL ).
                  GT_STPO_INPUT-SORTSTRING = SAP_STPO-SORTF.  "排序字符串
                ENDIF.
                EXIT.
              ENDIF.
            ENDLOOP.
          ENDIF.
          APPEND GT_STPO_INPUT.
        ENDIF.

      ELSE.
        "2.1.2 当完成一个小bom,处理该层小bom的数据同步。进入下一个小bom数据的准备
        CLEAR SAP_STPO.
        CLEAR SAP_STPO[].
        CLEAR SAP_SUBMATNR_COUNT.

*        SELECT * INTO CORRESPONDING FIELDS OF TABLE sap_stpo FROM stpo WHERE stlnr = temp_stlnr AND stlty = 'M' ORDER BY idnrk MENGE STLKN STPOZ.
*
*        LOOP AT sap_stpo."比较输入bom数据和SAPbom数据,判断需要删除的行项目(即输入无,而SAP有的行项目):这里是用物料号做的比较,是否ok?
*          IF sap_stpo-IDNRK = sap_submatnr_count-submatnr AND sap_stpo-MENGE = sap_submatnr_count-MENGE.
*            sap_submatnr_count-COUNT = sap_submatnr_count-COUNT + 1.
*          ELSE.
*            CLEAR sap_submatnr_count.
*            sap_submatnr_count-submatnr = sap_stpo-idnrk.
*            sap_submatnr_count-MENGE = sap_stpo-MENGE.
*            sap_submatnr_count-COUNT = sap_submatnr_count-COUNT + 1.
*          ENDIF.
* 删除用ECN处理
*          isfind = '0'.
*          CLEAR NO2.
*          LOOP AT gt_stpo_input.
*            IF sap_stpo-IDNRK = gt_stpo_input-COMPONENT AND sap_stpo-MENGE = gt_stpo_input-comp_qty.
*              NO2 = NO2 + 1.
*              IF NO2 = sap_submatnr_count-COUNT.
*                isfind = '1'.
*                EXIT.
*              ENDIF.
*            ENDIF.
*          ENDLOOP.
*          IF isfind = '0'."对要删除的行项目做标记,待处理
*            gt_stpo_input-bom_no = sap_stpo-STLNR.
*            gt_stpo_input-ITEM_NODE = sap_stpo-STLKN.
*            gt_stpo_input-ITEM_COUNT = sap_stpo-STPOZ.
*            gt_stpo_input-fldelete = 'X'.
*            APPEND gt_stpo_input.
*          ENDIF.
*        ENDLOOP.

        "下面执行小bom的数据同步

        CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
          EXPORTING
            MATERIAL      = TEMP_MAT
            PLANT         = TEMP_WERKS
            BOM_USAGE     = '1'   "物料清单用途 默认1
            CHANGE_NO     = INPUT_PBOM-AENNR
            VALID_FROM    = PDATAV
            I_STKO        = I_STKO
            FL_BOM_CREATE = 'X'
            FL_NEW_ITEM   = 'X'
            FL_COMPLETE   = 'x'
          TABLES
            T_STPO        = GT_STPO_INPUT
          EXCEPTIONS
            ERROR         = 1
            OTHERS        = 2.

        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT = 'X'.

        "BOM同步成功与否的记录

        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 = RETURN.

        IF SY-SUBRC <> 0.
          CLEAR OUTPUT_MESSAGE.
          RETURN = RETURN+12(10).
          OUTPUT_MESSAGE-MESSAGETYPE = 'E'.
        ELSE.
          CLEAR OUTPUT_MESSAGE.
          OUTPUT_MESSAGE-MESSAGETYPE = 'S'.
        ENDIF.
        OUTPUT_MESSAGE-MESSAGE = RETURN.

        OUTPUT_MESSAGE-MATNR = TEMP_MAT.

        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
          EXPORTING
            INPUT  = OUTPUT_MESSAGE-MATNR
          IMPORTING
            OUTPUT = OUTPUT_MESSAGE-MATNR.

        OUTPUT_MESSAGE-WERKS = TEMP_WERKS.

        APPEND OUTPUT_MESSAGE.

        ZLOG-MATNR = OUTPUT_MESSAGE-MATNR.
        ZLOG-WERKS = OUTPUT_MESSAGE-WERKS.
        ZLOG-MESSAGETYPE = OUTPUT_MESSAGE-MESSAGETYPE.
        ZLOG-MESSAGE = OUTPUT_MESSAGE-MESSAGE.
        ZLOG-LOGDATE = SY-DATUM.
        ZLOG-LOGTIME = SY-UZEIT.
        ZLOG-INTERFACENAME = 'ZPBOM_PLM2SAP'.

        INSERT INTO ZLOGOFMATNRORBOM  VALUES ZLOG.
        COMMIT WORK AND WAIT.

        CLEAR ZLOG.

        CLEAR GT_STPO_INPUT[].


        "进入下一个小bom数据的准备
        TEMP_MAT = INPUT_PBOM-MATNR.
        TEMP_WERKS = INPUT_PBOM-WERKS.

        CLEAR PLM_SUBMATNR_COUNT.
        PLM_SUBMATNR_COUNT-SUBMATNR = INPUT_PBOM-IDNRK.
        PLM_SUBMATNR_COUNT-MENGE = INPUT_PBOM-KMPMG.
        PLM_SUBMATNR_COUNT-COUNT = PLM_SUBMATNR_COUNT-COUNT + 1.

        "保存传入的数据到zinputpbom透视表中
        GS_INPUTPBOM-MATNR = INPUT_PBOM-MATNR.
        GS_INPUTPBOM-WERKS = INPUT_PBOM-WERKS.
        GS_INPUTPBOM-IDNRK = INPUT_PBOM-IDNRK.
        GS_INPUTPBOM-KMPMG = INPUT_PBOM-KMPMG.
        GS_INPUTPBOM-XUHAO = PLM_SUBMATNR_COUNT-COUNT.
        GS_INPUTPBOM-MEINS = INPUT_PBOM-MEINS.
        GS_INPUTPBOM-SORTP = INPUT_PBOM-SORTP.
        GS_INPUTPBOM-LOGDATE = SY-DATUM.
        GS_INPUTPBOM-LOGTIME = SY-UZEIT.

        CLEAR TEMP_MATNR.
        SELECT SINGLE MATNR INTO TEMP_MATNR FROM ZINPUTPBOM
        WHERE MATNR = INPUT_PBOM-MATNR
        AND WERKS = INPUT_PBOM-WERKS
        AND IDNRK = INPUT_PBOM-IDNRK
        AND KMPMG = INPUT_PBOM-KMPMG
        AND XUHAO = PLM_SUBMATNR_COUNT-COUNT.

        IF TEMP_MATNR IS INITIAL.
          INSERT INTO ZINPUTPBOM VALUES GS_INPUTPBOM.
        ELSE.
          UPDATE ZINPUTPBOM SET SORTP = GS_INPUTPBOM-SORTP LOGDATE = SY-DATUM  LOGTIME = SY-UZEIT
          WHERE MATNR = INPUT_PBOM-MATNR
          AND WERKS = INPUT_PBOM-WERKS
          AND IDNRK = INPUT_PBOM-IDNRK
          AND KMPMG = INPUT_PBOM-KMPMG
          AND XUHAO = PLM_SUBMATNR_COUNT-COUNT.
        ENDIF.
        COMMIT WORK AND WAIT.

        "准备行项目数据
        CLEAR TEMP_STLNR.
        SELECT SINGLE STLNR INTO TEMP_STLNR FROM MAST WHERE MATNR = TEMP_MAT AND WERKS = TEMP_WERKS AND STLAN = '1'.
        IF TEMP_STLNR IS INITIAL.
          CLEAR GT_STPO_INPUT.
          IF INPUT_PBOM-STVKN IS NOT INITIAL.
            GT_STPO_INPUT-ITEM_NODE = INPUT_PBOM-STVKN.
          ENDIF.
          GT_STPO_INPUT-CHG_NO_TO = INPUT_PBOM-AENRA.
          GT_STPO_INPUT-VALID_TO = INPUT_PBOM-DATUB+0(4) && '-' && INPUT_PBOM-DATUB+4(2) && '-' && INPUT_PBOM-DATUB+6(2).
          GT_STPO_INPUT-ITEM_NO = INPUT_PBOM-POSNR.     "项目号 默认9000
          GT_STPO_INPUT-ITEM_CATEG = INPUT_PBOM-POSTP.  "项目类别ICT 默认L
          GT_STPO_INPUT-COMPONENT = INPUT_PBOM-IDNRK.   "组件:即子物料
          GT_STPO_INPUT-COMP_QTY = INPUT_PBOM-KMPMG.    "数量
          GT_STPO_INPUT-COMP_UNIT = INPUT_PBOM-MEINS.   "单位
          GT_STPO_INPUT-REL_COST = 'X'.                 "成本核算标准相关
          GT_STPO_INPUT-SORTSTRING = INPUT_PBOM-SORTP.  "排序字符串
          GT_STPO_INPUT-CHANGE_NO = INPUT_PBOM-AENNR.
          PDATAV = INPUT_PBOM-DATUV+0(4) && '-' && INPUT_PBOM-DATUV+4(2) && '-' && INPUT_PBOM-DATUV+6(2) .
          GT_STPO_INPUT-VALID_FROM = PDATAV.
*        gt_stpo_input-comp_scrap = ."部件废品用百分比表示(BTCI)
*        gt_stpo_input-issue_loc = ."生产订单的发货地点
          APPEND GT_STPO_INPUT.

        ELSE.
          CLEAR GT_STPO_INPUT.
          IF INPUT_PBOM-STVKN IS NOT INITIAL.
            GT_STPO_INPUT-ITEM_NODE = INPUT_PBOM-STVKN.
          ENDIF.
          GT_STPO_INPUT-CHG_NO_TO = INPUT_PBOM-AENRA.
          GT_STPO_INPUT-VALID_TO = INPUT_PBOM-DATUB+0(4) && '-' && INPUT_PBOM-DATUB+4(2) && '-' && INPUT_PBOM-DATUB+6(2).
          GT_STPO_INPUT-ITEM_NO = INPUT_PBOM-POSNR.     "项目号 默认9000
          GT_STPO_INPUT-ITEM_CATEG = INPUT_PBOM-POSTP.  "项目类别ICT 默认L
          GT_STPO_INPUT-COMPONENT = INPUT_PBOM-IDNRK.   "组件:即子物料
          GT_STPO_INPUT-COMP_QTY = INPUT_PBOM-KMPMG.    "数量
          GT_STPO_INPUT-COMP_UNIT = INPUT_PBOM-MEINS.   "单位
          GT_STPO_INPUT-REL_COST = 'X'.                 "成本核算标准相关
          GT_STPO_INPUT-SORTSTRING = INPUT_PBOM-SORTP.  "排序字符串
          GT_STPO_INPUT-CHANGE_NO = INPUT_PBOM-AENNR.
          PDATAV = INPUT_PBOM-DATUV+0(4) && '-' && INPUT_PBOM-DATUV+4(2) && '-' && INPUT_PBOM-DATUV+6(2) .
          GT_STPO_INPUT-VALID_FROM = PDATAV.
*        gt_stpo_input-comp_scrap = ."部件废品用百分比表示(BTCI)
*        gt_stpo_input-issue_loc = ."生产订单的发货地点

          CLEAR SAP_STPO.
          CLEAR SAP_STPO[].
          SELECT * INTO CORRESPONDING FIELDS OF TABLE  SAP_STPO FROM STPO
          WHERE STLNR = TEMP_STLNR AND STLTY = 'M' AND IDNRK = INPUT_PBOM-IDNRK AND MENGE = INPUT_PBOM-KMPMG ORDER BY STLKN STPOZ.
          IF LINES( SAP_STPO[] ) >= PLM_SUBMATNR_COUNT-COUNT.
            CLEAR NO1.
            LOOP AT SAP_STPO.
              NO1 = NO1 + 1.
              IF NO1 = PLM_SUBMATNR_COUNT-COUNT.
                GT_STPO_INPUT-BOM_NO = SAP_STPO-STLNR.
                GT_STPO_INPUT-ITEM_NODE = SAP_STPO-STLKN.
                GT_STPO_INPUT-ITEM_COUNT = SAP_STPO-STPOZ.
                IF ( SAP_STPO-SORTF IS NOT INITIAL ) AND ( INPUT_PBOM-SORTP IS INITIAL ).
                  GT_STPO_INPUT-SORTSTRING = SAP_STPO-SORTF.  "排序字符串
                ENDIF.
                EXIT.
              ENDIF.
            ENDLOOP.
          ENDIF.
          APPEND GT_STPO_INPUT.
        ENDIF.
      ENDIF.

*2.2  某一小bom内行项目数据的处理:添加该行行项目。
    ELSE.
      IF INPUT_PBOM-IDNRK = PLM_SUBMATNR_COUNT-SUBMATNR AND INPUT_PBOM-KMPMG = PLM_SUBMATNR_COUNT-MENGE.
        PLM_SUBMATNR_COUNT-COUNT = PLM_SUBMATNR_COUNT-COUNT + 1.
      ELSE.
        CLEAR PLM_SUBMATNR_COUNT.
        PLM_SUBMATNR_COUNT-SUBMATNR = INPUT_PBOM-IDNRK.
        PLM_SUBMATNR_COUNT-MENGE = INPUT_PBOM-KMPMG.
        PLM_SUBMATNR_COUNT-COUNT = PLM_SUBMATNR_COUNT-COUNT + 1.
      ENDIF.

      "保存传入的数据到zinputpbom透视表中
      GS_INPUTPBOM-MATNR = INPUT_PBOM-MATNR.
      GS_INPUTPBOM-WERKS = INPUT_PBOM-WERKS.
      GS_INPUTPBOM-IDNRK = INPUT_PBOM-IDNRK.
      GS_INPUTPBOM-KMPMG = INPUT_PBOM-KMPMG.
      GS_INPUTPBOM-XUHAO = PLM_SUBMATNR_COUNT-COUNT.
      GS_INPUTPBOM-MEINS = INPUT_PBOM-MEINS.
      GS_INPUTPBOM-SORTP = INPUT_PBOM-SORTP.
      GS_INPUTPBOM-LOGDATE = SY-DATUM.
      GS_INPUTPBOM-LOGTIME = SY-UZEIT.

      CLEAR TEMP_MATNR.
      SELECT SINGLE MATNR INTO TEMP_MATNR FROM ZINPUTPBOM
      WHERE MATNR = INPUT_PBOM-MATNR
      AND WERKS = INPUT_PBOM-WERKS
      AND IDNRK = INPUT_PBOM-IDNRK
      AND KMPMG = INPUT_PBOM-KMPMG
      AND XUHAO = PLM_SUBMATNR_COUNT-COUNT.

      IF TEMP_MATNR IS INITIAL.
        INSERT INTO ZINPUTPBOM VALUES GS_INPUTPBOM.
      ELSE.
        UPDATE ZINPUTPBOM SET SORTP = GS_INPUTPBOM-SORTP LOGDATE = SY-DATUM  LOGTIME = SY-UZEIT
        WHERE MATNR = INPUT_PBOM-MATNR
        AND WERKS = INPUT_PBOM-WERKS
        AND IDNRK = INPUT_PBOM-IDNRK
        AND KMPMG = INPUT_PBOM-KMPMG
        AND XUHAO = PLM_SUBMATNR_COUNT-COUNT.
      ENDIF.
      COMMIT WORK AND WAIT.

      "准备行项目数据
      CLEAR TEMP_STLNR.
      SELECT SINGLE STLNR INTO TEMP_STLNR FROM MAST WHERE MATNR = TEMP_MAT AND WERKS = TEMP_WERKS AND STLAN = '1'.
      IF TEMP_STLNR IS INITIAL.
        CLEAR GT_STPO_INPUT.
        GT_STPO_INPUT-REL_PROD = 'X'."标识 与生产相关项目
        GT_STPO_INPUT-AI_GROUP = 'A'."替代组
        GT_STPO_INPUT-AI_PRIO = '1'."优先级
        GT_STPO_INPUT-AI_STRATEG = '01'."策略
        GT_STPO_INPUT-USAGE_PROB = '100'."使用比例
        GT_STPO_INPUT-IDENTIFIER = '1'."标识
        GT_STPO_INPUT-ITEM_NO = INPUT_PBOM-POSNR.     "项目号 默认9000
        GT_STPO_INPUT-ITEM_CATEG = INPUT_PBOM-POSTP.  "项目类别ICT 默认L
        GT_STPO_INPUT-COMPONENT = INPUT_PBOM-IDNRK.   "组件:即子物料
        GT_STPO_INPUT-COMP_QTY = INPUT_PBOM-KMPMG.    "数量
        GT_STPO_INPUT-COMP_UNIT = INPUT_PBOM-MEINS.   "单位
        GT_STPO_INPUT-REL_COST = 'X'.                 "成本核算标准相关
        GT_STPO_INPUT-SORTSTRING = INPUT_PBOM-SORTP.  "排序字符串
        PDATAV = INPUT_PBOM-DATUV+0(4) && '-' && INPUT_PBOM-DATUV+4(2) && '-' && INPUT_PBOM-DATUV+6(2) .
        GT_STPO_INPUT-VALID_FROM = PDATAV.
*        gt_stpo_input-comp_scrap = ."部件废品用百分比表示(BTCI)
*        gt_stpo_input-issue_loc = ."生产订单的发货地点
        APPEND GT_STPO_INPUT.

      ELSE.
        CLEAR GT_STPO_INPUT.
        IF INPUT_PBOM-STVKN IS NOT INITIAL.
          GT_STPO_INPUT-ITEM_NODE = INPUT_PBOM-STVKN.
        ENDIF.
        GT_STPO_INPUT-CHG_NO_TO = INPUT_PBOM-AENRA.
        GT_STPO_INPUT-VALID_TO = INPUT_PBOM-DATUB+0(4) && '-' && INPUT_PBOM-DATUB+4(2) && '-' && INPUT_PBOM-DATUB+6(2).
        GT_STPO_INPUT-REL_PROD = 'X'."标识 与生产相关项目
        GT_STPO_INPUT-AI_GROUP = 'A'."替代组
        GT_STPO_INPUT-AI_PRIO = '1'."优先级
        GT_STPO_INPUT-AI_STRATEG = '01'."策略
        GT_STPO_INPUT-USAGE_PROB = '100'."使用比例
        GT_STPO_INPUT-IDENTIFIER = '1'."标识
        GT_STPO_INPUT-ITEM_NO = INPUT_PBOM-POSNR.     "项目号 默认9000
        GT_STPO_INPUT-ITEM_CATEG = INPUT_PBOM-POSTP.  "项目类别ICT 默认L
        GT_STPO_INPUT-COMPONENT = INPUT_PBOM-IDNRK.   "组件:即子物料
        GT_STPO_INPUT-COMP_QTY = INPUT_PBOM-KMPMG.    "数量
        GT_STPO_INPUT-COMP_UNIT = INPUT_PBOM-MEINS.   "单位
        GT_STPO_INPUT-REL_COST = 'X'.                 "成本核算标准相关
        GT_STPO_INPUT-SORTSTRING = INPUT_PBOM-SORTP.  "排序字符串
        PDATAV = INPUT_PBOM-DATUV+0(4) && '-' && INPUT_PBOM-DATUV+4(2) && '-' && INPUT_PBOM-DATUV+6(2) .
        GT_STPO_INPUT-VALID_FROM = PDATAV.
*        gt_stpo_input-comp_scrap = ."部件废品用百分比表示(BTCI)
*        gt_stpo_input-issue_loc = ."生产订单的发货地点

        CLEAR SAP_STPO.
        CLEAR SAP_STPO[].
        SELECT * INTO CORRESPONDING FIELDS OF TABLE  SAP_STPO FROM STPO
        WHERE STLNR = TEMP_STLNR AND STLTY = 'M' AND IDNRK = INPUT_PBOM-IDNRK AND MENGE = INPUT_PBOM-KMPMG ORDER BY STLKN STPOZ.
        IF LINES( SAP_STPO[] ) >= PLM_SUBMATNR_COUNT-COUNT.
          CLEAR NO1.
          LOOP AT SAP_STPO.
            NO1 = NO1 + 1.
            IF NO1 = PLM_SUBMATNR_COUNT-COUNT.
              GT_STPO_INPUT-BOM_NO = SAP_STPO-STLNR.
              GT_STPO_INPUT-ITEM_NODE = SAP_STPO-STLKN.
              GT_STPO_INPUT-ITEM_COUNT = SAP_STPO-STPOZ.
              IF ( SAP_STPO-SORTF IS NOT INITIAL ) AND ( INPUT_PBOM-SORTP IS INITIAL ).
                GT_STPO_INPUT-SORTSTRING = SAP_STPO-SORTF.  "排序字符串
              ENDIF.
              EXIT.
            ENDIF.
          ENDLOOP.
        ENDIF.
        APPEND GT_STPO_INPUT.
      ENDIF.
    ENDIF.
  ENDLOOP.

*3.  所有bom项跑完了,对最后一个小bom的处理
  CLEAR SAP_STPO.
  CLEAR SAP_STPO[].
  CLEAR SAP_SUBMATNR_COUNT.

*  SELECT * INTO CORRESPONDING FIELDS OF TABLE sap_stpo FROM stpo WHERE stlnr = temp_stlnr AND stlty = 'M' ORDER BY idnrk MENGE STLKN STPOZ.
*
*  LOOP AT sap_stpo."比较输入bom数据和SAPbom数据,判断需要删除的行项目(即输入无,而SAP有的行项目):这里是用物料号做的比较,是否ok?
*    IF sap_stpo-IDNRK = sap_submatnr_count-submatnr AND sap_stpo-MENGE = sap_submatnr_count-MENGE.
*      sap_submatnr_count-COUNT = sap_submatnr_count-COUNT + 1.
*    ELSE.
*      CLEAR sap_submatnr_count.
*      sap_submatnr_count-submatnr = sap_stpo-idnrk.
*      sap_submatnr_count-MENGE = sap_stpo-MENGE.
*      sap_submatnr_count-COUNT = sap_submatnr_count-COUNT + 1.
*    ENDIF.
*
*    isfind = '0'.
*    CLEAR NO2.
*    LOOP AT gt_stpo_input.
*      IF sap_stpo-IDNRK = gt_stpo_input-COMPONENT AND sap_stpo-MENGE = gt_stpo_input-comp_qty.
*        NO2 = NO2 + 1.
*        IF NO2 = sap_submatnr_count-COUNT.
*          isfind = '1'.
*          EXIT.
*        ENDIF.
*      ENDIF.
*    ENDLOOP.
*    IF isfind = '0'.
*      gt_stpo_input-bom_no = sap_stpo-STLNR.
*      gt_stpo_input-ITEM_NODE = sap_stpo-STLKN.
*      gt_stpo_input-ITEM_COUNT = sap_stpo-STPOZ.
*      gt_stpo_input-fldelete = 'X'.
*      APPEND gt_stpo_input.
*    ENDIF.
*  ENDLOOP.

  CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
    EXPORTING
      MATERIAL      = TEMP_MAT
      PLANT         = TEMP_WERKS
      BOM_USAGE     = '1'   "物料清单用途 默认1
      CHANGE_NO     = INPUT_PBOM-AENNR
      VALID_FROM    = PDATAV
      I_STKO        = I_STKO
      FL_BOM_CREATE = 'X'
      FL_NEW_ITEM   = 'X'
      FL_COMPLETE   = 'x'
    TABLES
      T_STPO        = GT_STPO_INPUT
    EXCEPTIONS
      ERROR         = 1
      OTHERS        = 2.

  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      WAIT = 'X'.

  "BOM同步成功与否的记录

  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 = RETURN.

  IF SY-MSGTY = 'S'.
    CLEAR OUTPUT_MESSAGE.
    OUTPUT_MESSAGE-MESSAGETYPE = 'S'.
  ELSE.
    CLEAR OUTPUT_MESSAGE.
*    RETURN = RETURN+12(10).
    OUTPUT_MESSAGE-MESSAGETYPE = 'E'.
  ENDIF.



  OUTPUT_MESSAGE-MESSAGE = RETURN.
  OUTPUT-RETURN-MSGTY = OUTPUT_MESSAGE-MESSAGETYPE.
  OUTPUT-RETURN-MSGTX = OUTPUT_MESSAGE-MESSAGE.

  OUTPUT_MESSAGE-MATNR = TEMP_MAT.

  CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
    EXPORTING
      INPUT  = OUTPUT_MESSAGE-MATNR
    IMPORTING
      OUTPUT = OUTPUT_MESSAGE-MATNR.


  OUTPUT_MESSAGE-WERKS = TEMP_WERKS.
  APPEND OUTPUT_MESSAGE.

  ZLOG-MATNR = OUTPUT_MESSAGE-MATNR.
  ZLOG-WERKS = OUTPUT_MESSAGE-WERKS.
  ZLOG-MESSAGETYPE = OUTPUT_MESSAGE-MESSAGETYPE.
  ZLOG-MESSAGE = OUTPUT_MESSAGE-MESSAGE.
  ZLOG-LOGDATE = SY-DATUM.
  ZLOG-LOGTIME = SY-UZEIT.
  ZLOG-INTERFACENAME = 'ZPBOM_PLM2SAP'.

  INSERT INTO ZLOGOFMATNRORBOM  VALUES ZLOG.
  COMMIT WORK AND WAIT.

  CLEAR GT_STPO_INPUT[].

ENDFUNCTION.

http://www.kler.cn/a/447399.html

相关文章:

  • html <a>设置发送邮件链接、打电话链接 <a href=“mailto:></a> <a href=“tel:></a>
  • 【网络安全】用 Frida 修改软件为你所用
  • 嵌入式单片机的运行方式详解
  • K8s 节点 NotReady 后 Pod的变化
  • asp.net core发布配置端口号,支持linux
  • 【系统】Windows11更新解决办法,一键暂停
  • run postinstall error, please remove node_modules before retry!
  • PyTorch实战-模拟线性函数和非线性函数
  • 基于matlab的单目相机标定
  • C语言 文件操作——按字符读写文件
  • uni-app开发商品分类页面实现
  • 奇怪问题| Chrome 访问csdn 创作中心的时候报错: 服务超时,请稍后重试
  • IIoT赋能绿色智造:2025制造业的可持续发展之路
  • 主要是使用#includenlohmannjson.hpp时显示找不到文件,但是我文件已正确导入visual studio配置,也保证文件正确存在
  • .NET重点
  • 标准模板库(STL)中的一个容器 都有什么
  • ARM学习(38)多进程多线程之间的通信方式
  • 工业摄像机基于电荷耦合器件的相机
  • 三格电子——新品IE103转ModbusTCP网关
  • C++ OCR银行卡文字识别
  • 【潜意识Java】蓝桥杯算法有关的动态规划求解背包问题
  • vue-flow流程图组件
  • 基于SpringBoot的“旅游管理系统”的设计与实现(源码+数据库+文档+PPT)
  • 模型数据算法概论
  • 【Elasticsearch04】企业级日志分析系统ELK之Elasticsearch 插件
  • 方格分割(蓝桥杯2017年试题D)