润乾报表性能管理之表达式预解析

功能背景

由于单元格是扩展的,设计时只有一个单元格,运算后,可能扩展出n个单元格。如果在单元格扩展前先对表达式进行解析,把能够算出来的部分先算,或者需要引用的变量先进行

定位,就不需要在扩展后重复的运算n遍,或者对变量定位n次。

举例:
1、 表达式中的常量计算:某个单元格中的表达式为(5-arg1*1)*A1+(3*(arg2+3)/2),其中arg1和arg2为传入的参数值。假设arg1=2,arg2=3,此时如果在报表扩展前进行表达

式预解析,这个表达式解析后成了3*A1+9.如果这个单元格扩展了1000次,那么只需要对3*A1+9计算1000次。但是,如果不进行表达式预解析,那么需要对(5-arg1*1)*A1+(3*

(arg2+3)/2)计算1000次,相当于(5-arg1*1)和(3*(arg2+3)/2)分别被重复算了1000次。

2、 表达式中的变量引用:某个单元格中的表达式为ds1.colname,其中ds1为数据集的名字,colname为列名。该表达式进行计算时,需要先定位colname为第几个列,从而在

列对象存放数组里找到这个列。在报表扩展前进行表达式预解析时,这个表达式被解析成ds1.#n,其中n代表第几个列。这个单元格如果被扩展了1000次,那么这1000次的运算都可

以直接定位到列,不需要重复定位。

类似的预解析还很多,无法一一穷举,总之,其原则就是利用报表的扩展原理,在单元格扩展前把表达式中能计算的先算出来,能定位的先定位,避免扩展后的重复计算

实现原理:
在单元格的每次扩展前,进行表达式解析,能算的先算,能定位的先定位。

需要注意的是:
1、 可能有些不希望被预解析的函数也被预解析了,举例来说,rand()函数是生成随机数的,我希望格子扩展后每个格子生成一个随机数,结果预解析后,扩展前人家就把这

个函数算出来了,搞得每个格子的值是一样的。当然,后来rand()函数被特殊处理了一下。但是,还会不会有别的类似rand()的函数?似乎这个只有遇到了才知道,比如用户自定

义函数等。
2、 由于表达式预解析是授权文件控制的,没有开关可以配置或者控制,所以将来如果遇到上述现象,只能要求研发改程序,增加特殊判断。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值