增强ME_PROCESS_PO_CUST
二、实现方式:实现的方式可以有很多种,这里讲一下用BADI增强ME_PROCESS_PO_CUST实现的方式
第一步:执行事务码se19,在BAdI Name处输入:ME_PROCESS_PO_CUST,然后点“Create Impl”按钮
第二步:在Implementation Name输入ZME_PROCESS_PO_CUST,点OK按钮。
第三步:双击“PROCESS_HEADER”
第四步:在METHOD里编写代码,就可以实现需求的功能了
代码如下:
METHOD IF_EX_ME_PROCESS_PO_CUST~PROCESS_HEADER.
DATA:LT_HEADER TYPE MEPOHEADER,
LV_BSART TYPE EKKO-BSART.
IF SY-TCODE = 'ME21N' OR SY-TCODE = 'ME22N' OR SY-TCODE = 'ME23N'.
IF IM_HEADER IS NOT INITIAL.
CALL METHOD IM_HEADER->GET_DATA
RECEIVING
RE_DATA = LT_HEADER.
CLEAR LV_BSART.
SELECT SINGLE
BSART
INTO LV_BSART
FROM EKKO
WHERE EBELN = LT_HEADER-EBELN.
IF LV_BSART <> 'ZNPI' and LV_BSART <> 'NNPI' .
IF LT_HEADER-BSART = 'ZNPI'.
LT_HEADER-SUBMI = 'ZNPI'.
ELSEIF LT_HEADER-BSART = 'NNPI'.
LT_HEADER-SUBMI = 'ZNPI'.
ELSE.
LT_HEADER-SUBMI = ''.
ENDIF.
CALL METHOD IM_HEADER->SET_DATA
EXPORTING
IM_DATA = LT_HEADER.
ENDIF.
IF LT_HEADER-SUBMI = 'ZNPI'.
CALL METHOD IM_HEADER->GET_DATA
RECEIVING
RE_DATA = LT_HEADER.
LT_HEADER-BEDAT = SY-DATUM.
CALL METHOD IM_HEADER->SET_DATA
EXPORTING
IM_DATA = LT_HEADER.
ENDIF.
ENDIF.
ENDIF.
ENDMETHOD.
METHOD IF_EX_ME_PROCESS_PO_CUST~PROCESS_SCHEDULE.
*{ INSERT REDK926367 1
IF SY-UNAME = 'WM_YANGH'.
DATA:SCHEDULE TYPE MEPOSCHEDULE.
DATA:RE_ITEM TYPE REF TO IF_PURCHASE_ORDER_ITEM_MM.
DATA:RE_HEADER TYPE REF TO IF_PURCHASE_ORDER_MM.
DATA:HEADER TYPE MEPOHEADER.
DATA:ITEM TYPE MEPOITEM.
DATA:BEGIN OF L_WINFNR,
INFNR TYPE EINA-INFNR, "采购信息记录
MATNR TYPE EINA-MATNR, "物料号
LIFNR TYPE EINA-LIFNR, "供应商
APLFZ TYPE EINE-APLFZ, "计划交货天数
END OF L_WINFNR.
DATA:L_TINFNR LIKE L_WINFNR.
DATA:WERKS TYPE ZMARC-WERKS.
DATA:BEGIN OF L_DC,
LIFNR TYPE ZMARC-LIFNR,
END OF L_DC.
INCLUDE MM_MESSAGES_MAC.
"获取行项目---- 计划日期数据
SCHEDULE = IM_SCHEDULE->GET_DATA( ).
"获取行项目-----项目数据
RE_ITEM = IM_SCHEDULE->GET_ITEM( ).
ITEM = RE_ITEM->GET_DATA( ).
"获取------------抬头数据
RE_HEADER = RE_ITEM->GET_HEADER( ).
HEADER = RE_HEADER->GET_DATA( ).
"处理数据
IF ITEM IS NOT INITIAL AND HEADER IS NOT INITIAL.
SELECT SINGLE
EINA~INFNR
EINA~MATNR
EINA~LIFNR
EINE~APLFZ
INTO CORRESPONDING FIELDS OF L_WINFNR
FROM EINA
INNER JOIN EINE ON EINA~INFNR = EINE~INFNR
WHERE EINA~MATNR = ITEM-MATNR
AND EINA~LIFNR = HEADER-LIFNR.
* and eine~ekorg = header-ekorg.
ENDIF.
IF HEADER-BSART <> 'ZNBE' AND ITEM-RETPO <> 'X'.
SHIFT HEADER-LIFNR LEFT DELETING LEADING '0'. "去前导零
IF HEADER-LIFNR+0(2) <> 'DC' AND STRLEN( HEADER-LIFNR ) <> 4.
SCHEDULE-EEIND = HEADER-AEDAT + L_WINFNR-APLFZ. "计划交货日期 = 记录的创建日期 + 供应商采购信息记录的计划交货天数
ELSEIF HEADER-LIFNR+0(2) = 'DC' AND STRLEN( HEADER-LIFNR ) = 4.
WERKS = HEADER-LIFNR.
"在ZMARC里面根据DC取值供应商
SELECT SINGLE LIFNR INTO CORRESPONDING FIELDS OF L_DC
FROM ZMARC
WHERE WERKS = WERKS
AND MATNR = ITEM-MATNR.
"根据DC的供应商取值采购信息记录
IF L_DC IS NOT INITIAL.
SELECT SINGLE
EINA~INFNR
EINA~MATNR
EINA~LIFNR
EINE~APLFZ
INTO CORRESPONDING FIELDS OF L_TINFNR
FROM EINA
INNER JOIN EINE ON EINA~INFNR = EINE~INFNR
WHERE EINA~MATNR = ITEM-MATNR
AND EINA~LIFNR = L_DC-LIFNR.
ENDIF.
* and eine~ekorg = header-ekorg.
SCHEDULE-EEIND = HEADER-AEDAT + L_WINFNR-APLFZ + L_TINFNR-APLFZ. "计划交货日期 = 记录的创建日期 + DC采购信息记录的计划交货天数 + DC供应商采购信息记录的计划交货天数
ENDIF.
"更新数据
IM_SCHEDULE->SET_DATA( SCHEDULE ).
ENDIF.
ENDIF.
*} INSERT
ENDMETHOD.