天天看點

FORM主從塊頭行金額彙總

“實作主從關系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;