你的位置:首页 > 数据库

[数据库]集算器如何优化复杂报表计算(1)数据源集


集算器协助报表计算的例子很多,但大多数计算困难都发生在数据进入报表工具之前,如上面列举的文本计算和SQL协助中就有许多案例是针对报表开发的。除此之外,还有些复杂计算是发生在报表工具环节内,以及某些并非由于计算困难导致但可以用数据源计算来解决的报表难题。这里我们来讨论集算器在这些场合下对报表工具的协助作用。

数据源集

动态数据源

报表工具中某个报表使用到的数据源通常是确定的,报表的参数通常只用于数据集的选出条件(即SQL的WHERE部分)而不会用来选择数据源,如果我们希望某个报表使用的数据源是由参数决定的,这对于大多数报表工具来讲都能直接做到,一般都需要采用报表工具提供的API编程才行,非常繁琐。

如果采用集算器就非常简单。可将集算器作为报表的固定数据源,然后在集算脚本中再根据参数再决定连接实际的数据源取数据返回。

        

A

1

=${pds}.query("select * from T where F=?",pF)


数据源名称用参数pds进来,报表工具本身不必支持动态多数据源了。

类似地,有些报表工具要求主子报表必须用同一个数据源,当需要主子报表用不同数据源时,也可以采用这个办法,把集算器作为主子报表的共同数据源,而实际数据源在集算脚本中根据参数决定。

 

动态数据集

报表工具中,报表参数通常会用作数据集选出条件的参数,也就是SQL的参数。但有时我们需要替换SQL的一部分而不能只用参数,比如整个WHERE部分是作为参数传入的,这样可能获得更灵活的查询条件。

某些报表工具支持宏,可以做到这一点。对于不支持宏的报表工具,就只能再使用报表工具提供的API用代码去改写报表模板的数据集定义,相当繁琐。用集算器就很简单:

        

A

 

1

="select * from T" + if(where!=""," where "+where,"")

拼上where,空则不拼

2

=db.query(A1)

 


 即使支持宏的报表工具,有些SQL也不易拼出。比如希望按传入的字段列表做合计,就要在这些字段上拼加sum(),而报表工具通常没有直接变换串的手段,又必须使用API去处理,或者在上层事先拼好。这时用集算器也都很容易处理。

        

A

 

1

=sums.array().("sum("+~+") as "+~).string()

把a,b变成sum(a) as a,sum(b) as b

2

=db.query("select G,"+A1+" from T group by G")

 


取数限制

由于容量有量,我们要求报表最多取出10000行数据,如果没有取完要再补一行标记有“继续”的记录,这样可以显示出数据是否完整。但报表工具通常只能执行确定的取数语句,这种灵活控制又需要复杂代码调用API来实现。

集算器用代码控制这个过程很轻松:

        

A

B

 

1

=db.cursor("select * from T")

=A1.fetch(1000)

 

2

if A1.fetch@0(1)

>B1.insert(0,"继续")

未完成则插入标记

3

>A1.close()

return B1