2.1 程序说明
保存时:
1. 控制订单抬头交货地址必须输入
2. 控制价格与信息记录中的价格一致
输入行项目时:
1. 控制PO数量不允许超过未清PR数量
2. 更新价格
3. 根据物料组更新过量交货限度
2.2 程序实现
(1) 在BADI: ZME_PROCESS_PO_CUST的方法POST中增强:
参考销售订单的采购时, 如果采购订单与销售订单工厂不相同, 则需要控制交货地址必须输入
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 ).