报表运算参数之间的影响及解决办法
问题描述:
客户在多个业务模块中使用润乾报表,其中一个模块只是用到报表导出功能,要求报表结果不用展现,点击导出将结果保存为excel存储到服务器上,然后再通过下载功能将excel下载到本地进行数据查看,再导excel时需要输入一些参数例如时间、地区等,这样结果就能够根据相应参数进行变化。在另一个模块中用到了报表查询功能,报表输入参数,点击查询在页面端展现报表数据,但此时发现一个问题,如果在导出excel中设置了条件,在报表查询中同一参数换做其他条件报表结果并没变化,还是按照原来参数进行展现,例如:导出excel是用到了一个参数date,参数值为2010-12-12,在报表查询时该参数值变为2011-10-10,结果发现,查询页面出来的数据还是2010-12-12对应的数据。下面介绍下该问题的原因及解决办法。
原因:先看下导出excel的代码:
InputStream fis=application.getResourceAsStream(“/reportFiles/texcel.raq”);
ReportDefine rd = (ReportDefine)ReportUtils.read( fis );
Context cxt = Context.getInitCtx();
Engine engine = new Engine(rd, cxt);
cxt.setParamValue(“arg1″,”444″);
cxt.setParamValue(“arg2″,”ssss”);
IReport ir = engine.calc();
ExcelReport er = new ExcelReport();
er.export(“ttt”,ir);
er.saveTo(“D:/aa.xls”);
在程序中通过context对环境进行了参数的设定,分别对arg1和arg2设置参数,这样报表就能够基于这两个参数进行数据的计算,此时要注意一下,这个context会对整个服务器的环境起作用,也就是在其他报表再使用arg1或者arg2时实际上使用的是该环境变量中已存在的参数值,这样导致其他模块再做报表数据查询时虽然改变了参数,但参数并没生效。
解决办法:润乾tag标签中有一个标签contextName,可以通过其指定相应的环境变量名称,从而可以新构建一个环境变量使得在报表计算时生效。
Context cxt = new Context();
cxt.setParamValue(“arg1″,”10″);
cxt.setParamValue(“arg2″,”2222″);
String myContext = “RPT_”+Double.toString(Math.random());
request.setAttribute( “myContext”, cxt );
标签中contextName=”myContext”
注意:在生成context时一定要用new 形式,而不能用Context.getInitCtx();
否则还是用的系统中已经存在的参数。