报表中定义了一个动态参数,动态参数表达式为:=query("select stuname from student where stuid=?",arg1;"oracle")
api运算该报表时,报空指针错误,如下图所示:
该问题是由于query函数没有找到对应数据库配置,解决方案为给dataSource指定数据库,具体代码如下:
cxt.setDefDataSourceName("oracle");
cxt.setConnection("oracle", con);
DataSourceConfig dsoc = new DataSourceConfig(2, true, "GBK", "GBK", false);
cxt.setDataSourceConfig("oracle", dsoc);
在解决此问题过程中遇到另一个问题,动态参数的计算值为null,这个问题是因为代码顺序写的有问题:
Engine先根据参数和宏计算动态参数和动态宏,再计算报表里的数据集,再计算报表
所以对于动态参数值的输出判断应写到后面,之前的写法会导致将默认参数值赋予报表参与运算,下面的参数赋值部分的代码未执行生效。
完整示例代码为:
import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import com.raqsoft.dm.Sequence;
import com.raqsoft.report.base.DBTypes;
import com.raqsoft.report.model.ReportDefine;
import com.raqsoft.report.model.expression.Expression;
import com.raqsoft.report.usermodel.Context;
import com.raqsoft.report.usermodel.Engine;
import com.raqsoft.report.usermodel.IReport;
import com.raqsoft.report.usermodel.ParamMetaData;
import com.raqsoft.report.util.ReportUtils;
import com.raqsoft.report.usermodel.DataSourceConfig;
public class Test {
public static void main(String[] args) throws Throwable {
// TODO Auto-generated method stub
//第一步,读取报表模板
Context cxt = new Context(); //构建报表引擎计算环境
String reportFile = "F:\\test.rpx"; //该文件名可以为绝对路径,也可以相对当前程序启动路径
//设置授权文件
File flic = new File("E:/授权文件/内部测试版/集算报表内部测试版.lic");
FileInputStream lis = new FileInputStream(flic);
Sequence.readLicense( Sequence.P_RPT, lis);
ReportDefine rd = (ReportDefine)ReportUtils.read(reportFile);
//设置数据源
Connection con = null;
try{
Driver driver = (Driver) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
DriverManager.registerDriver(driver);
con= DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","test","runqian");
}catch (Exception e){
e.printStackTrace(); }
cxt.setDefDataSourceName("oracle");
cxt.setConnection("oracle", con);
DataSourceConfig dsoc = new DataSourceConfig(DBTypes.getDBType("oracle"), true, "GBK", "GBK", false);
cxt.setDataSourceConfig("oracle", dsoc);
System.out.println("-------"+cxt.getDataSourceConfig("oracle")+"--------");
//参数处理
ParamMetaData pmd = rd.getParamMetaData(); //从报表定义中取得参数元对象ParamMetaData
String paramOrMocrName = "";
if(pmd != null){
paramOrMocrName = pmd.getParam(0).getParamName(); //获取参数名
cxt.setParamValue(paramOrMocrName,"77777"); //设参数值
// Expression ex=new Expression(cxt,"query(\'select stuname from student where stuid=?\',arg1;'oracle')");
//System.out.println("-------"+ex.calculate(cxt));
//cxt.setParamValue("arg2",ex.calculate(cxt));
}
//第二步,运算报表
Engine enging = new Engine( rd, cxt);
IReport iReport = enging.calc();
System.out.println("-------"+cxt.getParamValue("arg1")+"--------");
System.out.println("-------"+cxt.getParamValue("arg2")+"--------");
ReportUtils.exportToExcel("F:/test.xls",iReport,false);
}
}