欢迎投稿

今日深度:

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

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


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

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

\

<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHAgYWxpZ249"center">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)

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


www.htsjk.Com true http://www.htsjk.com/DB2/20311.html NewsArticle 报表开发实例——动态多层次KPI钻取报表(II) 在 报表开发实例——动态多层次KPI钻取报表(I) 中,我们说到了动态层次报表需要层次钻取的场景,并介绍了利用oracle复杂sql的实现方...
评论暂时关闭