报表运算参数之间的影响及解决办法

问题描述:

客户在多个业务模块中使用润乾报表,其中一个模块只是用到报表导出功能,要求报表结果不用展现,点击导出将结果保存为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对环境进行了参数的设定,分别对arg1arg2设置参数,这样报表就能够基于这两个参数进行数据的计算,此时要注意一下,这个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();

否则还是用的系统中已经存在的参数。

热门文章