报表开发实例——动态多层次KPI钻取报表(I)

在报表项目中有时会有动态层次报表,而且还需要层次钻取的场景,开发难度较大。这里记录了使润乾集算报表开发《各级部门KPI报表》的过程。

《各级部门KPI报表》初始状态如下图:

当前节点是根节点“河北省”,要求报表显示当前节点的下一级节点“地市”汇总的KPI数值。Kpi又分为普通指标和VIP指标两类,共四项。如果点击“石家庄”来钻取的时候,要求能够将石家庄下一级的KPI汇总指标显示出来,如下图:

点击“中心区”钻取,要求能够将下一级的KPI汇总指标显示出来,以此类推,直到显示到最后一级。如下图:

前四级固定是“省、地市、区县、营业部”,后边则是动态的“架构4、架构5、架构6. . . 架构13”(根节点“省”对应“架构0”)。

这个报表对应的oracle数据库表有两个,tree(树形结构维表)和kpi(指标事实表),如下图:

Tree表

Kpi表

Tree表的叶子节点,通过id字段与kpi表关联。这个报表的难点在于1、动态的多层数据、标题;2、树形结构数据与事实表关联。

采用润乾集算报表实现的第一步:编写集算脚本tree.dfx,完成源数据计算。集算脚本如下:

A1:连接预先配置好的oracle数据库。

A2:新建一个序列,内容是“省、地市、区县、营业部、架构4、架构5、架构6. . . 架构13”。

A3:使用oracle数据库提供的connectby语句编写sql,从数据库中取出指定id(节点编号)的所有父节点id、name。id是预先定义的网格参数,如果传进来的值是104020,那么A3的计算结果是:

A4:为A3增加一个字段title,按照顺序,对应A2中的层级。结果是:

A5:计算变量level,是A3序表的长度,也就是输入节点“104020”的层级号“4”(“省”为第一级)。

A6:计算输入节点“104020”的下一级对应的层级名称“架构4”,赋值给变量xtitle。

A7:编写sql,从tree表中取出输入节点“104020”的所有叶子节点,并拆分sys_connect_by_path字符串,得到这些叶子节点对应的输入节点“104020”的下一级节点。形成临时表leaf与kpi表关联分组汇总。为了能够得到输入节点“104020”的下一级节点的name,leaf还需要与tree关联一次。需要注意的是,如果输入节点号本身就是叶子节点,结果中的name将为空。完整的sql如下:

with leaf as(
SELECT tree.id id,REGEXP_SUBSTR(SYS_CONNECT_BY_PATH(id,';'),'[^;]+',1,2) x FROM tree
whereconnect_by_isleaf=1
START WITH ID =?
     CONNECT BY NOCYCLE PRIOR id = pid
)
select nvl(leaf.x,max(leaf.id))id,'"+xtitle+"' title,max(tree.name) name, sum(kpi.kpi1)kpi1,sum(kpi.kpi2) kpi2,sum(kpi.vipkpi1) vipkpi1,sum(kpi.vipkpi2) vipkpi2
from leaf left join kpi on leaf.id = kpi.idleft join tree on leaf.x=tree.id
group by leaf.x order by leaf.x

计算的结果是:

A8:关闭数据库连接。

A9:向报表返回A4、A7两个结果集。

第二步:在报表设计器中定义报表参数和集算数据集,调用tree.dfx。如下图:

定义报表参数“id”

