zoukankan      html  css  js  c++  java
  • 【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里的价格;

      

  • 相关阅读:
    想让进程后台运行,试试Linux的nohup命令,3分钟学会。
    面试官:你能说一下Redis的常见应用场景吗?
    面试被问MySQL 主从复制,怎么破?
    Spring Boot 解决跨域问题的 3 种方案!
    Kafka如果丢了消息,怎么处理的?
    惊呆,这样操作 Nginx 并发数就能达到3w?
    easyexcel 自动设置列宽(转)
    Ubuntu18.04自适应VMware调整桌面大小
    IDEA将maven项目打包时同时带上项目的maven依赖(转)
    python 定时框架APScheduler
  • 原文地址:https://www.cnblogs.com/potatoo/p/6890511.html
Copyright © 2011-2022 走看看