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

来源:互联网 发布:温州python培训班 编辑:程序博客网 时间:2024/06/15 13:49

通过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 = newParameter[]

{

 new Parameter("tableName"),newParameter("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={MicrosoftAccess Driver (*.mdb)};DBQ=D:\\ProgramFiles\\finereport\\FineReport6.5\\WebReport\\                              WEB-INF\\resources\\data\\FRDemo.mdb";

       String username = "";

       String password = "";

       Connection con = null;

       try {

            Class.forName(driverName);

            con= DriverManager.getConnection(url, username, password);

        } catch(Exception e) {

            e.printStackTrace();

            returnnull;

        }

        returncon;

    }

      具体实现代码如附件所示

编译ParamTableDataDemo.java,将生成的ParamTableDataDemo.class文件放到报表服务器的%\FineReport6.5\WebReport\WEB-INF\classes目录;注意:如该例子所示,其包名为com.demo,所以其类所在路径为com\demo

2. 配置程序数据集

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

http://www.finereport.com/forumimages/c-step1.jpg

  • 步骤二:点击选择您定义好的类文件,此处选择上面定义好的ParamTableDataDemo.class,点击下方的确定即添加完成。如下图所示:

http://www.finereport.com/forumimages/c-step2.jpg

添加完成后的程序数据集并会在数据面板中出现,如下图所示:

http://www.finereport.com/forumimages/c-step2-1.jpg

在参数对话框中输入需要传递的参数tableName,columnNames如图所示:

http://www.finereport.com/forumimages/c-step2-input.jpg

             点击确定之后出现如下图面:

          

http://www.finereport.com/forumimages/c-step2-3.jpg

          图片中的columnName#是在程序数据集中自定义的

3. 使用程序数据集

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

3.1 将columnNames#0,columnNames#1拖到B2,C2单元格中,表样设计如图所示

http://www.finereport.com/forumimages/c-table%20design.jpg

        点击设计器预览:再次出现参数窗口,输入相应的参数:

http://www.finereport.com/forumimages/c-input.jpg

再次输入相应的参数,点击确定,预览效果图如下:

http://www.finereport.com/forumimages/c-preview.jpg

 

注意:程序数据集中的代码在配置时需要改动相应的url,如图所示:

http://www.finereport.com/forumimages/c-notice1.jpg

此驱动和Url对应服务器|自定义数据连接 中的driverName 和 URL

http://www.finereport.com/forumimages/c-notice2.jpg

文章转自:http://blog.vsharing.com/fanfanzheng/A1453262.html

 

 

 

原创粉丝点击