定义集算数据集(其中的参数名“id”是集算脚本的输出参数名,参数值“id”是报表参数。

第三步,设计报表如下图:

A列是报表的左半部分,是输入节点(例如:“104020”)的所有父节点和它本身,横向扩展,A1的值是id,显示的是title。A3显示的是name。

B列是报表的中间部分,是输入节点(例如:“104020”)的下一级子节点,纵向扩展。在B3格中设置隐藏列的条件是value()==null,如果输入节点本省就是叶子节点,那么name==null,B列就会隐藏不显示了。

C列到F列是报表的右半部分,显示的是ds2.name对应的kpi统计值。

为了实现报表的格式需要,A3单元格需要将左主格设置为B3。

为了实现钻取功能,需要:

1、  将A3单元格的超链接属性定义为表达式:"/reportJsp/showReport.jsp?rpx=r4.rpx&id="+ds1.ID。超链接指向本报表自身,报表参数是当前列对应的ds1.ID。

2、  将B3单元格的超链接属性定义为表达式:"/reportJsp/showReport.jsp?rpx=r4.rpx&id="+ds2.ID。超链接指向本报表自身,报表参数是当前行对应的ds2.ID。

第四步:发布报表并运行。实际的超链值如下图:

从上述实现步骤可以看到,难度最大的是tree.dfx中的A7单元格的复杂SQL。应该说,oracle数据库的树形递归查询还是比较丰富的,用其他数据库(比如MySQL,PostgreSQL及Greenplum等)可能就很难实现A7中的SQL。那么有什么其他方案,可以让这些数据库也能实现上述复杂的树形结构计算呢?

时间: 2024-08-12 05:32:57

报表开发实例——动态多层次KPI钻取报表(I)的相关文章

报表开发实例——动态多层次KPI钻取报表(II)

在报表开发实例--动态多层次KPI钻取报表(I)中,我们说到了动态层次报表需要层次钻取的场景,并介绍了利用oracle复杂sql的实现方法.这里仍然通过该报表来了解一下使用"脚本+本地文件"的开发方法. 各级部门KPI报表的格式和具体要求参见(I).有所不同的是,报表数据源从数据库表变为本地文件:tree.b(树形结构维表)和kpi.b(指标事实表),数据如下图: Tree文件数据 Kpi文件数据 Tree的叶子节点,通过id字段与kpi表关联.KPI文件每个ID每天都会新增kpi记录

Devexpress报表开发(三):创建主从报表

Devexpress报表开发(三):创建主从报表 此教程是在上一篇的基础上教会大家如何使用Devexpress报表控件来创建主从报表的,我们将从以下几步来实现主从报表: 添加从报表数据 创建从报表 设计从报表布局 显示预览结果 1.添加从报表数据 我们打开上一篇文章的工程,然后右击Report Explorer中的sqlDataSource1,选择Manage Queries(查询管理),然后点击添加. 然后我们按照上一篇文章的步骤添加一张与之关联的表,用作从报表数据. 然后我们在右击sqlDa

ReportingServies报表开发实例教程

效果图如下: 1.我们先完成sql语句的编写,以下是各表和关键字段: --t:hx_t_waterusedamount--用水水量 hx_t_waterusedamountid --f:hx_frecorder(抄表员),hx_fzone(区段),hx_fmeterid(水表),hx_fpayamount(结算水量),hx_fdepartmentid(收费部门) --t:hx_t_receivable--应收水费 --f:hx_fcollchargesreceivable4(污水处理费),hx_

ReportingServies——SQLServer报表开发综合实例

上一篇:ReportingServies报表开发实例教程 如果我们安装了sqlserver2008 R2,将会自动安装一个报表开发工具 不要以为此报表开发工具只适合于sqlserver2008,其实在sqlserver2012中也是支持的,事实上我现在项目中就是使用的sqlserver2012. 使用此工具进行报表开发,将会十分快速而且方便.这里我通过一个综合实例来演示它的使用技巧,可以毫不夸张的说,如果你能使用此工具把这个Demo做出来,那么工作中遇到的80%报表,你都能够使用此工具进行开发了

利用JasperReport+iReport进行Web报表开发

用JasperReport+iReport进行Web报表开发 序言 在非常多实际的项目里,报表都是当中十分重要的组成部分,比如把查询结果以报表的形式呈现出来.这里所提到的报表可不是简单的二维表,而是拥有复杂表头的.多维的.能够在执行期从数据库中自己主动读取数据.可自己主动分页.拥有丰富的页面元素(图片,超连接等).支持分组和交叉表.支持打印.最好还能导出到Excel或Word…...(汗L).可是显而易见,报表功能越强大,提供的服务越丰富,其复杂度也就越提高,所以仅靠石器时代的手工方式生成报表是

使用JasperReport+iReport进行Web报表开发

前言 在实际工程中非常,报告是其中很重要的一部分,结果以报表的形式呈现出来.这里所提到的报表可不是简单的二维表,而是拥有复杂表头的.多维的.能够在执行期从数据库中自己主动读取数据.可自己主动分页.拥有丰富的页面元素(图片.超连接等).支持分组和交叉表.支持打印.最好还能导出到Excel或Word…...(汗L). 可是显而易见,报表功能越强大,提供的服务越丰富,其复杂度也就越提高,所以仅靠石器时代的手工方式生成报表是不能满足须要的. 所幸,眼下我们所熟知的几款报表工具功能上足够强大,并且都附有非

BIEE报表开发

(1)报表开发实例结果图 (2)开发报表步骤: (1)创建分析 (2)创建仪表盘提示 (3)创建仪表盘并发布 登录网址,输入用户名和密码 1) 新建——>分析——>选择主题区域——> 主题区域部分相当于数据库中的表 所选列区域部分相当于select后面从表中所取的字段 过滤器区域相当于SQL中的where条件 把“主题区域”的表中所需要的字段拖到右侧“所选列”,然后点击“结果” 复合布局可以放多个视图,比如表格.数据透视图.图表等 2)在结果页面,删除表,点击右上方“新建——数据透视表”

如何实现报表数据的动态层次钻取(二)

上一篇<如何实现报表数据的动态层次钻取(一)>介绍了利用复杂 sql 实现动态层次结构的方法,但该方法依赖 Oracle 的递归语法,在其他类型的数据库中难以实现.要想通用地实现此类报表,可以使用下面介绍的“集算脚本 + 本地文件”的方法. <各级部门 KPI 报表>的格式和具体要求参见上一篇文章.有所不同的是,报表数据源从数据库表变为本地文件:tree.b(树形结构维表)和 kpi.b(指标事实表),数据示例如下图: Tree 文件数据 Kpi 文件数据 说明:Tree 的叶子节

Devexpress报表开发:实例数据库信息

Devexpress报表开发:实例数据库信息 项目使用的是Access数据库,该数据库用于某宾馆的会员管理以及住房管理,共有以下几张表: Vip_Table:系统会员信息存放. House_Table:该宾馆所拥有的房间. House_Record:住房记录表. 1.Vip_Table结构 2.House_Table结构 3.House_Record结构 4.实例数据库下载     下载见附件 有时间会把我所使用的Devexpress以及其破解文件上传.同时附带破解方法.