You are on page 1of 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