润乾 自定义数据源

报表的数据来源大部分来自数据库,正常情况润乾报表都能自动处理,但是也会有特殊的情况,例如通过中间件连接数据库而非直连?通过业务程序算出的数据传递给报表进行展现等等。因此需要用户自定义数据集,我们看一个例子。

我们的数据源有可能来源于业务处理的中间值,不是从数据库中取到的。

以下是尝试自定义数据源的方案:

package test.runqian; import java.sql.Connection; import java.util.Iterator; import java.util.Map; import org.apache.log4j.Logger; import com.runqian.report4.dataset.DataSet; import com.runqian.report4.dataset.IDataSetFactory; import com.runqian.report4.dataset.Row; import com.runqian.report4.usermodel.Context; import com.runqian.report4.usermodel.CustomDataSetConfig; import com.runqian.report4.usermodel.DataSetConfig; public class MyDataSet implements IDataSetFactory { private Logger logger = Logger.getLogger(MyDataSet.class); /*************************************************************************** * @param ctx : * 报表的运行上下文 * @param dsf : * 数据集配置 * @param isinput : * 是否检索出数据,若为false则不取出数据,只产生数据集的结果 **************************************************************************/ public DataSet createDataSet(Context ctx, DataSetConfig dsf, boolean isinput) { // TODO Auto-generated method stub logger.info("AAAAA"); // 获取系统数据源 String dataSourceName = dsf.getDataSourceName(); if (null == dataSourceName || "".equals(dataSourceName)) { // 判断用户是否对数据源设置了名称,否则,则直接读取默认数据源 dataSourceName = ctx.getDefDataSourceName(); } Connection conn; try { conn = ctx.getConnectionFactory(dataSourceName).getConnection(); logger.info("得到的数据源名称:" + conn); conn.close(); } catch (Exception e) { e.printStackTrace(); } // 取得参数列表并分别取得它的参数名与值,宏与之类似 Map map = ctx.getParamMap(false); if (null != map) { Iterator iterator = map.keySet().iterator(); while (iterator.hasNext()) { String key = iterator.next().toString(); String value = map.get(key).toString(); logger.info("报表传入的参数:key\t" + key + "\t value\t" + value); } } // 读取定义数据集时定义的传入参数 CustomDataSetConfig cdsf = (CustomDataSetConfig) dsf; String[] keys = cdsf.getArgNames(); String[] values = cdsf.getArgValue(); if (null != keys) { for (int i = 0, len = keys.length; i < len; i++) { String key = keys[i].toString(); String value = values[i].toString(); logger.info("数据集:key\t" + key + "\t value\t" + value); } } // 读取同一报表中已算出的数据集 // DataSet ds = ctx.getDataSet(“ds1″); // System.out.println(“数据集ds1共有 “+ds.getColCount()+” 列字段“); //构造一个数据集 DataSet ds1 = new DataSet("ds1") ; //设置数据集的字段 for (int i = 0; i < 10; i++) { ds1.addCol("字段"+(i+1)) ; } //设置数据集中的数据 20条数据 for (int i = 0; i < 20 ; i++) { Row row = ds1.addRow() ; for (int j = 0; j < 10; j++) { row.setData(j+1, i*j*1*2*3) ; } } return ds1; } }

类文件编译之后又应该怎么处理的?


将类文件拷贝到相应文件下

在设计器中使用自定义类应把编译后的.class文件放在designer\classes\自定义类所在的包名下面。比如 MyDataSet.java在test.runqian包中,那么就应该把编译后的MyDataSet.class文件放在设计器安装路径\ reportHome\designer\classes\test\runqian包中,如果classes下面不包含test.runqian包,用户需要自己新建。

在服务器中运行使用自定义类的报表文件时应把自定义类编译后的.class文件放在reportHome\webapps\WEB-INF \classes\自定义类所在的包名下面。比如MyDataSet.java在test.runqian包中,那么就应该把编译后的MyDataSet.class文件 放在设计器安装路径\reportHome\webapps\WEB-INF\classes\test\runqian包中,如果classes下面不包含test.runqian包, 用户需要自己新建。

打开设计器,数据源选择 自定义


然后就是把类名添加进去就可以了。

注意:这里是写类名,表示也成test.runqian.MyDataSet.class,写成它会报错误的

 

你可能感兴趣的:(java,java,java,数据源,报表,dataset,dataset,润乾)