SAP-采购订单相关增强出口(转)
本文详细描述了如何在BADI方法ZME_PROCESS_PO_CUST中增强程序,确保订单抬头交货地址的输入、价格与信息记录的一致性,以及对采购数量、价格更新和过量交货限制的控制,特别针对销售订单与采购订单工厂不同时的情况。
以下效果:
保存时:
1. 控制订单抬头交货地址必须输入
2. 控制价格与信息记录中的价格一致
输入行项目时:
1. 控制PO数量不允许超过未清PR数量
2. 更新价格
3. 根据物料组更新过量交货限度
1) 在BADI: ZME_PROCESS_PO_CUST的方法中增强:
参考销售订单的采购时, 如果采购订单与销售订单工厂不相同, 则需要控制交货地址必须输入
INCLUDE MM_MESSAGES_MAC. DATA WA_HEAD TYPE MEPOHEADER. DATA IT_ITEMS TYPE PURCHASE_ORDER_ITEMS. DATA WA_ITEMS TYPE PURCHASE_ORDER_ITEM. DATA LS_EINE TYPE EINE. DATA:IT_COND TYPE MMPUR_TKOMV. DATA:WA_COND TYPE LINE OF MMPUR_TKOMV, LT_ACC TYPE PURCHASE_ORDER_ACCOUNTINGS, LS_ACC TYPE PURCHASE_ORDER_ACCOUNTING, MEPOACC TYPE MEPOACCOUNTING. DATA: L_WERKS TYPE WERKS_D, L_UEPOS TYPE VBAP-UEPOS. DATA ITAB TYPE TABLE OF MEPOITEM. DATA WA TYPE MEPOITEM. DATA:BEGIN OF WA2, ITEM TYPE REF TO IF_PURCHASE_ORDER_ITEM_MM, EBELP TYPE EKPO-EBELP, END OF WA2. DATA ITAB2 LIKE TABLE OF WA2. CALL METHOD IM_HEADER->GET_DATA RECEIVING RE_DATA = WA_HEAD. CALL METHOD IM_HEADER->GET_ITEMS RECEIVING RE_ITEMS = IT_ITEMS. LOOP AT IT_ITEMS INTO WA_ITEMS. CALL METHOD WA_ITEMS-ITEM->GET_DATA RECEIVING RE_DATA = WA. APPEND WA TO ITAB. WA2-ITEM = WA_ITEMS-ITEM. WA2-EBELP = WA-EBELP. APPEND WA2 TO ITAB2. CLEAR: WA,WA2. ENDLOOP. "第一行的科目分配数据, 判断交货地址 DELETE ITAB WHERE LOEKZ = 'X'. READ TABLE ITAB INTO WA INDEX 1. IF SY-SUBRC = 0. READ TABLE ITAB2 INTO WA2 WITH KEY EBELP = WA-EBELP. LT_ACC = WA2-ITEM->GET_ACCOUNTINGS( ). READ TABLE LT_ACC INTO LS_ACC INDEX 1. IF SY-SUBRC = 0. MEPOACC = LS_ACC-ACCOUNTING->GET_DATA( ). IF MEPOACC-VBELN NE '' AND MEPOACC-VBELP NE '000000'. SELECT SINGLE UEPOS WERKS INTO (L_UEPOS,L_WERKS) FROM VBAP WHERE VBELN = MEPOACC-VBELN AND POSNR = MEPOACC-VBELP. IF L_UEPOS IS NOT INITIAL. SELECT SINGLE WERKS INTO L_WERKS FROM VBAP WHERE VBELN = MEPOACC-VBELN AND POSNR = L_UEPOS. ENDIF. IF L_WERKS NE WA-WERKS. IF WA_HEAD-ZZADR = ''. MMPUR_MESSAGE 'E' '00' '001' '没有输入交货地址' '' '' ''. ENDIF. ENDIF. ENDIF. ENDIF. ENDIF. 检查订单价格与信息记录中的价格相同 "从信息记录自动带入采购订单的价格,不允许做变动 LOOP AT ITAB INTO WA WHERE LOEKZ = ''. SELECT SINGLE * INTO LS_EINE FROM EINE WHERE INFNR = WA-INFNR AND EKORG = WA_HEAD-EKORG AND WERKS = WA-WERKS AND LOEKZ = ''. IF SY-SUBRC = 0. REFRESH: IT_COND. CLEAR: IT_COND,WA_COND. READ TABLE ITAB2 INTO WA2 WITH KEY EBELP = WA-EBELP. CALL METHOD WA2-ITEM->GET_CONDITIONS IMPORTING EX_CONDITIONS = IT_COND. READ TABLE IT_COND INTO WA_COND WITH KEY KSCHL = 'PB00'. WA_COND-KBETR = WA_COND-KBETR / WA_COND-KPEIN. LS_EINE-NETPR = LS_EINE-NETPR / LS_EINE-PEINH. IF WA_COND-KBETR NE LS_EINE-NETPR. MMPUR_MESSAGE 'E' '00' '001' '项目' WA-EBELP '的价格与信息记录不一致' ''. ENDIF. ENDIF. ENDLOOP. (2) 在方法PROCESS_ITEM 中实现增强 控制PO数量不允许超过未清PR数量 INCLUDE MM_MESSAGES_MAC. DATA: IM_HEADER TYPE REF TO IF_PURCHASE_ORDER_MM, HEADER TYPE MEPOHEADER, PO_LINE TYPE MEPOITEM, LS_EBAN TYPE EBAN, L_MENGE TYPE MENGE_D, LT_ACC TYPE PURCHASE_ORDER_ACCOUNTINGS, LS_ACC TYPE PURCHASE_ORDER_ACCOUNTING, MEPOACC TYPE MEPOACCOUNTING. DATA: L_WERKS TYPE WERKS_D, L_UEPOS TYPE VBAP-UEPOS. DATA:IT_COND TYPE MMPUR_TKOMV. DATA:WA_COND TYPE LINE OF MMPUR_TKOMV. DATA:L_MATNR TYPE MATNR. CLEAR: PO_LINE, LS_EBAN, IM_HEADER, HEADER. IM_HEADER = IM_ITEM->GET_HEADER( ). CHECK IM_HEADER IS NOT INITIAL. HEADER = IM_HEADER->GET_DATA( ). CHECK HEADER IS NOT INITIAL. * CHECK HEADER-BSART <> 'ZNB3' AND HEADER-BSART <> 'ZNB7'. PO_LINE = IM_ITEM->GET_DATA( ). CHECK PO_LINE IS NOT INITIAL. "PO数量不允许超过未清PR数量 IF PO_LINE-BANFN IS NOT INITIAL AND PO_LINE-BNFPO IS NOT INITIAL. SELECT SINGLE * INTO LS_EBAN FROM EBAN WHERE BANFN = PO_LINE-BANFN AND BNFPO = PO_LINE-BNFPO. CHECK SY-SUBRC = 0. SELECT SUM( MENGE ) AS MENGE INTO L_MENGE FROM EKPO WHERE BANFN = PO_LINE-BANFN AND BNFPO = PO_LINE-BNFPO AND ( EBELN NE PO_LINE-EBELN OR EBELP NE PO_LINE-EBELP ) AND LOEKZ = ''. LS_EBAN-MENGE = LS_EBAN-MENGE - L_MENGE. IF PO_LINE-MENGE > LS_EBAN-MENGE. MMPUR_MESSAGE 'W' '06' '076' PO_LINE-MATNR PO_LINE-EBELP '' ''. ENDIF. ENDIF. 更新价格, 对于铁配订单, 自动更新每一行价格类型PBXX, 从物料主数据中取得税价1, 对于NDK2的物料, 需要取到对应销售订单行项目中的本体物料 DATA L_BWPRS TYPE MBEW-BWPRS. IF HEADER-BSART = 'Z6' AND ( HEADER-EKGRP = 'P10' OR HEADER-EKGRP = 'P11' OR HEADER-EKGRP = 'P12' ). CALL METHOD IM_ITEM->GET_CONDITIONS IMPORTING EX_CONDITIONS = IT_COND. LOOP AT IT_COND INTO WA_COND WHERE KSCHL = 'PBXX'. CLEAR WA_COND-KBETR. IF PO_LINE-MTART = 'NDK2'. CLEAR L_MATNR. SELECT SINGLE ZZMAT INTO L_MATNR FROM VBAP WHERE VBELN = MEPOACC-VBELN AND POSNR = MEPOACC-VBELP. SELECT SINGLE BWPRS INTO L_BWPRS FROM MBEW WHERE MATNR = L_MATNR AND BWKEY = PO_LINE-WERKS. ELSE. SELECT SINGLE BWPRS INTO L_BWPRS FROM MBEW WHERE MATNR = PO_LINE-MATNR AND BWKEY = PO_LINE-WERKS. ENDIF. IF L_BWPRS > 0. WA_COND-KBETR = L_BWPRS. WA_COND-KBETR = WA_COND-KBETR * 100. * WA_COND-KWERT = WA_COND-KBETR * PO_LINE-MENGE / 1000. WA_COND-KPEIN = 117. MODIFY IT_COND FROM WA_COND. ENDIF. EXIT. ENDLOOP. CALL METHOD IM_ITEM->SET_CONDITIONS EXPORTING IM_CONDITIONS = IT_COND. PO_LINE-MWSKZ = 'J1'. ENDIF. 根据物料组更新过量交货限度 SELECT SINGLE UEBTO INTO PO_LINE-UEBTO FROM ZTUEB WHERE MATKL = PO_LINE-MATKL. IM_ITEM->SET_DATA( PO_LINE ).
参考地址:https://blog.csdn.net/qq_32198063/article/details/135987959

浙公网安备 33010602011771号