SAP-采购订单相关增强出口

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 ).

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小啊曼

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值