获取Context传入参数和宏

业务场景

自定义数据集里,往往需要根据报表传入的参数或者宏来动态生成返回数据集,因此需要调用API接口获取报表参数和宏。

特别注意的是,此时需要获取的参数和宏,是从context上下文中取得。对应的报表应用流程为:报表设计时设置了参数或者宏,当查看报表是给报表传相应的参数值或宏值时,可通过相关API在自定义数据集中接收使用。

参数的获取方法:

宏的获取方法:

示例代码

自定义数据集中获取系统demo数据源连接,获取宏${sql}的值,参数empName的值,拼成sql语句执行返回结果resultset,进而生成dataset对象。制作报表并设置通用查询,输入empName参数,查询出符合条件的数据。

自定义数据集实现代码如下:

package com.api;

 

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.sql.Statement;

 

import com.runqian.report4.usermodel.*;

import com.runqian.report4.dataset.*;

 

/**
 * @author jade 用自定义数据集实现连接系统数据源demo,通过context中取宏值的方法得到sql,取参数值的方法得过滤参数值,
 *         对拼好的sql语句执行查询,生成dataset对象
 */

public class MyDataSetParas implements IDataSetFactory {

    Connection con = null;

    Statement stmt = null;

 

    public DataSet createDataSet(Context ctx, DataSetConfig dsc,

           boolean retrieve) {

       con = getConnection(ctx, dsc);

// 通过ctx获取数据库连接
       // 执行sql语句,返回结果对象resultset

       String sql = getSql(ctx, dsc);

       ResultSet rs = getRs(con, sql);

       // 创建dataset

       DataSet ds = new DataSet(null);

       try {

           System.out.println("开始创建dataset");

           // 获取物理表列名称,用做自定义数据集的列名

           ResultSetMetaData md = rs.getMetaData();

           int cols = md.getColumnCount();

           // 创建列名

           for (int i = 1; i <= cols; i++) {

              System.out.println(md.getColumnName(i));

              ds.addCol(md.getColumnName(i));

             

           }

           // 创建row

           while (rs.next()) {

              Row row = ds.addRow();

              for (int i = 1; i <= cols; i++) {

                  row.setData(i, rs.getString(i));

              }

              System.out.println("创建成功");

           }

       } catch (Exception e) {

           e.printStackTrace();

       }

       // 关闭各种对象

       release(rs, stmt, con);

       return ds;

    }

 

    // 从context中获取报表接受到的宏和参数的值,因为知道宏名和参数名,所以可直接得到

    public String getSql(Context ctx, DataSetConfig dsc) {

       CustomDataSetConfig cdsc = (CustomDataSetConfig) dsc;

       StringBuffer sb = new StringBuffer();

       //如果上下文中没有宏sql的值为null或者空,则读取的自定义数据集设置的参数拼成sql语句执行

       if (ctx.getMacroValue("sql") == null

              || "".equals(ctx.getMacroValue("sql"))) {

           String[] values = cdsc.getArgValue();

           sb.append(values[0]).append("'").append(values[1]).append("'");

           System.out.println("dsc==="+sb.toString());

       } else {

           //上下文中有传入的宏sql的值,则说明是制作报表时已设置,读取上下文中的宏和参数值拼成sql语句

           String sql = ctx.getMacroValue("sql");

           String empName = (String) ctx.getParamValue("empName");

           sb.append(sql).append("'").append(empName).append("'");

           System.out.println("ctx==="+sb.toString());

       }

       return sb.toString();

    }

 

    // 获取数据库连接

    public Connection getConnection(Context ctx, DataSetConfig dsc) {

       /*
        * //获取的数据源名称为 “其他数据源” String datasourceName1 = dsc.getDataSourceName();
        * //v5中ctx.getDefDataSourceName()获取的是reportConfig中的datasouce,若没配置则为null
        * String datasourceName2=ctx.getDefDataSourceName();
        */

       try {

           //获取demo数据源连接

           IConnectionFactory icf = ctx.getInitCtx().getConnectionFactory("demo");

           con=icf.getConnection();

           System.out.println("得到的数据源是:" + con);

       } catch (Exception ex) {

           ex.printStackTrace();

       }

       return con;

    }

 

    // 获取执行sql后的结果集

    public ResultSet getRs(Connection con, String sql) {

       ResultSet rs = null;

       try {

           stmt = con.createStatement();

           rs = stmt.executeQuery(sql);

       } catch (SQLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

       return rs;

    }

 

    // 释放连接类

    public static void release(ResultSet rs, Statement stmt, Connection con) {

       try {

           if (rs != null)

              rs.close();

       } catch (Exception e) {

           e.printStackTrace();

       }

       try {

           if (stmt != null)

              stmt.close();

       } catch (Exception e) {

           e.printStackTrace();

       }

       try {

           if (con != null)

              con.close();

       } catch (Exception e) {

           e.printStackTrace();

       }

    }

}

示例报表展示

设置宏 sql:


设置通用查询:


报表展现时输入参数值“林”进行查询: