0% found this document useful (0 votes)
416 views9 pages

PO Check Enhancement

1. This document describes how to implement a BADI to enhance purchase order tax code checks in SAP Procurement. 2. It involves viewing relevant information for ME_PROCESS_PO_CUST, creating a BADI implementation class (ZCL_IM_ME_PROCESS_PO_CUST), and implementing the PROCESS_ITEM, CHECK, and POST methods to check that purchase order items have a selected tax code. 3. The methods use the IM_HEADER and IM_ITEM interfaces to get header and item data, and output error messages if an item's tax code is empty. This enhances the standard SAP tax code check for purchase orders.

Uploaded by

詹俊儒
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
416 views9 pages

PO Check Enhancement

1. This document describes how to implement a BADI to enhance purchase order tax code checks in SAP Procurement. 2. It involves viewing relevant information for ME_PROCESS_PO_CUST, creating a BADI implementation class (ZCL_IM_ME_PROCESS_PO_CUST), and implementing the PROCESS_ITEM, CHECK, and POST methods to check that purchase order items have a selected tax code. 3. The methods use the IM_HEADER and IM_ITEM interfaces to get header and item data, and output error messages if an item's tax code is empty. This enhances the standard SAP tax code check for purchase orders.

Uploaded by

詹俊儒
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 9

1、SE18 查看 ME_PROCESS_PO_CUST 相關信息

 
2、SE19 創建 ME_PROCESS_PO_CUST 的 BADI 實現類
 
注意類名稱定義是按照以下規則:
ZCL_IM_ + BADI
其中 CL 表示 CLASS 類的意思,
IM 表示 Implement 實現的意思;
3、SE24 實現 ZCL_IM_ME_PROCESS_PO_CUST

TCODE : SE24
 METHOD if_ex_me_process_po_cust~check.

    INCLUDE mm_messages_mac. "useful macros for message handling

    DATA: lt_items       TYPE purchase_order_items,
          ls_item        TYPE purchase_order_item,
          lt_accountings TYPE purchase_order_accountings,
          ls_accounting  TYPE purchase_order_accounting,
          ls_accdata     TYPE mepoaccounting,
          ls_itemdata    TYPE mepoitem,
          lt_itemdata    TYPE TABLE OF mepoitem,
          ls_header      TYPE mepoheader,
          lt_cond        TYPE mmpur_tkomv.
    DATA:
      lv_msg TYPE char200,
      ls_cfg TYPE ztco0008_cfg.
    ls_header = im_header->get_data( ).
    "抓採購與現在成本的門檻設定
    SELECT SINGLE * INTO ls_cfg FROM ztco0008_cfg WHERE ekorg = ls_he
ader-ekorg.

    "抓本國貨幣
    SELECT SINGLE waers INTO @DATA(lv_lc) FROM t001 WHERE bukrs = @ls
_header-bukrs.

    lt_items = im_header->get_items( ).
    LOOP AT lt_items INTO ls_item.
      REFRESH: lt_accountings, lt_cond.
      APPEND ls_itemdata TO lt_itemdata.

      "CO-03 檢查內部訂單是否必填
      "開始判斷  如果有成本中心才進行 IO 的 check
      lt_accountings = ls_item-item->get_accountings( ).
      LOOP AT lt_accountings INTO ls_accounting.
        CLEAR: ls_accdata.
        ls_accdata = ls_accounting-accounting->get_data( ).

        IF ls_accdata-kostl IS NOT INITIAL.
          CLEAR lv_msg.
          CALL FUNCTION 'Z_CO_IO_INPUT_CHECK'
            EXPORTING
              im_saknr   = ls_accdata-sakto
              im_kostl   = ls_accdata-kostl
              im_aufnr   = ls_accdata-aufnr
              im_langu   = sy-langu
            IMPORTING
              ex_message = lv_msg.

          IF lv_msg IS NOT INITIAL.
            ch_failed = 'X'.
            MESSAGE e000(zco_msg) WITH lv_msg .
            EXIT.
          ENDIF.
        ENDIF.
      ENDLOOP.

      "CO-02  採購 condtion  加總後的成換成本國貨幣跟 MBEW  移動平均比


      "如果有物料且 MBEW 有移動平均價格才開始觸發比對
      DATA:
        lv_amount    TYPE kwert,
        lv_amount_lc TYPE kwert,
        lv_ratio     TYPE p LENGTH 13 DECIMALS 2,
        lv_cost      TYPE kwert.

      CLEAR:lv_amount, lv_amount_lc, lv_msg, lv_cost.

      ls_itemdata = ls_item-item->get_data( ).  "EKPO
      ls_item-item->get_conditions( IMPORTING ex_conditions = lt_cond 
). "KOMV

      "沒有門檻設定不判斷
      IF ls_cfg-threshold IS NOT INITIAL.

        IF ls_cfg-msg_type = ''.
          ls_cfg-msg_type = 'W'.
        ENDIF.
        "有物料有量才判斷
        IF ls_itemdata-matnr IS NOT INITIAL AND ls_itemdata-menge IS 
