基于设置页面、视点、行维、列维等功能,我们可以实现分析当中用到的旋转、切片功能。
前面几小节,说明了如何全表呈现一张分析表单,但那些还是静态呈现方式。
本节开始侧重阐述上卷、下钻功能、页面切换的实现。
(上卷、下钻页面)
上卷:
上卷功能实现比较简单:基本原理为“数格子”,及找出需要“切”掉的单元格,把剩余的单元格重新装配为一个新的viewGrid.
根据新的viewGrid,show Data.
上个示意图(以列为例):
点击第一季收缩,首先找出受影响的列 E、F、G,根据受影响的列,去掉列头,接着对行循环,去掉图中蓝色的区域,剩余的区域就是新的viewGrid.我们可以根据这个新的viewGrid,直接show Data.
row上卷:
getRemainRowRollUp方法:获得上卷后剩余的行
/*
* 获得上卷后剩余的行
*@param rowMemsOld 行维度表头的二维数组
*@factDatas factDatas
*@colPoint 坐标-列
*@rowPoint 坐标-行
*@memberId 成员id
*@rowList 行维度二维数组--结果
*@rowDataList 事实数据--结果
*
*/
private void getRemainRowRollUp(int[][]rowMemsOld,int colPoint,int memberId,DataCell[][] factDatas,int rowPoint,List<int[]> rowList,List<DataCell[]> rowDataList, FormGrid oldGrid){
getRemainRowRollUp 参数分为三类:
- 原始的fromGrid
- 收缩点信息 (行、列、维度)
- 返回值:行维度成员二维数组、事实数据二维数组
getRemainRowRollUp方法内的基本逻辑为:把表分为三段,受影响区域的前面部分 和后面部分数据直接添加到要返回的的2个数组当中(都是2维数组),中间部分收缩处理后加入结果数组
rollup方法:构建收缩后的formGrid,rollup方法中,调用了getRemainRowRollUp方法
newDrillDownOrRollUpPoint:根据分组对位置进行修正!
如何判断某一点是否能展开收缩?遍历所有成员,对每一个成员调用方法:getRowImgByValidate,1为+(可以展开),-1为-(可以收缩) 0 无收缩 展开符号。
getRowImgByValidate方法基本逻辑是如下2段:
第一段:遍历当前组当中的布局及其布局下的成员,如果和当前节点存在父子关系,这当前节点前可能有展开收缩符号,否则啥都没有。
第二段:遍历检查二维数组rowMember,看是否存在当前节点的child,如果有,该节点可收缩,否则可展开。
下钻:
以列为例,5步完成下钻动作。
- 根据当前点位相关的memberId,找到其下级的member,
- 依据这些members,动态生成mdx String,
- 执行mdx,获取相应的result.
- 根据执行结果result重新生成viewGrid!
- 根据这些新的viewGrid,重新showData!