“實作主從關系Form中彙總行金額/數量”,這句話在百度一搜,你就會看到N多篇文章專門講這個東西,出處基本都是張老大提供的技術文檔
http://oracleseeker.com/2009/08/19/calculate_detail_amount_or_quantity_for_master_block/
想當初俺也意識到這是個不錯的東西收藏了一下,這不,現在實際的用上了!
但是按照該文章講的方法做,出現了幾個問題。
1. 頭在post_query之後total_amount雖有指派動作,但是又馬上變成0了!
2. 行BLOCK如果設定為不能删除,點選删除按鈕會不停地扣減合計金額。
3. 行上單獨查詢出一行進行更改,儲存,之後再次查詢,合計金額顯示錯誤。
之後繼續搜了下,通過以下文章頭2個問題得到了解決:
http://hgdzhuanyong.blog.163.com/blog/static/1171913832010829104125514/
1. Post_query設定total_amount之後,還需設定total_amount_rtot_db
2. Key-delerec加上CUX_PO_LINES_PKG.running_total('UNDELETE');
至于第三個問題,我的作法是這樣的:
在行的POST_QUERY之後繼續做一遍頭的POST_QUERY指派TOTAL_AMOUNT
這裡整理一下暫時看着還沒有bug的主從金額彙總方法:
說明:
主塊CUX_OM_HEADER.TOTAL_AMOUNT需要彙總從塊CUX_OM_LINE.LINE_AMOUNT,LINE_AMOUNT根據CUX_OM_LINE.ORDER_QUANTITY* CUX_OM_LINE.UNIT_SELLING_PRICE計算得到
步驟:
1. 在主塊CUX_OM_HEADER建立零時彙總項目,:<合計項目名稱>_RTOT_DB,NUMBER(38)/DISPLAY_ITEM, TOTAL_AMOUNT_RTOT_DB,非資料庫項,不顯示
2. 在從塊建立2個零時統計項目,一個<被統計項>_RTOT_OLD,另一個<被統計項>_RTOT_DB,類型 CHAR(61) DISPLAY_ITEM,LINE_AMOUNT_RTOT_DB、LINE_AMOUNT_RTOT_OLD,非資料庫項,不顯示
3. 計算彙總調用的方法:
--計算彙總金額
PROCEDURE running_total(p_event VARCHAR2) IS
BEGIN
app_calculate.running_total(p_event, 'CUX_OM_LINE.LINE_AMOUNT', 'CUX_OM_HEADER.TOTAL_AMOUNT');
END running_total;
4. 數量或者單價更改,WHEN-VALIDATE-ITEM
CUX_OM_LINE_PKG.event('AMOUNT_INIT');
CUX_OM_LINE_PKG.running_total('WHEN-VALIDATE-ITEM');
包計算行金額
ELSIF p_event = 'AMOUNT_INIT' THEN
:CUX_OM_LINE.LINE_AMOUNT := :CUX_OM_LINE.ORDER_QUANTITY * :CUX_OM_LINE.UNIT_SELLING_PRICE;
5. 主塊POST_QUERY
cux_om_header_pkg.event('POST-QUERY');
SELECT nvl(SUM(cola.order_quantity * cola.unit_selling_price), 0)
INTO :cux_om_header.total_amount
FROM cux_order_lines_all cola
WHERE cola.cux_order_header_id = :cux_om_header.cux_order_header_id;
:cux_om_header.total_amount_rtot_db := :cux_om_header.total_amount;
6. 從快觸發器
KEY-DELREC
CUX_OM_LINE_PKG.running_total('KEY-DELREC');
delete_record;
CUX_OM_LINE_PKG.running_total('UNDELETE');
KEY-DUPREC
CUX_OM_LINE_PKG.running_total('KEY-DUPREC');
duplicate_record;
KEY-CLRREC
CUX_OM_LINE_PKG.running_total('KEY-CLRREC');
app_folder.event('KEY-CLRREC');
WHEN-CLEAR-BLOCK
CUX_OM_LINE_PKG.running_total('WHEN-CLEAR-BLOCK');
POST-QUERY
app_folder.event('POST-QUERY');
app_globe.event('POSET-QUERY');
CUX_OM_LINE_PKG.event('AMOUNT_INIT');
CUX_OM_LINE_PKG.running_total('POST-QUERY');
if :system.trigger_record =1 then
SELECT nvl(SUM(cola.order_quantity * cola.unit_selling_price),0)
INTO :CUX_OM_HEADER.total_amount
FROM cux_order_lines_all cola
WHERE cola.cux_order_header_id = :CUX_OM_HEADER.cux_order_header_id;
:CUX_OM_HEADER.TOTAL_AMOUNT_RTOT_DB:=:CUX_OM_HEADER.total_amount;
end if;