集算报表用Java动态修改报表数据源

实际应用中通过程序动态修改报表模板的情况很常见,其中动态修改数据源SQL就是一种典型场景。常见于系统中有一些结构相同而数据源不同的报表,为减少报表开发工作量,只开发一套报表模板,使用时通过程序动态修改数据源来满足实际需要。

下面通过一个使用JAVA程序修改集算报表数据源SQL的例子说明使用过程。

编辑报表模板:

由于不同数据源的字段不同,因此这里使用动态表达式ds1.fname()获取字段名,ds1.field()获取字段值。此外,第一行和第一列为辅助行列,设置其隐藏。

编写代码:

1.读入报表

StringreportPath = request.getRealPath("/reportFiles/demo.rpx");

ReportDefinerd = (ReportDefine)ReportUtils.read(reportPath);

2.更改报表数据源

DataSetMetaDatadsmd=newDataSetMetaData();   //构造数据集元数据

SQLDataSetConfigsdc=newSQLDataSetConfig();   //构造数据集定义

sdc.setName("ds1");   //设置数据集名

Stringsql = "";

//根据不同参数,为报表设置不同数据源SQL,实际使用中可以从配置文件中读取

switch(Integer.parseInt(type)){

case 1:

sql="select * from 员工表";

break;

case 2:

sql="select * from 订单明细 order by 订单ID";

break;

default:sql="select * from 客户销售表";

}

sdc.setSQL(sql);    //设置 sql语句

dsmd.addDataSetConfig(sdc);   //把数据集定义添加到数据集元数据

rd.setDataSetMetaData(dsmd);   //把数据集元数据赋给ReportDefine

3.      将ReportDefine存入request后使用defineBean方式发布报表

rd.setDataSetMetaData(dsmd);   //把数据集元数据赋给ReportDefine

request.setAttribute("reportDefine",rd);

<report:html name="report1"

srcType="defineBean"

beanName="reportDefine"

exceptionPage="/reportJsp/jsp/myError.jsp"

/>

实现效果:

当type=1时显示员工信息表数据:

当type=2时显示订单明细表数据:

【附】changeds.jsp完整代码:

<%@ page contentType="text/html;charset=GBK"%>
<%@ taglib uri="/WEB-INF/raqsoftReport.tld"prefix="report" %>
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<%@ page import="com.raqsoft.report.usermodel.Context"%>
<%@ page import="com.raqsoft.report.model.ReportDefine"%>
<%@ page import="com.raqsoft.report.util.ReportUtils"%>
<%@page import="com.raqsoft.report.usermodel.SQLDataSetConfig"%>
<%@page import="com.raqsoft.report.usermodel.DataSetMetaData"%>
 
 
<html>
<link type="text/css"href="css/style.css" rel="stylesheet"/>
<body topmargin=0 leftmargin=0 rightmargin=0 bottomMargin=0>
<%
    request.setCharacterEncoding("GBK");
    Stringtype = request.getParameter("type");
    //取得报表真实路径
    StringreportPath = request.getRealPath("/reportFiles/demo.rpx"); 
    ReportDefinerd = (ReportDefine)ReportUtils.read(reportPath); 
    DataSetMetaDatadsmd=newDataSetMetaData();   //构造数据集元数据
    SQLDataSetConfigsdc=newSQLDataSetConfig();   //构造数据集定义
    sdc.setName("ds1");   //设置数据集名
    Stringsql = "";
    //根据不同参数,为报表设置不同数据源SQL,实际使用中可以从配置文件中读取
    switch(Integer.parseInt(type)){
       case 1:
           sql="select * from 员工表";
           break;
       case 2:
           sql="select * from 订单明细 order by 订单ID";
           break;
       default:sql="select * from 客户销售表";
    }
    sdc.setSQL(sql);    //设置 sql语句
    dsmd.addDataSetConfig(sdc);   //把数据集定义添加到数据集元数据
    rd.setDataSetMetaData(dsmd);   //把数据集元数据赋给ReportDefine 
    request.setAttribute("reportDefine",rd);
    
    
%>  
<jsp:include page="toolbar.jsp"flush="false" />
<table id="rpt"align="center" width=100% height=100%>
    <tr><td align=center valign=top height=100%>
       <report:html name="report1" 
           srcType="defineBean"
           beanName="reportDefine"
           exceptionPage="/reportJsp/jsp/myError.jsp"
  /> 
    </td></tr>
</table>
 
</body>
</html>
时间: 2024-07-29 09:13:24

集算报表用Java动态修改报表数据源的相关文章

用集算器实现跨数据库关联报表

实际应用中很多报表的数据来源于多个不同类型的数据库,报表数据源跨数据库是报表开发中的常态.目前实现这类跨库关联报表的方式有多种,但都会存在这样那样的问题. 使用报表工具自身多源关联功能 现在大多数主流报表工具都支持多数据源关联,这在某些方面确实为报表用户带来了便利.然而我们也经常会遇到通过报表自身的多源关联功能很难实现一些跨库关联的报表(由于数据结构和业务本身决定).这当然容易理解,报表工具主要是来做数据展现的,而对数据计算本身来说并不擅长. 即使有的能实现,在报表中做跨库关联计算的效率也较低,

