订单头有非数据库项 总金额(汇总行金额)
订单行有非数据库项 金额,是由行块的数据库项 数量与单价的乘积得到
头块:order_headers,总金额项:amount,行块:order_lines,金额项:amount
刚开始我准备在quantity和unit_price的when-validate-item中加入如下代码
if :order_lines.unit_price is not null and :order_lines.quantity is not null then
:order_lines.amount:=:order_lines.unit_price*:order_lines.quantity;
:order_headers.amount:=:order_headers.amount+:order_lines.amount;
end if;
当数量和单价不为空时,就计算出这一行的金额,再将原来的头总金额加上当前行金额。
但是经过测试发现很大问题,在第一次输入数量和单价之后,如果要对它们进行改动,总金额会一直增加。
参考资料后找到app_calculate.running_total方法来实现需求,这是oracle自带的汇总计算方法。
首先在头块中添加AMOUNT_RTOT_DB项(命名规则为汇总项_RTOT_DB,类型为显示项,数据类型number(38)),
行块中再添加AMOUNT_RTOT_DB,AMOUNT_RTOT_OLD都为显示项,char(61),这三项都是必须的。然后将代码改为
if :order_lines.unit_price is not null and :order_lines.quantity is not null then
:order_lines.amount:=:order_lines.unit_price*:order_lines.quantity;
app_calculate.running_total(‘WHEN-VALIDATE-ITEM‘,‘ORDER_LINES.AMOUNT‘,‘ORDER_HEADERS.AMOUNT‘);
end if;
即可。
在查询时,由于两项汇总金额都是非数据项,所已需要在头行块的post-query触发器中进行计算,行块只需求当前行的金额
:order_lines.amount:=:order_lines.quantity*:order_lines.unit_price;
头块需要查询数据库
declare
cursor cur_line is
select * from TRN_ORDER_LINES_11205
where header_id=:order_headers.header_id;
amount number(10,2):=0;
begin
for line_rec in cur_line loop
amount:=amount+line_rec.QUANTITY*line_rec.UNIT_PRICE ;
end loop;
:order_headers.amount:=amount;
end;