oracle form 头行合计,实现主从关系Form中汇总行金额/数量

实现主从关系Form中汇总行金额/数量

在Oracle EBS的二次开发中,常有在主从关系的主块中需要显示明细块中金额或数量的汇总,在Oracle Form Builder中实际上提供了汇总的功能,但它的这个汇总功能的前提是汇总的明细块需要一次性查询出所有的数据,这对于基于B/S架构的EBS应用来说显然是不合适的,因此Oracle专门包装了一个汇总计算的方法 app_calculate.running_total 来解决这个问题。

下面以实际的例子来描述如何实现汇总计算,效果图如下:

背景说明:

头块中的Total字段(HEADERS.AMOUNT_TOTAL)汇总行上面Amount(LINES.AMOUNT)

行中的Amount是Unit Price(lines.unit_price)和Quantity(lines.quantity)的乘积

Unit Price和Quantity的任何更改会导致Amount发生改变,最终影响Total值

实现步骤:

1,创建合计显示字段,即HEADERS.AMOUNT_TOTAL,设置其子类属性为:TEXT_ITEM_DISPLAY_ONLY

2,在合计显示的数据块中,创建合计项目的汇总临时项目,命名规则为:_RTOT_DB,NUMBER(38)/DISPLAY_ITEM,即AMOUNT_RTOT_DB/NUMBER(38)/DISPLAY_ITEM

3,在明细块中创建两个统计使用的item,一个_RTOT_OLD,另一个_RTOT_DB,类型 CHAR(61) DISPLAY_ITEM,即AMOUNT_RTOT_OLD/CHAR(61)/DISPLAY_ITEM 和 AMOUNT_RTOT_DB/CHAR(61)/DISPLAY_ITEM

4,包装一下app_calculate.running_total方法,让其对明细块中的Amount进行汇总计算

procedure running_total (event varchar2) is

begin

app_calculate.running_total(event,'LINES.AMOUNT','HEADERS.AMOUNT_TOTAL');

end running_total;

5,在引发Amount变化的两个Item的WHEN-VALIDATE-ITEM触发器中调用app_calculate.running_total运算汇总值,Item的Handler代码如下:

procedure unit_price (event varchar2) is

begin

if event = 'WHEN-VALIDATE-ITEM' then

lines.amount('INIT');

lines.running_total('WHEN-VALIDATE-ITEM');

end if;

end unit_price;

procedure quantity (event varchar2) is

begin

if event = 'WHEN-VALIDATE-ITEM' then

lines.amount('INIT');

lines.running_total('WHEN-VALIDATE-ITEM');

end if;

end quantity;

6,创建Amount的Handler代码

procedure amount (event varchar2) is

begin

if event = 'INIT' then

copy(name_in('lines.unit_price') * name_in('lines.quantity'),'lines.amount');

end if;

end amount;

7,在汇总显示项目所在块中的POST-QUERY触发器中从数据库中计算出明细的初始汇总值

procedure post_query is

begin

select nvl(sum(unit_price*quantity),0)

into :headers.amount_total

from xhu_order_lines

where header_id = :headers.header_id ;

end post_query;

8,在明细块的以下触发器中添加相应的代码

--KEY-DELREC

lines.running_total('KEY-DELREC');

Delete_Record;

--KEY-DUPREC

lines.running_total('KEY-DUPREC');

duplicate_record;

--KEY-CLRREC

lines.running_total('KEY-CLRREC');

app_folder.event('KEY-CLRREC');

--WHEN-CLEAR-BLOCK

lines.running_total('WHEN-CLEAR-BLOCK');

--POST-QUERY

lines.running_total( 'POST-QUERY' );

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值