2007年1月26日 星期五

Advance Pricing -- Formula and Custom Price Function

在測試MST轉播計價時
發現Price List除了用item number每一筆設定單價外
可以用Formula與All item的方式
一次就給所有的item一個function當價格的邏輯
以下為相關的步驟
(雖然後來才知道MST inter-company有另外的設定
但這部份可以應用在非 inter-company的範圍)

1. 新增Pricing Formula:

* Formula type設定為"Function"
它其實會去執行 QP_CUSTOM.GET_CUSTOM_PRICE這個程式


2. 建立Get Custom Price的package body:

*須特別注意的是Formula id
首先要找出剛剛定義的Formula它的id是多少
透過if block定義該Formula所對應的程式

當有多個Formula時..也可以由Formula id的區分同時定義在這個Function中

CREATE or REPLACE PACKAGE BODY QP_CUSTOM AS
FUNCTION Get_Custom_Price (p_price_formula_id IN NUMBER,
p_list_price IN NUMBER,
p_price_effective_date IN DATE,
p_req_line_attrs_tbl IN QP_FORMULA_PRICE_CALC_PVT.REQ_LINE_ATTRS_TBL)
RETURN NUMBER
is
v_request_item varchar2(240);
BEGIN
if p_price_formula_id = 10045 then
for i in 1..p_req_line_attrs_tbl.count loop
if p_req_line_attrs_tbl(i).attribute_type = 'PRODUCT' and p_req_line_attrs_tbl(i).context = 'ITEM' and p_req_line_attrs_tbl(i).attribute = 'PRICING_ATTRIBUTE1' then
v_request_item := p_req_line_attrs_tbl(i).value;
end if;
end loop;
return to_number(v_request_item);
/* get cost from item id in v_request_item*/
end if;
end get_custom_price;
END QP_CUSTOM;
/
commit
/

3. 執行Concurrent去重建Formula Package:

* 執行"Build Formula Package".

4. 建立Price List:

* 用All item的方法對每一個UOM都指定Dynamic Formulas為剛剛設定的Formula.


5. 執行Concurrent去重建 Attribute Mapping:

* 執行 "Build Attribute Mapping Rules".

*** IMPORTANT ****
1. 靈異現象
當一開始作上面的設定時
會發現All item+Formula是失效的..
Trace程式發現Get_Custom_Price裡面並沒有抓到PRICE_ATTRIBUTE1 (item id)
而只有抓到PRICE_ATTRIBUTE3(All item)
這樣無法依每一個item去做價格的邏輯

但如果再Price List上給一個指定的料號
一樣設其Dynamic Formulas為剛剛設定的Formula
重跑一次..
Get_Custom_Price裡面就可以抓到PRICE_ATTRIBUTE1 (item id)
而且是所有item的item id

因此在這個類似Bug的狀況下
我會先加一次指定的item到Price List上
確認所有item都可以正確運作後
再移除這個指定的item...使Price List上仍只有All item的簡潔設定

2. MTL的部份
要改的不是Get_Custom_Price
而是MTL_INTERCOMPANY_INVOICE.get_transfer_price

沒有留言: