ZXM06U4*SMOD ----->Enhancement name :MM06E005---->EXIT_SAPMM06E_017
*&---------------------------------------------------------------------*
*& 包括 ZXM06U42
*&---------------------------------------------------------------------*
************************************************************************************************************************
**控制NB采购订单必须有采购信息记录
**对“NB”标准PO创建进行检查控制:1000
** 1>采购物料必须具有采购信息记录;
** 2>不允许手工直接修改采购价格;
*************************************************************************************************************************
******* 变量定义 Start************
DATA:BEGIN OF it_a017 OCCURS 0,
lifnr LIKE a017-lifnr,
matnr LIKE a017-matnr,
ekorg LIKE a017-ekorg,
werks LIKE a017-werks,
esokz LIKE a017-esokz,
knumh LIKE a017-knumh, " (条件号码)头
datbi LIKE a017-datbi,
datab LIKE a017-datbi, " (生效\失效日期)
END OF it_a017.
DATA:l_kbetr LIKE konp-kbetr, "信息记录净价
l_mxwrt LIKE konp-mxwrt, "信息记录下限值
l_gkwrt LIKE konp-gkwrt, "信息记录上限值
min_kbetr LIKE konp-kbetr,
max_kbetr LIKE konp-kbetr,
l_netpr LIKE i_ekpo-netpr,
l_preis LIKE eban-preis,
l_infnr LIKE eina-infnr,
l_kbetr1 LIKE konp-kbetr.
DATA:it_eine TYPE STANDARD TABLE OF eine,
it_eina TYPE STANDARD TABLE OF eina,
it_konm TYPE TABLE OF konm WITH HEADER LINE.
******* 变量定义 End************
CHECK sy-tcode = 'ME21N' OR sy-tcode = 'ME22N' OR sy-tcode = 'ME23N' . "因为用ME21N或ME23N进去更改,而事务代码不会变成ME22N.
*判断采购信息记录是否一般完整数据”删除“标识
SELECT SINGLE infnr INTO l_infnr
FROM eina
WHERE lifnr = i_ekko-lifnr
AND matnr = i_ekpo-ematn
AND loekz = '' .
*判断采购信息记录是否采购组织数据”删除“标识
SELECT *
INTO CORRESPONDING FIELDS OF TABLE it_eine
FROM eine
WHERE ekorg = i_ekko-ekorg
AND werks = i_ekpo-werks
AND esokz = i_ekpo-pstyp
AND loekz = ''
AND infnr = l_infnr.
*取采购信息相关有效期间净价价格条件数据
CLEAR: it_a017,it_a017[].
SELECT lifnr
matnr
ekorg
werks
esokz
knumh
datbi
datab
INTO TABLE it_a017
FROM a017
WHERE kappl = 'M' " (采购标记)
AND kschl = 'PB00' " (标准采购订单)
AND lifnr = i_ekko-lifnr
* AND MATNR = I_EKPO-MATNR
AND matnr = i_ekpo-ematn
AND ekorg = i_ekko-ekorg
AND werks = i_ekpo-werks
AND esokz = i_ekpo-pstyp.
SORT it_a017 BY lifnr.
LOOP AT it_a017 .
IF i_ekko-bedat NOT BETWEEN it_a017-datab AND it_a017-datbi.
DELETE it_a017 .
ELSE.
SELECT SINGLE kbetr mxwrt gkwrt
INTO (l_kbetr,l_mxwrt,l_gkwrt)
FROM konp
WHERE knumh = it_a017-knumh AND loevm_ko <> 'X' ." (删除码标示);
**********************************************************************
*&1、对于存在阶梯价格的采购信息记录,根据数量阶梯在表KONM中存在不同价格;
*&2、获取采购订单数量大于阶梯价格表中的价格数据,并根据倒序排序获取价格;
**********************************************************************
SELECT *
INTO TABLE it_konm
FROM konm
WHERE knumh = it_a017-knumh
AND kstbm <= i_ekpo-menge.
SORT it_konm BY kstbm DESCENDING.
READ TABLE it_konm INDEX 1.
ENDIF.
ENDLOOP.
FREE: it_a017.
l_netpr = i_ekpo-netpr. "采购订单净价
READ TABLE tekpo WITH KEY ebeln = i_ekpo-ebeln ebelp = i_ekpo-ebelp.
IF sy-subrc = 0.
IF i_ekko-bstyp = 'F' AND i_ekko-bsart = 'NB' AND i_ekpo-retpo = '' AND i_ekpo-repos = 'X' AND
i_ekpo-knttp <> 'F' AND i_ekpo-knttp <> 'A' AND i_ekpo-knttp <> 'K' AND i_ekpo-loekz = '' AND i_ekko-unsez = '' .
IF i_ekpo-werks = '1000' AND i_ekpo-satnr = '' . "排除可配置物料不需要检查
* IF L_KBETR = 0 OR L_NETPR = 0.
IF it_konm IS NOT INITIAL AND it_konm-kbetr <> l_netpr.
MESSAGE '物料采购订单价格不与信息记录阶梯有效价格一致!(ZXM06U42)' TYPE 'E' .
ENDIF.
IF it_konm IS INITIAL AND l_kbetr <> l_netpr.
MESSAGE '物料必须要有有效日期采购价格,不允许手工维护价格!(ZXM06U42)' TYPE 'E' .
ENDIF.
IF l_infnr = '' OR it_eine IS INITIAL. "采购信息记录删除标识
MESSAGE '物料采购信息记录标志"删除",不允许手工维护价格!(ZXM06U42)' TYPE 'E' .
ENDIF.
ENDIF.
ENDIF.
ENDIF.
******************************
DATA:l_bstrf TYPE marc-bstrf.
SELECT SINGLE bstrf
INTO l_bstrf
FROM marc
WHERE matnr = i_ekpo-matnr
AND werks = i_ekpo-werks.
* IF l_bstrf <> 0.
* MESSAGE E001(00) WITH '物料' i_ekpo-matnr '设置了最小包装数量' l_bstrf DISPLAY LIKE 'I' .
* ENDIF.
*************************************************************************************************************************
*&采购订单下达数量不能超过采购申请未清数量;
*&采购订单必须参考采购申请下达;
*************************************************************************************************************************
IF i_ekko-bstyp = 'F' AND i_ekko-bsart = 'NB' AND i_ekpo-retpo = '' AND i_ekpo-repos = 'X' AND i_ekpo-knttp <> 'F'
AND i_ekpo-knttp <> 'A' AND i_ekpo-knttp <> 'K' AND i_ekpo-werks = '1000' AND i_ekpo-loekz = '' AND i_ekko-unsez = '' .
DATA:it_eban TYPE STANDARD TABLE OF eban,
wa_eban LIKE LINE OF it_eban,
it_ekpo TYPE STANDARD TABLE OF ekpo,
wa_ekpo LIKE LINE OF it_ekpo.
DATA:l_tabix TYPE sy-tabix.
LOOP AT tekpo WHERE loekz IS INITIAL
AND banfn IS INITIAL.
MESSAGE '采购订单必须参考采购申请下达!(ZXM06U42)' TYPE 'E' .
ENDLOOP.
* 采购申请数量
SELECT *
INTO CORRESPONDING FIELDS OF TABLE it_eban
FROM eban
WHERE banfn = i_ekpo-banfn
AND bnfpo = i_ekpo-bnfpo
.
* 采购订单已使用数量
SELECT *
INTO CORRESPONDING FIELDS OF TABLE it_ekpo
FROM ekpo
WHERE banfn = i_ekpo-banfn
AND bnfpo = i_ekpo-bnfpo
AND loekz = space
.
"排除本次修改的pr转po的数量
DELETE it_ekpo WHERE ebeln = i_ekpo-ebeln.
* 计算采购申请剩余数量
IF it_ekpo IS NOT INITIAL.
LOOP AT it_eban INTO wa_eban.
l_tabix = sy-tabix.
LOOP AT it_ekpo INTO wa_ekpo WHERE banfn = wa_eban-banfn
AND bnfpo = wa_eban-bnfpo.
***********************************************************
*
* 由于采购订单的单位和采购申请的单位存在不一致的情况,故而要增加单位的转换
* 采购订单数量 = 采购订单数据 * 分子 / 分母
* wa_eban-menge = wa_eban-menge - wa_ekpo-menge.
IF wa_ekpo-umren EQ 0.
wa_eban-menge = wa_eban-menge - wa_ekpo-menge.
ELSE.
wa_eban-menge = wa_eban-menge - wa_ekpo-menge * wa_ekpo-umrez / wa_ekpo-umren.
ENDIF.
*
***********************************************************
ENDLOOP.
MODIFY it_eban FROM wa_eban INDEX l_tabix.
ENDLOOP.
ENDIF.
* 判断创建PO时,数量是否超过
DATA:l_menge TYPE i, "采购订单数量
l_xd TYPE i. "下达数量
LOOP AT it_eban INTO wa_eban WHERE banfn = i_ekpo-banfn
AND bnfpo = i_ekpo-bnfpo.
l_menge = wa_eban-menge.
***********************************************************
* BEGIN:
* 由于采购订单的单位和采购申请的单位存在不一致的情况,故而要增加单位的转换
* 采购订单数量 = 采购订单数据 * 分子 / 分母
* WA_EBAN-MENGE = WA_EBAN-MENGE - I_EKPO-MENGE.
IF i_ekpo-umren EQ 0.
wa_eban-menge = wa_eban-menge - i_ekpo-menge.
ELSE.
wa_eban-menge = wa_eban-menge - i_ekpo-menge * i_ekpo-umrez / i_ekpo-umren.
ENDIF.
* END
***********************************************************
l_xd = i_ekpo-menge.
LOOP AT tekpo WHERE banfn = wa_eban-banfn
AND bnfpo = wa_eban-bnfpo
AND ebelp <> i_ekpo-ebelp "排除返回再次修改行项目数据(已存入内表数据),避免重复累计
AND loekz = space.
wa_eban-menge = wa_eban-menge - tekpo-menge.
l_xd = l_xd + tekpo-menge.
ENDLOOP.
IF wa_eban-menge < 0 AND i_ekpo-loekz = '' .
MESSAGE e001(00) WITH 'PO下达数量' l_xd ',超过PR剩余可下达数量:' l_menge.
ENDIF.
ENDLOOP.
ENDIF.
|