“实现主从关系Form中汇总行金额/数量”,这句话在百度一搜,你就会看到N多篇文章专门讲这个东西,出处基本都是张老大提供的技术文档
想当初俺也意识到这是个不错的东西收藏了一下,这不,现在实际的用上了!
但是按照该文章讲的方法做,出现了几个问题。
1. 头在post_query之后total_amount虽有赋值动作,但是又马上变成0了!
2. 行BLOCK如果设置为不能删除,点击删除按钮会不停地扣减合计金额。
3. 行上单独查询出一行进行更改,保存,之后再次查询,合计金额显示错误。
之后继续搜了下,通过以下文章头2个问题得到了解决:
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;