在报表开发实例——动态多层次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)。
这个代码以本地文件作为数据源编写,能够很容易地改造成使用数据库作为数据源,从而可以在那些不支持递归查询的数据库上实现此类报表。
原文地址:http://blog.csdn.net/u012388497/article/details/45641403