当前位置:首页  >  表格软件专题  > 

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

作者:finereport

浏览:12,781

发布时间:2023.7.31

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

1. 定义程序数据源

1.1 TableData接口简介
TableData接口所需实现的方法
只要实现了TableData接口,FineReport报表引擎就能够读取数据源作为报表数据源使用。TableData接口主要有5个方法,如下:
1). public int getColumnCount(); //获取TableData的总列数
2). public String getColumnName(int columnIndex); //获取TableData中第columnIndex列的列名。
3). public boolean hasRow(int rowIndex); //判断是否存在第rowIndex行,这主要是用于处理超大数据时,完全遍历所有数据获取总行数相当困难,用这个方法来判断第rowIndex行是否存在,存在则可读取。
4). public int getRowCount(); //获取TableData的总行数。
5). public Object getValueAt(int rowIndex, int columnIndex); //获取TableData中第columnIndex列,第rowIndex行的数据。

1.2 以PramTableDataDemo为例描述如何实现TableData接口
因为AbstractTableData已经实现了默认的hasRow(int rowIndex)方法,所以可以从AbstractTableData扩展,定义ParamTableDataDemo,代码如下:
private String splitMark = “;”;
// 自定义间隔符暂定为‘;’即输入列名参数时需像如此 name;sex;age;
private String[] columnNames = null;
// 列字段名数组 保存在数据集窗口下一开始显示的数据列名称
private int columnNum = 10;
// 自定义需要列出的列数量 即在数据集窗口列出的数据集下的字段数量
String[] colNames = null;
// 保存取到的字段 即输入的参数字段,假如是name;sex 参数字段即为name 和 sex 两项
private ArrayList valueList = null;
// 保存查询得到的值列

1.3 构造函数
public ParamTableDataDemo() {
// 定义需要的参数 tablename columnNames
this.parameters = new Parameter[] { new Parameter(“tableName”),
new Parameter(“columnNames”) };
// 初始化下列名,暂定为columnName#0,columnName#1……显示在数据集窗体中的
columnNames = new String[columnNum];
for (int i = 0; i < columnNum; i++) {
columnNames[i] = "columnNames#" + String.valueOf(i);
}
}

1.4 匹配取值
for (int i = 0; i < parameters.length; i++) {
if (parameters[i].getName().equals("tableName")) // 做匹配
tableName = parameters[i].getValue().toString();
else colNames = this.getParameters()[i].getValue().toString().split(
splitMark);}

1.5 构造SQL语句
String sql = "select ";// 传入参数中输入的字段
for (int i = 0; i < colNames.length; i++) {
colNames[i].trim();
if (i == colNames.length - 1)
sql += colNames[i];
else {sql += colNames[i] + ",";} }
sql += " from " + tableName + ";";

1.6 获得数据库连接
public Connection getConnection() {
String driverName = "sun.jdbc.odbc.JdbcOdbcDriver";// 加载驱动
String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=D:ProgramFilesfinereportFineReport6.5WebReportWEB-INFresourcesdataFRDemo.mdb";
String username = "";
String password = "";
Connection con = null;
try {
Class.forName(driverName);
con = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return con;
}
具体实现代码如附件所示
编译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
此驱动和URL分别对应服务器|自定义数据连接中的driverName和URL。对应的驱动和URL

管理驾驶舱指南,业务指标,数据分析报表需要展现大量的数据和文字,提高信息传递的效率

报表工具产品更多介绍:www.finereport.com


在线客服

电话咨询

技术问题

投诉入口