由于某些业务要求,要求在创建采购订单的时候采购价格不能手工输入,实现方法有:
第一个方法:
缺点:这个方法一刀切,会把所有类型的采购订单设置为采购价格不能修改。
1.使用field selection把价格字段设置为显示(路径:IMG-->物料管理-->采购-->采购订单-->定义凭证层的屏幕格式 价格/数量屏幕)
2.将条件类型中的 人工输入项设置为 D。
第二个方法:
增强,增强代码如下:(虽然现在自己看不懂,还是先收藏了吧)
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.
第三种方法:使用采购员参数控制一些字段 EVO EFB
1.维护采购员参数
事务码:OMFI (路径:IMG-->物料管理-->采购-->环境数据-->定义采购员的缺省值)
2.分配给采购员
事务码:SU01 SU3
当存在采购信息记录,但采购信息记录中不存在有效的价格时,系统则可以复制才采购信息记录中的上一张采购订单中的采购价格到当前采购订单,系统复制时,不仅复制上一张采购订单的采购单价(一版为条件类型PBXX),如果有其他条件类型(如运费),系统也会复制上一张采购订单的运费到当前采购订单。
系统复制采购价格的优先级为:
1.存在有效价格的采购信息记录(创建PO的时候设置信息记录不更新);
2.不存在有效价格的PIR,会复制这个PIR里的上一张PO里的价格(包括PBXX或者运费之类的,设置信息记录更新);
3.存在有有效价格的PIR,设置信息记录更新,再次创建相同供应商相同物料的PO时,因为存在有效价格的信息记录,系统不会复制上一张PO里的价格,会建议PIR里的价格;