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

上一篇《如何实现报表数据的动态层次钻取(一)》介绍了利用复杂 sql 实现动态层次结构的方法,但该方法依赖 Oracle 的递归语法,在其他类型的数据库中难以实现。要想通用地实现此类报表,可以使用下面介绍的“集算脚本 + 本地文件”的方法。

《各级部门 KPI 报表》的格式和具体要求参见上一篇文章。有所不同的是,报表数据源从数据库表变为本地文件:tree.b(树形结构维表)和 kpi.b(指标事实表),数据示例如下图:

Tree 文件数据

Kpi 文件数据

说明:Tree 的叶子节点,通过 id 字段与 kpi 表关联。KPI 文件每个 ID 每天都会新增 kpi 记录,总数据量较大。

具体实现步骤如下:

第一步  编写集算脚本 tree.dfx,完成源数据计算,输入参数为当前节点号 id。

集算脚本如下:

  A B C
1 =[“省”,“地市”,“区县”,“营业部”]|to(4,13).(“架构”+string(~)) =file(“D:\\files\\tree.b”)[email protected]() =file(“D:\\files\\kpi.b”)[email protected]()
2 =B1.switch(PID,B1:ID) [email protected](ID==string(id)) =B2.prior(PID).rvs()
3 =C2.new(ID,NAME,A1.m(#):title) >xtitle=A1.m(A3.len()+1) =B1.select(PID==B2)
4 =if(C3.len()>0,C3,B1.create().insert(0)) =B1.new(ID, ~.prior( PID, B2):GID ).select( GID) =B4.run(GID=GID.m(-1).ID )
5 [email protected](ID,C4:ID) =A5.groups(ID.GID:ID;sum(KPI1):KPI1,sum(KPI2):KPI2,sum(VIPKPI1):VIPKPI1,sum(VIPKPI1):VIPKPI2) =B5.align(A4:ID,ID)
6 =C5.new(A4(#).ID:ID,A4(#).NAME:NAME,xtitle:TITLE,KPI1:KPI1,KPI2:KPI2,VIPKPI1:VIPKPI1,VIPKPI2:VIPKPI2) return A3,A6  

代码说明:
A1:新建一个序列,内容是各层节点的 title:“省、地市、区县、营业部、架构 4、架构 5、架构 6. . . 架构 13”。

B1:读入 tree.b 的数据。

C1:新建一个文件游标,连接 kpi.b 文件。使用游标分段读取数据,适用于 kpi.b 较大,无法一次装入内存的情况。

A2:将 B1 的 PID 字段切换成 B1 自己的引用,条件是 PID=ID。

B2:在 B1 中取出指定 id 对应的记录。

C2:使用 prior 函数,查找 C2 自己和所有祖先节点,顺序反转。

A3:用 C2 生成新序表,字段是 ID、NAME 和 A1 中对应的组织结构。

B3:定义变量 xtitle 赋值为指定 id 对应下一层节点的 title。

C3:在 B1 中找出 B2 的直接子节点。

A4:如果 C3 没有成员,说明当前节点是叶子,用 B1 的结构新建一个序表(只有一条空记录)。否则,直接将 C3 赋值给 A4。

B4:用 B1 生成新序表,字段是 ID、GID(分组 id)。GID 是用 prior 函数找到当前每条记录到祖先 B2 的路径。之后去掉 GID 为空的记录,也就是非 B2 子孙的记录。

C4:循环将 B4 的 GID 赋值为所有祖先中的倒数第二个,也就是当前 id 的子节点。

A5:将 C1 的 ID 字段切换成 C4 对应记录,去掉找不到 ID 对应值的记录,也就是非 B2 子孙的叶子。

B5:对 A5 按照 ID.GID 分组,汇总 kpi。

C5:将 B5 与 A4 对齐。

A6:用 C5 生成新序表。如果 id 是叶子的话,id、name 为空,方便报表隐藏列,避免叶子显示两次。

B6:向报表返回两个结果集。

接下来的第二到四步可以参见《 如何实现报表数据的动态层次钻取(一) 》,这里不再赘述,完成后即可实现相应的效果。

通过上述集算器代码,可以使用的数据源不仅限于本地文件,也可适用于一般数据库,这样就可以在那些不支持递归查询的数据库上通用地实现此类报表了。

更多报表样式相关问题请查看:报表样式相关问题分类导航

原文地址:https://www.cnblogs.com/zozoxxma/p/12011240.html

时间: 2024-08-30 05:37:48

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

如何使用活字格搭建报表数据中心系统?

黑龙江珍宝岛药业股份有限公司(以下简称珍宝岛)是生产高端中药制剂产品的现代化制药企业,是黑龙江民营企业用的标志性单位. 项目背景和需求 1. 企业多系统并存,需要对数据进行整合和规范 通过二十年发展,珍宝岛现已成为国内有相当影响力的药业集团.近十年来,在公司主管部门努力下,基础信息系统财务系统.营销系统.人力资源系统以及OA系统等已经建设完成.多系统运行就伴随着信息孤岛的诞生,各个系统间数据规范不统一,无法联合运用.且在各部门,还有大量规范的EXECL表格在运行.如何使数据规范统一,消除信息孤岛

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

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

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

在报表项目中有时会有动态层次报表,而且还需要层次钻取的场景,开发难度较大.这里记录了使润乾集算报表开发<各级部门KPI报表>的过程. <各级部门KPI报表>初始状态如下图: 当前节点是根节点"河北省",要求报表显示当前节点的下一级节点"地市"汇总的KPI数值.Kpi又分为普通指标和VIP指标两类,共四项.如果点击"石家庄"来钻取的时候,要求能够将石家庄下一级的KPI汇总指标显示出来,如下图: 点击"中心区&quo

润乾集算报表呈现输出之超链接钻取

报表展现后,经常需要表中数据能够钻取,如汇总数据钻取到明细数据,上级单位钻取到下级单位.而钻取的层级往往有多层,这就需要报表工具支持钻取功能. 润乾集算报表支持超链接钻取,可以满足报表用户数据钻取的需求.这里通过示例来看一下. 1.新建汇总报表 这里以某年度按地区销售情况汇总报表为例,点击地区钻取到相应地区下订单明细数据.设置报表年份参数year,并编辑报表表达式如下: 2.设置超链接 在设计器右侧的属性面板中"超链接-超链接"表达式编辑框中设置A3格超链接表达式为:"rep

报表工具的动态数据源实现

有时候我们需要用参数动态指定数据源,或将多数据源连接为单数据源,或向子报表.table控件动态传入数据源名.对于此类需求,报表工具经常要借助高级语言实现或牺牲安全性以降低复杂度,尤其是BIRT.Jasper等单源报表. 使用免费的集算器可以弥补这一不足.集算器封装了丰富的结构化计算函数,支持动态解析表达式,支持多数据源混合计算,书写简单脚本就能实现动态数据源.集算器还提供了简单易用的JDBC接口,报表工具可将集算器脚本文件当做数据库存储过程执行,传入参数并用JDBC获得返回结果. 集算器与报表工

复杂报表设计之动态报表

需求说明 如上图所示,可以需选择不同的分组维度进行数据分析,例如类别.供应商维度:可以通过用户输入的参数值进行数据动态过滤,例如传入不同供应商.类别的值进行数据查询过滤:可以选择要显示的附加字段数据:同时要求显示有排名(每个分组内的数据从大到小显示).占比(产品占该分组维度总订购量的百分比). 制作过程: 1. 数据准备 此示例使用脚本数据集完成数据的准备工作,此处使用脚本数据集是处于对组内排名需求的考虑,完整脚本配置如下图所示: 其中,A1:使用 connect 函数连接 demo 数据源A2

微信小程序结合后台数据管理实现商品数据的动态展示、维护

微信小程序给我们提供了一个很好的开发平台,可以用于展现各种数据和实现丰富的功能,本篇随笔介绍微信小程序结合后台数据管理实现商品数据的动态展示.维护,介绍如何实现商品数据在后台管理系统中的维护管理,并通过小程序的请求Web API 平台获取JSON数据在小程序界面上进行动态展示. 1.整体性的架构设计 我们整体性的架构设计,包含一个Web管理后台.一个Web API统一接口层.当然还有数据库什么,另外还有一个小程序客户端.整个架构体系还是以我之前随笔介绍的<整合微信小程序的Web API接口层的架

数据的动态合并和导出至EXCEL

最近一段时间都在处理数据的动态合并和导出EXCEL的问题,写个demo记录下,希望和我碰到同样问题的博友可以顺利解决:后面会提供demo下载链接. (VS2012,ASP.NET) 一.主要解决以下问题: 1.根据业务逻辑动态合并table单元格2.动态合并后序号重写3.datatable导出excel4.datatable导出excel特殊字符处理5.在实际问题中可能还有少许BUG,自行调试 二.重要代码摘录: 1.前台获取table HTML代码: 1 <input type="hid

rdlc报表“报表数据”窗口

一不小心把报表数据窗口关掉了,结果死活找不到重新打开的地方,折腾了一个多小时才发现有人和我犯了一样的错误http://www.cnblogs.com/junjie94wan/archive/2013/09/11/3314789.html 快捷键是 Ctrl+Alt+D 感谢这个同样悲催的同学,不幸的人总是有相同的不幸...