Professional Documents
Culture Documents
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.
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
*&================================================
==========
*& 對採購訂單行項目增加是否有選擇稅碼檢查
*& 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( ).
*--> 判斷行項目稅率是否爲空
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( ).
*--> 判斷行項目稅率是否爲空
IF LW_ITEM-MWSKZ = '' OR LW_ITEM-MWSKZ IS INITIAL.
MMPUR_MESSAGE 'E' 'ZMM01' '002' LW_ITEM-EBELN LW_ITEM-EBELP '' ''.
ENDIF.
ENDLOOP.
endmethod.