用集算器实现跨行组计算报表

跨行组计算类报表在报表开发中非常常见,如常见的同期比.环比计算.移动平均值计算等.这类报表由于经常要引用其他行列的数据进行相对/绝对位置运算,使得报表工具在实现时并不轻松.功能相对强大的润乾报表需要借助层次坐标和位移坐标,辅以条件表达式和"$"运算符完成,书写和理解都有相当的难度. 其实通过集算器这类报表则非常容易实现,我们来看一个例子.     报表需求:根据订单表和指定年份(参数)按月统计订单金额,以及与上一订单月金额比,与去年同月金额比,样式如下: 这里应该注意的是比去年同期是指

集算器协助Java处理结构化文本之分组汇总

直接用Java实现文体文件分组汇总会有如下的麻烦: 1.文件不是数据库,不能用SQL访问.当分组.汇总表达式变化时,只能改写代码.而要实现灵活表达式的话,需要自己实现动态表达式解析和求值,编程工作量非常大. 2.遍历过程中记录分组结果,结果小了还可以存在内存中,如果分组结果太大时要将中间结果缓存进临时文件再归并,实现过程非常复杂. 使用集算器辅助Java编程,这些问题都有现成的类库可以解决.下面,我们通过例子来看一下具体作法. 文本文件employee.txt中保存有员工信息,我们要按照DEPT

集算器协助Java处理结构化文本之条件过滤

直接用Java实现文本文件中数据按条件过滤会有如下的麻烦: 1.文件不是数据库,不能用SQL访问.当过滤条件变化时需要改写代码.如果要实现象SQL那样灵活的条件过滤,则需要自己实现动态表达式解析和求值,编程工作量非常大. 2.文件太大时不能一次性装入内存处理,而采用逐步读入方式在考虑到性能时又会涉及到文件缓冲区管理.拆行计算等复杂编程. 使用集算器来辅助Java编程,这些问题都不需要自己写代码解决.下面我们通过例子来看一下具体作法. 文本文件employee.txt中保存了员工数据.我们要读取员

集算器协助java处理多样性数据源之JSON

Java的json开源包一般只能解析json数据,没有运算功能.程序员自己写通用的程序来实现分组.排序.过滤.连接这些计算,相当麻烦.例如:用java写json文件条件过滤程序时,当条件表达式发生变化时就需要改写代码.如果要实现象SQL那样灵活的条件过滤,则需要自己实现动态表达式解析和求值,编程工作量非常大. 集算器是支持动态表达式的,可以嵌入到Java中写出通用的json计算程序.下面我们通过例子来看一下具体作法.待处理字符串是json格式的员工信息,包含EID.NAME.SURNAME.GE

用集算器协助Java读入文本

JAVA提供了最基本的文件处理函数,可以简单无结构的方式读入小文本文件,如果遇到需要结构化.格式多样.要求特殊的文件或内存装不下的大文件,相应的代码就会很复杂,可读性和复用性也很难保障. 使用免费的集算器可以弥补这一不足.集算器封装了丰富的结构化文件读写和计算函数,并提供JDBC接口.JAVA应用程序可以将集算器脚本文件当做数据库存储过程执行,传入参数并用JDBC获得返回结果.详情参考集算器用作Java计算类库的应用结构. 下面说明JAVA读入文本的常见案例,以及集算器对应的解法. 读入指定列 

集算器协助Java处理多样性数据源之Hive

Java使用jdbc连接Hive比较简单,但是Hive的计算能力相对于其它数据库的SQL而言较弱,要完成非常规的计算需要将数据取出后用Java进一步计算,编程比较麻烦. 使用集算器配合Java编程,可以减少Java使用Hive时要进行复杂计算工作量.下面我们通过例子来看一下具体作法:Hive中的orders表中保存了订单的明细数据,需要计算同期比和比上期.数据如下: ORDERID CLIENT SELLERID AMOUNT ORDERDATE    1 UJRNP 17 392 2008/1

集算器用作Java结构化文件计算类库

有时我们不能使用数据库而采用文件系统存储数据,这时就需要自行完成基于文件的数据计算.但JAVA本身缺少相应的类库,需要硬编码才能实现结构化文件计算,代码复杂且可读性差.在网上有许多寻找用于文件计算的Java类库的问题,如: http://www.coderanch.com/t/561180/java/java/read-text-file-perform-operation http://stackoverflow.com/questions/9614112/how-to-sort-and-ar

集算器协助java处理多样性数据源之HDFS

Java通过Hadoop提供的API访问HDFS不算困难,但针对其上文件的计算就比较麻烦.比如分组.过滤.排序等计算,用java来实现都比较复杂.集算器esproc能很好地协助java解决计算问题,同时也封装了HDFS的访问,借助esproc可以让java加强HDFS上文件的计算能力,结构化半结构化数据计算都可以轻松完成.下面我们通过例子来看一下具体作法. HDFS中的文本文件employee.gz中保存了员工数据.我们要读取员工信息,从中找出1981年1月1日(含)之后出生的女员工.文本文件在