程序数据集传参使用解决方案

楼主
欢迎找我唠嗑

通过TableData接口可以读取任何形式的数据源,FineReport报表工具的数据来源可以是数据库数据或是文本数据,并且还可以是其它任何类型的数据,因为这些所有的数据来源都实现了TableData接口,所以用户只要实现了TableData接口,也就可以用自定义类型的数据源了。对于传参,我们可以在程序数据集中写入传入的参数,此方案传入的参数为 tableName 和 columnNames 两项;即传入数据库表名以及所需要的列名取出所需要的值;这里连的数据库为FineReport报表的内置数据库,适用时可输入表名:stscore 列名 name;sex。具体步骤如下:

1.        定义程序数据源

1.1        TableData接口简介
TableData接口所需实现的方法
只要实现了TableData接口,FineReport报表引擎就能够读取数据源作为报表数据源使用。TableData接口主要有5个方法,如下:

  1. 1). public int getColumnCount(); //获取TableData的总列数
  2. 2). public String getColumnName(int columnIndex); //获取TableData中第columnIndex列的列名。
  3. 3). public boolean hasRow(int rowIndex); //判断是否存在第rowIndex行,这主要是用于处理超大数据时,完全遍历所有数据获取总行数相当困难,用这个方法来判断第rowIndex行是否存在,存在则可读取。
  4. 4). public int getRowCount(); //获取TableData的总行数。
  5. 5). public Object getValueAt(int rowIndex, int columnIndex); //获取TableData中第columnIndex列,第rowIndex行的数据。
复制代码

1.2        以PramTableDataDemo为例描述如何实现TableData接口
因为AbstractTableData已经实现了默认的hasRow(int rowIndex)方法,所以可以从AbstractTableData扩展,定义ParamTableDataDemo,代码如下:

  1. private String splitMark = “;”;
  2. // 自定义间隔符暂定为‘;’即输入列名参数时需像如此 name;sex;age;
  3. private String[] columnNames = null;
  4. // 列字段名数组 保存在数据集窗口下一开始显示的数据列名称
  5. private int columnNum = 10;
  6. // 自定义需要列出的列数量 即在数据集窗口列出的数据集下的字段数量
  7. String[] colNames = null;
  8. // 保存取到的字段 即输入的参数字段,假如是name;sex 参数字段即为name 和 sex 两项
  9. private ArrayList valueList = null;
  10. // 保存查询得到的值列
复制代码

1.3        构造函数

  1. public ParamTableDataDemo() {
  2. // 定义需要的参数 tablename columnNames
  3. this.parameters = new Parameter[] { new Parameter(“tableName”),
  4. new Parameter(“columnNames”) };
  5. // 初始化下列名,暂定为columnName#0,columnName#1……显示在数据集窗体中的
  6. columnNames = new String[columnNum];
  7. for (int i = 0; i < columnNum; i++) {
  8. columnNames[i] = “columnNames#” + String.valueOf(i);
  9. }
  10. }
复制代码

1.4        匹配取值

  1. for (int i = 0; i < parameters.length; i++) {
  2. if (parameters[i].getName().equals(“tableName”)) // 做匹配
  3. tableName = parameters[i].getValue().toString();
  4. else colNames = this.getParameters()[i].getValue().toString().split(
  5. splitMark);}
复制代码

1.5        构造SQL语句

  1. String sql = “select “;// 传入参数中输入的字段
  2. for (int i = 0; i < colNames.length; i++) {
  3. colNames[i].trim();
  4. if (i == colNames.length – 1)
  5. sql += colNames[i];
  6. else {sql += colNames[i] + “,”;} }
  7. sql += ” from ” + tableName + “;”;
复制代码

1.6        获得数据库连接

  1. public Connection getConnection() {
  2. String driverName = “sun.jdbc.odbc.JdbcOdbcDriver”;// 加载驱动
  3. String url = “jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=D:\ProgramFiles\finereport\FineReport6.5\WebReport\WEB-INF\resources\data\FRDemo.mdb”;
  4. String username = “”;
  5. String password = “”;
  6. Connection con = null;
  7. try {
  8. Class.forName(driverName);
  9. con = DriverManager.getConnection(url, username, password);
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. return null;
  13. }
  14. return con;
  15. }
复制代码


具体实现代码如附件所示
编译ParamTableDataDemo.java,将生成的ParamTableDataDemo.class文件放到报表服务器的%FineReport6.5WebReportWEB-INFclasses目录;注意:如该例子所示,其包名为com.demo,所以其类所在路径为comdemo

2.        配置程序数据集

•        步骤一:选择“服务器|服务器数据集”,在弹出的窗口左上角点击,选择添加程序,可以把默认名字更改为恰当的名字,如下图所示:

•        步骤二:点击选择您定义好的类文件,此处选择上面定义好的ParamTableDataDemo.class,点击下方的确定即添加完成。如下图所示:
添加完成后的程序数据集并会在数据面板中出现,如下图所示:
在参数对话框中输入需要传递的参数tableName,columnNames如图所示:
点击确定之后出现如下图面:
图片中的columnName#是在程序数据集中自定义的。

3. 使用程序数据集

因为columnNames输入的是两个数据列名,所以columnNames#0,columnNames#1字段中存入了相应的name,sex字段数据。

3.1 将columnNames#0,columnNames#1拖到B2,C2单元格中,表样设计如图所示:
点击设计器预览:再次出现参数窗口,输入相应的参数:
再次输入相应的参数,点击确定,预览效果图如下:
注意:程序数据集中的代码在配置时需要改动相应的url,如图所示:
此驱动和URL分别对应服务器|自定义数据连接中的driverName和URL。


分享扩散:

沙发
发表于 2015-4-23 10:23:06
留个脚印、、、、、
板凳
发表于 2015-4-23 18:42:12
先收藏,备用。。
地板
发表于 2015-4-24 23:41:56
收藏了{:8_202:}
5楼
发表于 2017-12-25 08:33:05
还有其他方式的模板吗
6楼
发表于 2024-4-28 11:27:05
定义数据库连接的时候只能在代码里指定数据库路径吗,可以去连接本地部署的nacos不
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部 返回列表