本站首页    管理页面    写新日志    退出

The Neurotic Fishbowl

[Java报表软件—技术知识]Java报表软件带参程序数据集
FineReport——报表技术领跑者 发表于 2011/7/15 13:37:53

       在Java报表软件的实际应用中,可能需要根据表名动态地改变数据源,比如在程序数据集中,通过传进的表名参数,到数据库取出对应的表作为数据源。以下就对这种情况举例说明。 1. 定义程序数据源        首先在构建函数中定义好所用的程序数据集表结构,通过参数获得表名;其次在初始化函数中准备数据并放入定义的表中;完整代码如下: package com.demo;   import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Statement; import java.util.ArrayList; import java.util.logging.Level; import com.fr.base.FRContext; import com.fr.data.AbstractTableData; import com.fr.report.parameter.Parameter;   public class ParamTableDataDemo extends AbstractTableData{        //列名数组,保存程序数据集所有列名        private String[] columnNames = null;        //定义程序数据集的列数量        private int columnNum = 10;        //保存查询表的实际列数量        private int colNum = 0;        //保存查询得到列值 private ArrayList valueList = null;        //构造函数,定义表结构,该表有10个数据列,列名为column#0,column#1,。。。。。。column#9 public ParamTableDataDemo(){ //定义tableName参数 this.parameters = new Parameter[]{new Parameter("tableName")}; //定义程序数据集列名            columnNames = new String[columnNum];            for(int i=0;i<columnNum;i++){               columnNames[i] = "column#" + String.valueOf(i);            }        }             //实现其他四个方法        public int getColumnCount(){            return columnNum;        }           public String getColumnName(int columnIndex){             return columnNames[columnIndex];         }           public int getRowCount(){            init();             return valueList.size();         }           public Object getValueAt(int rowIndex, int columnIndex){             init();            if (columnIndex >= colNum) {                return null;            }            return ((Object[])valueList.get(rowIndex))[columnIndex];         }             //准备数据        public void init(){            //确保只被执行一次            if(valueList != null){                return;            }            //保存得到的数据库表名            String tableName = parameters[0].getValue().toString();            //构造SQL语句,并打印出来            String sql = "select * from " + tableName + ";";            FRContext.getLogger().log(Level.INFO, "Query SQL of ParamTableDataDemo: \n" + sql);            //保存得到的结果集            valueList = new ArrayList();            //下面开始建立数据库连接,按照刚才的SQL语句进行查询            Connection conn = this.getConnection();            try{                Statement stmt = conn.createStatement();                ResultSet rs = stmt.executeQuery(sql);                //获得记录的详细信息,然后获得总列数                ResultSetMetaData rsmd = rs.getMetaData();                colNum = rsmd.getColumnCount();                //用对象保存数据                Object[] objArray=null;                while(rs.next()){                    objArray = new Object[colNum];                    for(int i = 0; i<colNum ; i++ ){                       objArray[i]=rs.getObject(i+1);                   }                   // 在valueList中加入这一行数据                   valueList.add(objArray);                }                //释放数据库资源                rs.close();                stmt.close();                conn.close();                //打印一共取到的数据行数量                FRContext.getLogger().log(Level.INFO, "Query SQL of ParamTableDataDemo: \n" + valueList.size() + " rows selected");            }catch(Exception e){                e.printStackTrace();            }              }             // 获取数据库连接 driverName 和 url 可以换成您需要的         public Connection getConnection() {            String driverName="sun.jdbc.odbc.JdbcOdbcDriver";            String url="jdbc:odbc:FRDemo";            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;         }             // 释放一些资源,因为可能会有重复调用,所以需释放valueList,将上次查询的结果释放掉         public void release() throws Exception {             super.release();            this.valueList = null;         } } 编译ParaTableData.java生成ParaTableData.class类。将生成的类文件拷贝到报表工程/WEB-INF/classes目录下。由于该类是在com.demo包中的,因此最终应该将该ParaTableData.class放在/WEB-INF/classes/com/demo下面。此时该程序数据源便定义好了。   2. 配置程序数据源 Ÿ           新建报表 Ÿ         在数据集中新建程序数据源,选择我们定义好的报表程序数据集,如下图 名字可以自定义,如divtable 500)this.width=500'>   3. 使用程序数据集        配置好程序数据源后便可以使用定义的student程序数据集了,选中该数据集点击预览按钮,即可以输入表名动态地获取相应的数据表,并制作报表模板,如下图 500)this.width=500'>   500)this.width=500'>   可以看到,我们已经将stscore表中的数据提取至程序数据集表中,像其他类型的数据集一样,可以通过拖拽方法实现单元格数据列绑定。 文章转自:http://blog.vsharing.com/fanfanzheng/A1371295.html  

阅读全文(1243) | 回复(0) | 编辑 | 精华

 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)

 
 



The Neurotic Fishbowl

.: 公告

本博客提供详细的java报表软件的制作过程,发布java报表软件的版本更新信息,并适时对国内主流报表软件进行功能比较。


Bloginess

«September 2025»
123456
78910111213
14151617181920
21222324252627
282930

.: 我的分类(专题)

首页(357)
Java报表软件—制作笔记(54)
Java报表软件—功能比较(43)
Java报表软件—使用心得(21)
Java报表软件—行业动态(54)
Java报表软件—新闻资讯(48)
Java报表软件—技术知识(49)
Java报表软件—问题解析(2)


In the Bowl

.: 最新日志

如何对报表的参数控件赋值
java报表工具FineReport常见
报表怎么做 FineReport连接池原
报表怎么做FineReport数据连接之
报表模板之报表设计
报表模板之报表设计


.: 最新回复

回复:报表参数
好好学习,
好好学习,天天向上。买双 air jor
回复:理解FineReport缓存系列2
回复:理解FineReport缓存系列2


The Fishkeeper
blog名称:Java报表软件
日志总数:357
评论数量:69
留言数量:0
访问次数:1218672
建立时间:2006年4月16日



Text Me

.: 留言板

签写新留言

需要你的帮助


Other Fish in the Sea

.: 链接

报表开发工具  html5图表java报表开发工具




站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144795436 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号