码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-05-12 08:09:35      阅读:302      评论:0      收藏:0      [点我收藏+]

标签:动态表头   多层次钻取报表   集算报表   动态数据源   

         报表开发实例——动态多层次KPI钻取报表(I)中,我们说到了动态层次报表需要层次钻取的场景,并介绍了利用oracle复杂sql的实现方法。这里仍然通过该报表来了解一下使用“脚本+本地文件”的开发方法。

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

技术分享

Tree文件数据

技术分享

Kpi文件数据

         Tree的叶子节点,通过id字段与kpi表关联。KPI文件每个ID每天都会新增kpi记录。

         采用润乾集算报表实现的第一步:编写集算脚本tree.dfx,完成源数据计算,输入参数为指定当前节点号id。集算脚本如下:

技术分享

         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:向报表返回两个结果集。


         制作过程的第二到四步这里不再赘述,参见前文报表开发实例——动态多层次KPI钻取报表(I)

         这个代码以本地文件作为数据源编写,能够很容易地改造成使用数据库作为数据源,从而可以在那些不支持递归查询的数据库上实现此类报表。


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

标签:动态表头   多层次钻取报表   集算报表   动态数据源   

原文地址:http://blog.csdn.net/u012388497/article/details/45641403

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!