一、问题描述:
报表动态参数表达式使用了query函数,在api运算导出报表的时候,该动态参数无法正常计算,具体报错如下:
如果该动态参数不使用query函数,则可以正常导出
二、原因分析:
计算前没准备好环境,dsc=null导致query函数无法正常计算,从而出现空指针的报错。
三、解决方案:
在Java文件中增加如下代码:
cxt.setDefDataSourceName("oracle");
cxt.setConnection("oracle", con);
DataSourceConfig dsoc = new DataSourceConfig(DBTypes.getDBType("oracle"), true, "GBK", "GBK", false);
cxt.setDataSourceConfig("oracle", dsoc);
附完整代码示例:
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.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:\\aaa.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(); }
//增加DataSourceConfig配置
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"); //设参数值
}
//第二步,运算报表
Engine enging = new Engine( rd, cxt);
IReport iReport = enging.calc();
ReportUtils.exportToExcel("F:/test.xls",iReport,false);
}
}