带query参数报表api运算空指针问题解决方案

报表中定义了一个动态参数,动态参数表达式为:=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);

}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值