在Oracle EBS的二次开发中,常有需要显示某个数据块中金额或数量的汇总等等。
我们都知道,在Oracle Form Builder中有提供了汇总的功能,但它的这个汇总功能的前提是汇总的明细块需要一次性查询出所有的数据!
这对于基于B/S架构的EBS应用来说显然是不合适的。数据量少的话还好,一旦数据量超过1W行,速度就会慢起来。而且大大增加Form应用的负担。
最近研究过才知道,其实Oracle Form提供了一种另外的汇总办法"预汇总的设定"来解决这个问题。
就是Block属性的:Precompute Summaries:
作用:在Data Block进行正常查询前,进行Summarized item计算 (Default:No)
注:当设置为Yes时,适用于Data Block中存在汇总项的情况,并且此时还要保证Block的Query All Records属性设置为No.
只要Block的Precompute Summaries设置为Y了,就可以用汇总的Item。
2013.2.7新增:
另外必须要注意的,基于预汇总查询的逻辑是用SQL汇总栏位,所以对应的汇总的Item必须是数据库的Item,否则编译的时候会报错:
FRM-30426: Summarized control item must reside in a control block, or in a block with Query All Records set to Yes.
Item: SUM_RETURN_QTY
Block: MOVE_QUERY_CONTROL
解决方法:
1 当然,非数据库的Item就不要汇总栏位的,最简单的解决~
2 在视图增加一个虚拟栏位。例如TO_NUMBER(NULL) XXX_COLUMN。然后就可以用汇总了。
-------------------
经过跟踪确认,其实当Precompute Summaries='Y',它可以找到汇总的值的原理是:在用户查询该Block的时候,Form自动用SQL获取对应的要汇总的Item的值,再是查询实际Form明细的SQL:
SELECT COUNT(TOL_HOLE)
,SUM(TOL_HOLE)
,COUNT(TOL_BLACKAREA)
,SUM(TOL_BLACKAREA)
,COUNT(MOVE_RETIRE_QUANTITY)
,SUM(MOVE_RETIRE_QUANTITY)
,COUNT(MOVE_DLV_QUANTITY)
,SUM(MOVE_DLV_QUANTITY)
,COUNT(MOVE_TRX_SQM)
,SUM(MOVE_TRX_SQM)
,COUNT(MOVE_TRX_QUANTITY)
,SUM(MOVE_TRX_QUANTITY)
,COUNT(SUGGEST_QUANTITY)
,SUM(SUGGEST_QUANTITY)
,COUNT(JOB_QUANTITY)
,SUM(JOB_QUANTITY)
FROM XYG_WIP_MOVE_TRANSACTION_V
WHERE (MAKE_DATE BETWEEN TO_DATE('2012/02/01 00:00:00'
,'YYYY/MM/DD HH24:MI:SS'
)
AND TO_DATE('2012/02/01 23:59:59'
,'YYYY/MM/DD HH24:MI:SS'
))
AND (FACTORY = :1)
AND (ORGANIZATION_ID = :2)
ORDER BY LINE_ID
跑完上面的获取汇总的值的SQL之后,再是获取明细的值:
SELECT * FROM XYG_WIP_MOVE_TRANSACTION_V
WHERE (MAKE_DATE BETWEEN TO_DATE('2012/02/01 00:00:00'
,'YYYY/MM/DD HH24:MI:SS'
)
AND TO_DATE('2012/02/01 23:59:59'
,'YYYY/MM/DD HH24:MI:SS'
))
AND (FACTORY = :1)
AND (ORGANIZATION_ID = :2)
ORDER BY LINE_ID