NOT INITIAL.
          "抓物料主檔現在價格
          SELECT SINGLE * INTO @DATA(ls_mbew) FROM mbew WHERE matnr = 
@ls_itemdata-matnr AND bwkey = @ls_itemdata-werks.
          "判斷是否式移動平均
          IF ls_mbew-vprsv = 'V'.
            "移動平均價=0  出警告
            IF ls_mbew-verpr = 0.
              lv_msg = |Material:{ ls_itemdata-matnr ALPHA = OUT } V 
price is zero.|.
              CONDENSE lv_msg.

              mmpur_message 'W' 'ZCO_MSG' '000' lv_msg '' '' ''.
              CONTINUE.
            ENDIF.

            lv_cost = ls_mbew-verpr / ls_mbew-peinh.

            "計算 PO condition  價值
            LOOP AT lt_cond ASSIGNING FIELD-SYMBOL(<fs>).
              lv_amount = <fs>-kwert + lv_amount.
            ENDLOOP.

            IF ls_header-waers NE lv_lc.
              "PO 幣別跟 LC 幣別不一樣要換匯
              CALL FUNCTION 'CONVERT_AMOUNT_TO_CURRENCY'
                EXPORTING
                  date             = sy-datum
                  foreign_currency = ls_header-waers
                  foreign_amount   = lv_amount
                  local_currency   = lv_lc
                IMPORTING
                  local_amount     = lv_amount_lc.

              IF sy-subrc <> 0.
                lv_msg = |Exchange Rate { ls_header-waers } to { lv_l
c } not exist (M type)|.
                CONDENSE lv_msg.

                mmpur_message 'W' 'ZCO_MSG' '000' lv_msg '' '' ''.
                EXIT.
              ENDIF.

            ELSE.
              "PO 幣別=本幣  LC=lv_amount.
              lv_amount_lc = lv_amount.
            ENDIF.
            "除數量算單價
            lv_amount_lc = lv_amount_lc / ls_itemdata-menge.
            lv_ratio = ( ( lv_amount_lc - lv_cost ) / lv_cost ) * 100 
." ( PO 成本  -  現在成本  ) /  現在成本  , +-比例)
            "超出的部分  大於  0  做檢查
            IF lv_ratio > 0 AND lv_ratio > ls_cfg-threshold.
              lv_msg = |PO cost({ lv_lc }):{ lv_amount_lc CURRENCY = 
lv_lc NUMBER = USER } exceed cur. cost { lv_ratio }%|.
              IF ls_cfg-msg_type = 'E'.
                ch_failed = 'X'.
              ENDIF.
              mmpur_message ls_cfg-msg_type 'ZCO_MSG' '000' lv_msg '' 
'' ''.
              EXIT.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDLOOP.

  ENDMETHOD.
SAP 採購訂單稅碼增強檢查
1、SE18 查看 ME_PROCESS_PO_CUST 相關信息
 
