获取Context传入参数和宏
业务场景
自定义数据集里,往往需要根据报表传入的参数或者宏来动态生成返回数据集,因此需要调用API接口获取报表参数和宏。
特别注意的是,此时需要获取的参数和宏,是从context上下文中取得。对应的报表应用流程为:报表设计时设置了参数或者宏,当查看报表是给报表传相应的参数值或宏值时,可通过相关API在自定义数据集中接收使用。
参数的获取方法:
- Map map = ctx.getParamMap(false); //获得当前报表的所有参数对照表
- String str = ctx.getParamValue("empName"); //获取报表参数empName的值
宏的获取方法:
- Map macros = ctx.getMacroMap(false); //获得当前报表的所有宏对照表
- String sql=ctx.getMacroValue("sql"); //获取报表的宏${ sql}的值
示例代码
自定义数据集中获取系统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:
设置通用查询:
报表展现时输入参数值“林”进行查询: