java自定义统计报表_使用集算器实现报表自定义数据源(附java程序)

本文介绍了在报表开发中遇到的自定义数据源需求,特别是当数据库操作受限或需要在应用层进行数据加工时。通过Java实现自定义数据源存在诸多不便,例如缺乏批量计算支持、不支持表达式参数和动态数据结构。文章以润乾报表为例,展示了一个Java自定义数据源的实现,包括获取报表参数、执行SQL、计算汇总值等步骤,并对比了使用集算器的优势,集算器能够提供更简洁的代码和对有序运算的良好支持。最后,文章提到了集算器JDBC如何作为数据源为报表工具提供数据。
摘要由CSDN通过智能技术生成

自定义数据源在报表开发中比较常见,往往由于数据库使用受限(权限问题无法使用存储过程、数据库压力过大、计算逻辑过于复杂等)或需要在应用层进行数据加工都需要进行自定义数据源。而开发人员通过高级语言(如Java)实现报表自定义数据源时却存在诸多不便。

以Java为例,首先缺乏对批量数据计算的基础支持,完全没有针对记录集合(即对象数组)的过滤、分组、连接等计算;其次,不支持表达式参数,不支持把表达式作为参数传递进函数内部再计算的机制,表达式参数在记录集合上的运算中大量需要,过滤、分组、排序、连接等运算的参数都必须使用表达式,不能使用表达式参数将难以描述这些运算;再次,不支持动态数据结构,程序中用到的数据结构必须在编译前设计好,不可以由某个语句临时产生一个数据结构,而实际运算过程中的动态数据结构要求比比皆是。我们经常需要新的数据结构用以描述返回的结果集,有时还需要现有数据结构上添加计算字段以方便计算。没有动态数据结构的支持,所谓的批量结构化数据运算就成了空话。

下面通过一个例子进一步说明。

报表说明

某网络平台需要监测查看一定周期内的用户状况,需要为运营部门出具日报、周报、月报、年报等报表,每类报表中均包含本期与上期、上上期数据比较,故涉及数据量较大。这里以其日报为例(月报年报只是统计周期不同),报表格式如下:

5686b172070b2bb4bf031a5f74309dc1.png

报表分为两部分,上半部分为用户明细数据,由于用户较多报表中只显示按本期在线时长排序后的前十名和后十名;下半部分为本期数据与上期、上上期的比较结果。

Java自定义数据源实现

这里以润乾报表自定义数据源为例(主要代码,完整代码见附注)。

获取报表参数

Mapmap = ctx.getParamMap(false);

if(map !=null) {

Iteratorit = map.keySet().iterator();

while(it.hasNext()) {

//分别取得参数

Stringkey = it.next().toString();

data_date= map.get(key).toString();

}

}

执行数据库sql取数

Stringsql ="select a.useridauserid,a.first_logout_time,b.userid buserid,b.onlinetime bonlinetime,b.accountbaccount,"

+"c.userid cuserid,c.onlinetime conlinetime,c.accountcaccount,d.userid duserid,d.onlinetime donlinetime,d.account daccount,"

+"from"

+"(select  v.userid, v.first_logout_time"

+"from    t_dw_zx_valid_account v"

+"where   v.standard_7d_time is not null) a,"

+"(select  userid, sum(onlinetime) onlinetime, max(account)"

+"from    t_dw_zx_account_status_day"

+"where   logtime >= to_date('"+start_time_tm+"','yyyy-mm-dd hh:mi:ss')"

+"and     logtime

+"group by userid"

+"having max(account) is not null) b,"

+"(select  userid, sum(onlinetime) onlinetime, max(account)"

+"from    t_dw_zx_account_status_day"

+"where   logtime >= to_date('"+start_time_lm+"','yyyy-mm-dd hh:mi:ss')"

+"and     logtime

+"group by userid"

+"having max(account) is not null) c,"

+"(select  userid, sum(onlinetime) onlinetime, max(account)"

+"from    t_dw_zx_account_status_day"

+"where   logtime >= to_date('"+start_time_lm_1+"','yyyy-mm-dd hh:mi:ss')"

+"and     logtime

+"group by userid"

+"having max(account) is not null) d"

+"where a.userid = b.userid(+)"

+"and   a.userid = c.userid(+)"

+"and   a.userid = d.userid(+))"

+"order by b.onlinetime desc";

为了降低程序的复杂度,数据初步加工(分组、过滤、排序)仍然使用sql完成。

获取列名

for(inti=0;i

colName.add(rsmd.getColumnNa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值