2、SE19 創建 ME_PROCESS_PO_CUST 的 BADI 實現類
 
注意類名稱定義是按照以下規則:
ZCL_IM_ + BADI
其中 CL 表示 CLASS 類的意思,
IM 表示 Implement 實現的意思;
3、SE24 實現 ZCL_IM_ME_PROCESS_PO_CUST

4、實現 PROCESS_ITEM 代碼:


METHOD IF_EX_ME_PROCESS_PO_CUST~PROCESS_ITEM.

*&================================================
==========
*& 對採購訂單行項目增加是否有選擇稅碼檢查
*& Added by liangqh 2010-07-28
*&================================================
==========

  INCLUDE MM_MESSAGES_MAC.

  DATA:
    L_ITEM TYPE MEPOITEM.            "採購訂單行項目

*--> 取得采購訂單行項目數據
  L_ITEM =  IM_ITEM->GET_DATA( ).

*--> 判斷行項目稅率是否爲空
  IF L_ITEM-MWSKZ = '' OR L_ITEM-MWSKZ IS INITIAL.
    MMPUR_MESSAGE 'E' 'ZMM01' '002' L_ITEM-EBELN L_ITEM-EBELP '' ''.
  ENDIF.
ENDMETHOD.

METHOD IF_EX_ME_PROCESS_PO_CUST~CHECK.
*&================================================
==========
*& 對採購訂單行項目增加是否有選擇稅碼檢查
*& Added by liangqh 2010-07-28
*&================================================
==========

  INCLUDE MM_MESSAGES_MAC.

  DATA:
    OBJ_ITEMS TYPE PURCHASE_ORDER_ITEMS,
    OBJ_ITEM TYPE PURCHASE_ORDER_ITEM,
    LW_HEADER TYPE MEPOHEADER,
    LW_ITEM TYPE MEPOITEM.

*-->取得訂單擡頭信息及明細數據
  LW_HEADER = IM_HEADER->GET_DATA( ).
  OBJ_ITEMS  = IM_HEADER->GET_ITEMS( ).

  LOOP AT OBJ_ITEMS INTO OBJ_ITEM.

    LW_ITEM = OBJ_ITEM-ITEM->GET_DATA( ).

*--> 判斷行項目稅率是否爲空
    IF LW_ITEM-MWSKZ = '' OR LW_ITEM-MWSKZ IS INITIAL.
      MMPUR_MESSAGE 'E' 'ZMM01' '002' LW_ITEM-EBELN LW_ITEM-EBELP '' ''.
    ENDIF.

  ENDLOOP.

ENDMETHOD.
method IF_EX_ME_PROCESS_PO_CUST~POST.
*&================================================
==========
*& 對採購訂單行項目增加是否有選擇稅碼檢查
*& Added by liangqh 2010-07-28
*&================================================
==========

  INCLUDE MM_MESSAGES_MAC.

  DATA:
    OBJ_ITEMS TYPE PURCHASE_ORDER_ITEMS,
    OBJ_ITEM TYPE PURCHASE_ORDER_ITEM,
    LW_HEADER TYPE MEPOHEADER,
    LW_ITEM TYPE MEPOITEM.

*-->取得訂單擡頭信息及明細數據
  LW_HEADER = IM_HEADER->GET_DATA( ).
  OBJ_ITEMS  = IM_HEADER->GET_ITEMS( ).

  LOOP AT OBJ_ITEMS INTO OBJ_ITEM.

    LW_ITEM = OBJ_ITEM-ITEM->GET_DATA( ).

*--> 判斷行項目稅率是否爲空
    IF LW_ITEM-MWSKZ = '' OR LW_ITEM-MWSKZ IS INITIAL.
      MMPUR_MESSAGE 'E' 'ZMM01' '002' LW_ITEM-EBELN LW_ITEM-EBELP '' ''.
    ENDIF.

  ENDLOOP.

endmethod.

You might also like