【MM采购定价】怎么样实现创建采购订单的时候,采购价格不可以更改?

由于某些业务要求,要求在创建采购订单的时候采购价格不能手工输入,实现方法有:

第一个方法:

缺点:这个方法一刀切,会把所有类型的采购订单设置为采购价格不能修改。

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里的价格;

  

转载于:https://www.cnblogs.com/potatoo/p/6890511.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值