在报表项目中,经常有多个报表的数据源计算方法有共同的部分。使用润乾集算报表,采用可挂接算法的方案时(参见http://blog.raqsoft.com.cn/?p=644),可以更方便地将这些共同部分用同一个脚本来完成,从而实现算法复用。算法复用的好处是:一个算法只实现一次,不会出现同一个算法多处实现导致不一致的情况。同时也避免一个算法实现很多次的重复劳动,减轻工作量。
下面通过两个报表复用同一个算法的例子来看一下具体的实现方法。报表1是“员工绩效工资明细表”,可以按照STATE来选择不同的员工例如:STATE=="California" 或者STATE=="Texas",如下图:
报表2是“部门绩效工资汇总表”(全体员工,不按照STATE过滤),如下图:
报表1、2都要计算员工的绩效工资,算法是比较复杂的。如果两个报表都实现一遍这个计算,会有两个问题:一个是重复工作费时费力,另一个是一旦计算方法发生改变,就要修改两个地方,可能会出现不一致。使用集算报表可以用一个计算脚本来编写绩效工资算法,实现两个报表复用一个脚本。
集算报表还可以完成动态表达式解析,所以可以接收非常灵活的过滤条件或者其他表达式。集算引擎的参数定义如下图:
集算报表的计算脚本(salary.dfx)如下:
A3:判断过滤条件是否为空,如果为空就不执行过滤B3。
B3:按照条件过滤。这里使用宏来实现动态解析表达式,其中的where就是传入参数。集算器先计算${…}里的表达式,将计算结果作为宏字符串值替换${…}之后解释执行。这个例子中最终执行的是:[email protected](STATE=="California" || STATE=="Texas")。
A13单元格是将结果返回给报表页面。A4到A13之间是绩效工资的计算方法,不是本文重点,这里不详细介绍。如果where= STATE=="California" || STATE=="Texas"。A13的返回结果如下:
如果where=””,A13的返回结果如下:
报表1的模板设计如下图:
报表1数据集ds1定义如下:
虽然报表内容、样式不同,但是两个报表的数据集都调用一个共同的脚本文件。如果将来绩效工资的计算方法发生变化,只要修改salary.dfx即可,报表1、2的模板文件不用改变。