报表工具一般擅长处理规则一致的数据,若条件不一致的动态运算在报表中是很难实现的。常见做法是先写段程序把数据源准备好,然后传给BIRT再去画图,而不是在BIRT中去直接处理这种数据并画图。
比如要处理这么个场景:统计图X轴以时间为刻度,根据传入不同参数条件显示不同值。统计1小时,每5分钟一条,要生成12条,期望结果:
统计1天,每小时一条,要生成24条,期望结果:
统计一周,每天一条,要生成7条,期望结果:
可以利用BIRT提供的API修改X轴的刻度,代码大概要写成这样:
...
function beforeGeneration( chart, icsc )
{ //01 hour 02 day 03 week
var type = icsc.getExternalContext().getScriptable().getParameterValue("type");
...
var xAxisArray = chart.getAxes();
xAxisArray[0].setCategoryAxis(false);
if(type=='01'){
xAxisArray[0].getScale().setUnit(xAxisArray[0].getScale().getUnit().MINUTES_LITERAL);
xAxisArray[0].getScale().setStep(5);
}else if(type=='02'){
xAxisArray[0].getScale().setUnit(xAxisArray[0].getScale().getUnit().HOURS_LITERAL);
xAxisArray[0].getScale().setStep(1);
} else {
xAxisArray[0].getScale().setUnit(xAxisArray[0].getScale().getUnit().DAYS_LITERAL);
xAxisArray[0].getScale().setStep(1);
}
}
...
建议使用集算器,其丰富的集合运算可以方便地完成这类计算,比Java写的代码要短得多,比如类似的计算在集算器里可以这样写(假定数据表为tv,其中发生时刻列为t,统计值列为v):
通过接收参数(type)计算起止时间段序列,再根据起止时间段执行SQL进行汇总统计,得到每个时间段内的汇总结果,最后将整个结果集返回给BIRT,按普通统计图的方法去呈现即可。
其实还有很多类似的计算问题不太方便,但有集算器SPL的辅助却很简单,感兴趣可以参考:解决BIRT动态数据源的若干示例
集算器提供了JDBC驱动,可以很方便的与BIRT等报表工具集成,BIRT调用SPL脚本有使用和获得它的方法。
关于集算器安装使用、获得免费授权和相关技术资料,可以参见如何使用集算器。