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'EXPORTINGINPUT = INPUT_PBOM-MATNRIMPORTINGOUTPUT = INPUT_PBOM-MATNR.TRANSLATE INPUT_PBOM-MATNR TO UPPER CASE.* CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'EXPORTINGINPUT = INPUT_PBOM-IDNRKIMPORTINGOUTPUT = 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 ZINPUTPBOMWHERE MATNR = INPUT_PBOM-MATNRAND WERKS = INPUT_PBOM-WERKSAND IDNRK = INPUT_PBOM-IDNRKAND KMPMG = INPUT_PBOM-KMPMGAND 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-UZEITWHERE MATNR = INPUT_PBOM-MATNRAND WERKS = INPUT_PBOM-WERKSAND IDNRK = INPUT_PBOM-IDNRKAND KMPMG = INPUT_PBOM-KMPMGAND 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. "项目号 默认9000GT_STPO_INPUT-ITEM_CATEG = INPUT_PBOM-POSTP. "项目类别ICT 默认LGT_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. "项目号 默认9000GT_STPO_INPUT-ITEM_CATEG = INPUT_PBOM-POSTP. "项目类别ICT 默认LGT_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 STPOWHERE 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'EXPORTINGMATERIAL = TEMP_MATPLANT = TEMP_WERKSBOM_USAGE = '1' "物料清单用途 默认1CHANGE_NO = INPUT_PBOM-AENNRVALID_FROM = PDATAVI_STKO = I_STKOFL_BOM_CREATE = 'X'FL_NEW_ITEM = 'X'FL_COMPLETE = 'x'TABLEST_STPO = GT_STPO_INPUTEXCEPTIONSERROR = 1OTHERS = 2.CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'EXPORTINGWAIT = 'X'."BOM同步成功与否的记录CALL FUNCTION 'MESSAGE_TEXT_BUILD'EXPORTINGMSGID = SY-MSGIDMSGNR = SY-MSGNOMSGV1 = SY-MSGV1MSGV2 = SY-MSGV2MSGV3 = SY-MSGV3MSGV4 = SY-MSGV4IMPORTINGMESSAGE_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'EXPORTINGINPUT = OUTPUT_MESSAGE-MATNRIMPORTINGOUTPUT = 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 ZINPUTPBOMWHERE MATNR = INPUT_PBOM-MATNRAND WERKS = INPUT_PBOM-WERKSAND IDNRK = INPUT_PBOM-IDNRKAND KMPMG = INPUT_PBOM-KMPMGAND 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-UZEITWHERE MATNR = INPUT_PBOM-MATNRAND WERKS = INPUT_PBOM-WERKSAND IDNRK = INPUT_PBOM-IDNRKAND KMPMG = INPUT_PBOM-KMPMGAND 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. "项目号 默认9000GT_STPO_INPUT-ITEM_CATEG = INPUT_PBOM-POSTP. "项目类别ICT 默认LGT_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. "项目号 默认9000GT_STPO_INPUT-ITEM_CATEG = INPUT_PBOM-POSTP. "项目类别ICT 默认LGT_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 STPOWHERE 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 ZINPUTPBOMWHERE MATNR = INPUT_PBOM-MATNRAND WERKS = INPUT_PBOM-WERKSAND IDNRK = INPUT_PBOM-IDNRKAND KMPMG = INPUT_PBOM-KMPMGAND 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-UZEITWHERE MATNR = INPUT_PBOM-MATNRAND WERKS = INPUT_PBOM-WERKSAND IDNRK = INPUT_PBOM-IDNRKAND KMPMG = INPUT_PBOM-KMPMGAND 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. "项目号 默认9000GT_STPO_INPUT-ITEM_CATEG = INPUT_PBOM-POSTP. "项目类别ICT 默认LGT_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. "项目号 默认9000GT_STPO_INPUT-ITEM_CATEG = INPUT_PBOM-POSTP. "项目类别ICT 默认LGT_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 STPOWHERE 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'EXPORTINGMATERIAL = TEMP_MATPLANT = TEMP_WERKSBOM_USAGE = '1' "物料清单用途 默认1CHANGE_NO = INPUT_PBOM-AENNRVALID_FROM = PDATAVI_STKO = I_STKOFL_BOM_CREATE = 'X'FL_NEW_ITEM = 'X'FL_COMPLETE = 'x'TABLEST_STPO = GT_STPO_INPUTEXCEPTIONSERROR = 1OTHERS = 2.CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'EXPORTINGWAIT = 'X'."BOM同步成功与否的记录CALL FUNCTION 'MESSAGE_TEXT_BUILD'EXPORTINGMSGID = SY-MSGIDMSGNR = SY-MSGNOMSGV1 = SY-MSGV1MSGV2 = SY-MSGV2MSGV3 = SY-MSGV3MSGV4 = SY-MSGV4IMPORTINGMESSAGE_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'EXPORTINGINPUT = OUTPUT_MESSAGE-MATNRIMPORTINGOUTPUT = 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.相关文章:
SAP PP ECN CSAP_MAT_BOM_MAINTAIN
刚开始的时候ECN总是加不上, 参考kimi给出的案例 点击链接查看和 Kimi 智能助手的对话 https://kimi.moonshot.cn/share/cth1ipmqvl7f04qkggdg 效果 加上了 FUNCTION ZPBOM_PLM2SAP. *"------------------------------------------------------------------…...
html中实用标签dl dt dd(有些小众的标签 但是很好用)
背景描述 html <dl> <dt> <dd>是一组合标签,他们与ol li、ul li标签很相似 但是他却是没有默认前缀并且有缩进的标签 使用方式与table表格的标签一致 使用方式 dt和dd是放于dl标签内,dt与dd处于dl下相同级。就是dt不能放入dd内&am…...
ONES 功能上新|ONES Copilot、ONES Wiki 新功能一览
ONES Copilot 可基于工作项的标题、描述、属性信息,对工作项产生的动态和评论生成总结。 针对不同类型的工作项,总结输出的内容有对应的侧重点。 应用场景: 在一些流程步骤复杂、上下游参与成员角色丰富的场景中,工作项动态往往会…...
实现Python将csv数据导入到Neo4j
目录 一、获取数据集 1.1 获取数据集 1.2 以“记事本”方式打开文件 1.3 另存为“UTF-8”格式文件 1.4 选择“是” 二、 打开Neo4j并运行 2.1 创建新的Neo4j数据库 2.2 分别设置数据库名和密码 编辑 2.3 启动Neo4j数据库 2.4 打开Neo4j数据库 2.5 运行查看该数据库…...
QML Rectangle组件
文章目录 前言主体**简单的矩形****渐变的矩形****带边框的矩形****圆角矩形****圆形 & 圆环** 总结 前言 在 QML 中,Rectangle 是一个常见且非常实用的元素,它允许开发者轻松创建矩形形状的图形。通过调整 Rectangle 的多种属性,我们不…...
uniapp开发app,cover-view不能隐藏,使用v-if,v-show都不行的解决办法
先上解决方案 在最后多写一个v-else <cover-view class"point-info" v-if"selectedPoint"><cover-view class"info-content"><cover-view class"info-item">。。。</cover-view><cover-view class"i…...
用adb命令给APP做压力测试,有什么不同?
压力测试 app做压力测试目的是模拟用户在使用软件时随意向软件发出指令,例如操作app的点击,滑动,返回等一系列随机事件,来检测app的承受能力 第一步:手机安装包需要待测的app 第二步:输入adb start-ser…...
netcore 集成Prometheus
一、安装包 <ItemGroup><PackageReference Include"prometheus-net" Version"8.2.1" /><PackageReference Include"prometheus-net.AspNetCore" Version"8.2.1" /> </ItemGroup> 二、添加代码 #region Pro…...
同城外卖系统源码扩展指南:搭建海外外卖APP平台详解
本篇文章,笔者将探讨如何基于同城外卖系统源码,搭建适合不同国家的海外外卖APP平台,涵盖多语言支持、支付接口对接、本地化适配等方面的实践经验和技术要点。 一、确定目标市场与用户需求 在开发海外外卖APP平台之前,首先需要深…...
JavaScript 中常见内置对象的知识点及示例总结
一、String(字符串)对象 知识点: 用于处理文本数据,它有许多内置的属性和方法来操作字符串,比如获取字符串长度、提取子字符串、替换字符等。字符串在 JavaScript 中是不可变的,即一旦创建,就不…...
CSSmodule的作用是什么
CSS Modules的作用主要体现在以下几个方面: 1. 解决全局样式污染问题 在传统的CSS管理方式中,样式定义通常是全局的,这很容易导致全局样式污染。当多个组件或页面共享同一个样式时,可能会出现样式冲突和覆盖的情况,从…...
python\shell\c++语法对比
语法区别举例: itempythonshellc变量定义a 10a10int a 10数组定义arr[1, add, 3]arr(1 a hello) declare -A arr([a]1 [b]2)int arr[] {1, 2, 3}if条件判断 if xxx: xxx elif xxx: xxx else: xxx if [ expressions ];then xxx e…...
优先队列【东北大学oj数据结构9-3】C++
优先队列 优先级队列是一种数据结构,其中保存了一组数据 S,其中每个元素都有一个键,并执行以下操作: insert(S, k):将元素k插入集合S extractMax(S):从S中取出S中key最大的元素并返回其值 创建一个程序&am…...
圣诞快乐(h5 css js(圣诞树))
一,整体设计思路 圣诞树h5(简易) 1.页面布局与样式: 页面使用了全屏的黑色背景,中央显示圣诞树,树形由三层绿色的三角形组成,每一层的大小逐渐变小。树干是一个棕色的矩形,位于三角…...
基于MATLAB的图像增强
目录 一、背景及意义介绍背景图像采集过程中的局限性 意义 二、概述三、代码结构及说明(一)整体结构(二)亮度增强部分(三)对比度增强部分(四)锐度增强部分 四、复现步骤(…...
大数据之Hbase环境安装
Hbase软件版本下载地址: http://mirror.bit.edu.cn/apache/hbase/ 1. 集群环境 Master 172.16.11.97 Slave1 172.16.11.98 Slave2 172.16.11.99 2. 下载软件包 #Master wget http://archive.apache.org/dist/hbase/0.98.24/hbase-0.98.24-hadoop1-bin.tar.gz…...
javaEE--计算机是如何工作的-1
目录 一.计算机的组成: 各组件的功能: 衡量cpu好坏的标准: 二.指令(instruction) 三.操作系统Operating System 四.进程/任务process/tesk 五.进程在系统中如何管理 1.进程在系统中的管理,从两个角度来分类: 2.进程控制块PCB(Process Control Block)) 3.P…...
vue.js 指令的修饰符
Vue.js 提供了一些指令修饰符,用于在指令的行为上添加额外的功能。下面详细解析一些常用的指令修饰符,并提供相应的代码实例。 .prevent:阻止默认事件 通过添加 .prevent 修饰符,可以阻止指令绑定的元素触发默认事件。 代码实例&a…...
基于java web在线商城购物系统源码+论文
一、环境信息 开发语言:JAVA JDK版本:JDK8及以上 数据库:MySql5.6及以上 Maven版本:任意版本 操作系统:Windows、macOS 开发工具:Idea、Eclipse、MyEclipse 开发框架:SpringbootHTMLjQueryMysq…...
Autosar入门_架构(Architecture)
上一篇 | 返回主目录 | 下一篇 架构(Architecture) 1 Autosar架构分层概述2 MCAL3 ECU抽象层4 复杂设备驱动5 服务层6 RTE7 应用软件层1 Autosar架构分层概述 整体架构分为三层:应用软件(APP)、实时运行环境(RTE)、基础软件(BSW)以下架构对BSW进行了细化,主要包含四…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
