Form Block的属性"Precompute Summaries"使用

在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

 

<think>我们正在查找与“precompute_sin_cos”函数相关的信息。用户希望了解如何在编程中使用或实现该函数。根据引用内容,我们注意到用户之前遇到的问题与RuntimeError:implement_array_functionmethodalreadyhasadocstring有关,但这似乎与当前问题无关。因此,我们将忽略这些引用,专注于用户的新问题。precompute_sin_cos函数通常用于预先计算正弦和余弦值,以避免在循环中重复计算,从而优化性能。这在图形学、信号处理或需要大量三角运算的场合很常见。实现思路:1.确定需要预先计算的角度范围(例如0到2π)和步长(分辨率)。2.创建一个数组(或两个数组,分别存储正弦和余弦值)。3.遍历每个角度,计算其正弦和余弦值并存储。使用示例:在需要正弦或余弦值的地方,通过角度索引直接查找预先计算好的值,而不是调用math.sin或math.cos。由于用户没有指定具体编程语言,我们以Python为例提供一个简单实现。</think> 关于`precompute_sin_cos`函数的使用与实现方法,以下是具体解释和代码示例: ### 函数作用 `precompute_sin_cos`主要用于**预先计算并存储三角函数值**(如正弦/余弦),在需要频繁调用三角函数时(如3D旋转、信号处理)可以: 1. 避免重复计算带来的性能开销 2. 减少浮点运算误差累积 3. 适用于实时渲染、物理模拟等场景 ### 实现方法(Python示例) ```python import math def precompute_sin_cos(resolution=360): """ 预先计算0°-360°的sin/cos值 :param resolution: 角度分割精度(默认1°) :return: (sin_table, cos_table) 两个列表 """ sin_table = [] cos_table = [] for angle in range(resolution): rad = math.radians(angle) # 角度转弧度 sin_table.append(math.sin(rad)) cos_table.append(math.cos(rad)) return sin_table, cos_table # 使用示例 sin_cache, cos_cache = precompute_sin_cos() # 快速获取60°的三角函数值 print(f"sin(60°) = {sin_cache[60]:.4f}") # 输出: sin(60°) = 0.8660 print(f"cos(60°) = {cos_cache[60]:.4f}") # 输出: cos(60°) = 0.5000 ``` ### 关键优化技巧 1. **内存换速度**:空间复杂度$O(n)$换取$O(1)$查询时间 2. **角度量化**:使用整型索引代替浮点角度 `index = int(angle % 360)` 3. **线性插值**:高精度场景可在相邻缓存值间插值: ```python def get_sin(angle, table): idx = int(angle) frac = angle - idx return table[idx] * (1-frac) + table[idx+1] * frac ``` ### 应用场景 - 游戏开发:角色旋转/相机变换 $$ \begin{pmatrix} x' \\ y' \end{pmatrix} = \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} $$ - 信号处理:FFT频域分析 - 物理引擎:刚体动力学计算 - 计算机视觉:图像旋转变换 ### 相关扩展问题 1. 如何实现动态精度的三角函数预计算? 2. 预计算数值的误差范围如何控制? 3. 在GPU编程中如何优化三角函数查询? 4. 除了正弦/余弦,哪些函数适合预计算? 5. 内存受限场景下如何平衡缓存大小与精度? > 注意:具体实现需根据语言特性调整,C++可使用`std::vector`,JS可使用TypedArray,GPU着色器建议使用纹理存储查询表[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值