BIRT一般擅长处理规则一致的数据,若条件不一致的动态运算在报表中是很难实现的。常规办法是创建scripted data sources, 在该脚本源上自行处理业务逻辑把数据准备好,然后直接传给BIRT展现。但SQL或scripted data sources的方式,代码写起来非常麻烦,而且工作量很大。
比如要处理这么个场景:按照开始日期、结束日期统计一段时间内订单,但要根据起止日期的跨度长短实现按天、按周、按月、按年动态分组显示结果。查询流程如下图所示:
建议使用集算器,其丰富的集合运算可以方便地完成这类计算和逻辑判断,比Java写的代码要短,比存储过程写起来更简单,比如类似的计算在集算器里可以这样写:
|
A |
B |
1 |
=[] |
|
2 |
=demo.query@x("select ORDERID,ORDERDATE,ORDERAMOUNT from ORDERS where ORDERDATE>=? and ORDERDATE<=?",startDate,endDate) |
|
3 |
=interval(startDate,endDate) |
|
4 |
if A3>365 |
>A1=startDate|A3.(elapse@y(startDate,~)) |
5 |
else if A3>30 |
>A1=startDate|A3.(elapse@m(startDate,~)) |
6 |
else if A3>15 |
>A1=startDate|A3.(elapse(startDate,7*~)) |
7 |
else |
>A1=startDate|A3.(elapse(startDate,~)) |
8 |
=A2.group(A1.pseg(ORDERDATE);~.count(ORDERID):TotalOrder,round(~.sum(ORDERAMOUNT),2):TotalOrderAmount,A1(#):BeginDate) |
|
9 |
=A8.new(BeginDate:BeginDate,#2:TotalOrder,#3:TotalOrderAmount) |
|
10 |
return A9 |
其中startDate,endDate为报表起止日期参数。其实还有很多类似的计算问题在BIRT中处理不太方便,但有集算器SPL的辅助却很简单,感兴趣可以参考:解决BIRT动态数据源的若干示例
集算器提供了JDBC驱动,可以很方便的与BIRT等报表工具集成,BIRT调用SPL脚本有使用和获得它的方法。
关于集算器安装使用、获得免费授权和相关技术资料,可以参见如何使用集算器。