报表开发思路之报表规则认定以及层次坐标
第一节:扩展规则
单元格进行扩展时,主单元格或同级别单元格被拉大成合并单元格,附属单元格被动复制;上主格扩展时(横向扩展),附属格被横向同步复制;左主格扩展时(纵向扩展),附属单元格纵向被同步复制。
扩展类型包含:横向扩展、纵向扩展、不可扩展 三种类型;
延伸扩展概念:跟随扩展、多层扩展、交叉扩展
跟随扩展:当一个单元格扩展时,它可以带动其他单元格跟随它一同扩展。
多层扩展:一个单元格可能既跟随其他单元格扩展(做为其他单元格的附属格),同时也自身扩展(做为另外单元格的主格)。
交叉扩展:同一报表中可能同时有纵向扩展格和横向扩展格,如果它们的子格有重叠部分,则这些子格就既有左主格又有上主格,在扩展时会被既向下又向右复制,形成一片矩形单元格区域,从而做到交叉扩展。
例如下图所示:
第二节:引用规则
单元格扩展时,附属单元格可以动态引用主单元格的值。随着主单元格扩展,附属单元格被复制到不同的新的位置,对主单元格的引用也相应的发生变化。
例如:=A2*3 (其中 A2为扩展主格)
第三节:统计规则
单元格扩展时,附属单元格如采用缺省的集合表达式,则缺省统计所属主格区域范围内的所有的目标单元格的值 例如:SUM(C4{})
第四节:主附规则
1、左主格认定
即跟随着执行纵向扩展;左主格的认定是从当前单元格依次向左反推查找。假设当前单元格为C2,左边单元格为B2
① 当前单元格C2如果手工设置了左主格,则纵向扩展的左主格为C2设定的左主格值;
② 如果没有设置纵向扩展的左主格,则检查左边的单元格B2是否为纵向扩展单元格,并且与C2在同一维度(行范围内),如果是,则左边的单元格B2就是当前单元格C2的左主格
③ 如果B2不是纵向扩展单元格,就继续检查B2前面的B1单元格;如果符合条件,则当前单元格的纵向扩展左主格为B1;否则继续向前查找;
④ 如果当前单元格前面的所有在同一维度范围的单元格都不符合要求,则C2单元格的纵向扩展的左主格为根格(^0格)。
2、上主格认定
即跟随着执行横向扩展;上主格的认定是从当前单元格依次向上反推查找。假设当前单元格为B4,上边单元格为B3
① 当前单元格B4如果手工设置了上主格,则横向扩展的上主格为B4设定的上主格值;
② 如果没有设置横向扩展的上主格,则检查上边的单元格B3是否为横向扩展单元格,并且与B4在同一维度(列范围内),如果是,则上边的单元格B3就是当前单元格B4的上主格
③ 如果B3不是横向扩展单元格,就继续检查B3上面的B2单元格;如果符合条件,则当前单元格的横向扩展上主格为B2;否则继续向上查找;
④ 如果当前单元格上面的所有在同一维度范围的单元格都不符合要求,则B4单元格的横向扩展的上主格为根格(^0格)。
3、附属格认定
附属格即子格,附属格与主格之间是相对关系,当某个单元格被设置可扩展属性(横向扩展、纵向扩展),则跟随其一起执行横向或者纵向复制扩展的单元格统称为扩展格的附属格(或子格);附属格分直接附属格和间接附属格。
第五节:关系规则
附属格(子格)的扩展属性会随着主单元格的扩展属性变化,当单元格左侧或上方相邻的单元格具有扩展属性时,单元格默认其左侧相邻单元格为其左主格,默认上方相邻的单元格为其上主格。
主附格之间的关系包括两种:过滤关系和跟随关系。
• 过滤关系
过滤关系是指附属格(子格)会默认将主格的数据作为过滤条件进行过滤,使主附格之间的数据能对应的显示出来,但是这个默认的过滤关系只限于两个单元格中的字段来自于同一个数据集。
注:过滤关系除了可以通过主附格默认添加之外,还可手动添加。
• 跟随关系
跟随关系就是指附属格(子格)会默认跟随主格的扩展方向进行分组,即当前主格纵向扩展,子格跟随主格默认纵向扩展;当主格横向扩展,子格会跟随主格横向扩展分组;
层次坐标
在进行报表设计时,单元格尚未扩展,但是单元格的表达式往往需要对扩展后的单元格进行运算,例如,A1单元格扩展成A1-A5,如果某个单元格的值希望对扩展后的A2和A3进行求和,在扩展前,表达式很难描述这样的关系,而对于扩展后单元格的唯一性的定义,就是单元格的层次坐标。层次坐标是实现复杂报表的一个重要功能。层次坐标包含两种类型:绝对坐标(层次坐标)、位移坐标。
一、绝对坐标
在进行报表设计时,单元格尚未扩展,但是其它单元格的表达式可能需要此单元格扩展后的位置。这时,就要对扩展后的每个单元格进行唯一性定义,这就是单元格的层次坐标。绝对坐标(层次坐标)是用于唯一描述(精确定位)扩展后的每一个单元格的表达式。
绝对坐标语法:Cellx[absCoordinates] 左主格与上主格用分号隔开
绝对坐标说明:
(1)、Lk 表示Cellx 目标单元格的左主格(LeftHeadCell)
(2)、Tk 表示Cellx 目标单元格的上主格(TopHeadCell)
(3)、Lk为Cellx的左主格,lk为左主格扩展后的次序,即扩展后的第几个单元格,如果不指定lk或者lk为0,则表示当前表达式所在的单元格的所属的当前左主格。Cellx为目标单元格,应该为Lk,Lk-1......L1的附属单元格。 与之类似,Tk为Cellx的上主格,tk为上主格扩展后的次序。
(4)、如果只有上主格,没有左主格,分号不能省略,即应该写成如下的格式:Cellx[;Tk:tk,Tk-1:tk-1,......T1:t1]
(5)、如果只有左主格,没有上主格,分号可以省略,即可以写成如下格式:Cellx[Lk:lk,Lk-1:lk-1,......L1:l1]
(6)、Lk与Tk的次序是从远到近的写法;也就是说越是前面的上级主格越靠前。而找到绝对坐标所表示的单元格的次序是从最上级的主格开始。
举例:层次坐标C1[A1:2,B1:1],找到目标单元格C1的次序是:首先找到A1单元格扩展后的第2格(这里假设为mA1),再次找到第二个A1单元格下面的B1单元格扩展出来的第一个B1单元格(这里假设为mB1),然后根据当前单元格与获取的mB1单元格所共同拥有的区域范围的所有符合要求的C1目标单元格。
(7)、当前单元格概念:表示此表达式写在哪个单元格中,就表示此单元格为当前单元格,
(8)、共同区域范围:通过当前单元格(NowCell)与绝对坐标定位到的某个单元格(absCell)两者之间取交集范围。即NowCell和absCell两个单元格所共同拥有的主格所组成的区域范围内取交集(两者之间的共同的主格所限定的区域范围)
(9)、最终在共同区域范围内来查找获取符合条件的目标单元格Cellx出来;
(10)、完整的绝对坐标表达式应该包括Cellx的所有主格。^0 根格可以省略。绝对坐标的获取与表达式写在哪个单元格中有密切的关联关系。
实例说明:
例1:C2单元格的公式:= C1[A1:3,B1:2]
公式的含义:表示取当前单元格C2与绝对坐标定位到的单元格共同区域范围内的目标单元格C1的值,左主格A1(相对于C1来讲)纵向扩展的第三个,那就是图片的单元格值为3的单元格;再查找此下面B1单元格纵向扩展的第二个,也就是图片上打勾前面的单元格值得为5的B1单元格,再求此打勾的前单元格值为5的单元格与当前单元格区域范围内的目标C1单元格,那么就是15。
上图中:
C1[A1:1,B1:2]的返回值为5;
C1[A1:2,B1:3]的返回值为12;
C1[A1:3,B1:4]的返回值为21;
B1[A1:2,B1:2]的返回值为5;
B1[A1:3,B1:4]的返回值为7;
例2:在A1单元格中写入相关获取绝对坐标表达式获取相应的值
在A1单元格中分别写入如下四个坐标,分别计算获取值
C3[A3:1,B3:2;C1:2,C2:3];
C3[A3:3,B3:3;C1:1,C2:2];
C3[A3:2,B3:1;C1:3,C2:2];
C3[A3:3,B3:1;C1:3,C2:3];
通过对A1单元格写入不同的绝对坐标表达式,获取的值和原理如下详细描述:
C3[A3:1,B3:2;C1:2,C2:3]的返回值为216;
左主格:A3扩展的第一个,B3扩展的第二个
上主格:C1扩展的第二个,C2扩展的第三个
最终精确定位到如图片上标注的216单元格
C3[A3:3,B3:3;C1:1,C2:2]的返回值为255;
左主格:A3扩展的第三个,B3扩展的第三个
上主格:C1扩展的第一个,C2扩展的第二个
最终精确定位到如图片上标注的255单元格
C3[A3:2,B3:1;C1:3,C2:2]的返回值为228;
左主格:A3扩展的第二个,B3扩展的第一个
上主格:C1扩展的第三个,C2扩展的第二个
最终精确定位到如图片上标注的228单元格
C3[A3:3,B3:1;C1:3,C2:3]的返回值为248;
左主格:A3扩展的第三个,B3扩展的第一个
上主格:C1扩展的第三个,C2扩展的第三个
最终精确定位到如图片上标注的248单元格
直接采用绝对坐标的方法,一般获取的是所有符合要求的目标单元格值的集合,最终显示出来得结果会用分号隔开,所以一般会在前面加上sum、avg等函数在后面加入{} 集合符合。
备注说明:针对绝对坐标一般不常独立使用,经常后面需要取集合求和平均值、排名等等。后续章节中详细描述讲解。此处主要介绍绝对坐标的表示方法含义及获取值的原理。
二、位移坐标
很多时候,报表设计者并不知道目标单元格的具体位置,仅仅知道目标单元格相对于当前单元格的位移,这时就需要用到位移坐标。位移坐标是用来描述目标单元格和当前格之间的位置关系的表达式。
位移坐标语法:Cellx[relCoordinates]
左主格与上主格用分号隔开
位移坐标说明:
(1)、Lk 表示Cellx 目标单元格的左主格(LeftHeadCell)
(2)、Tk 表示Cellx 目标单元格的上主格(TopHeadCell)
(3)、当前单元格:表示此表达式写在哪个单元格中,计算到到此单元格的时候,此单元格就作为当前单元格对象。
(4)、+-符号:表示单元格的偏移量;向右向左或向下向上移动几列或几行左主格时: + 表示向下移动几行,- 表示向上移动几行;上主格时: + 表示向右移动几列,- 表示向左移动几列;
(5)、Lk为Cellx的左主格;lk为单元格的偏移量:即表示当前单元格所属的主格Lk和目标单元格Cellx所属的左主格Lk之间的偏移量,(也就是说当前单元格和目标单元格必须要有共同的左主格Lk单元格,否则取值为空);
也就是说Lk为当前单元格的左主格所属的Lk单元格(-)向上或(+)向下移动lk行所对应的Lk单元格(作为后续左主格的定位标准范围)。如果不指定lk,则表示为当前单元格所在的左主格Lk, Cellx为目标单元格,一般为Lk,Lk- 1,......L1的附属单元格。与之相似,Tk为Cellx的上主格,tk 为单元格的偏移量。
(6)、如果只有上主格,没有左主格,分号不能省略,即应该写成如下的格式: Cellx[;Tk:±tk,Tk-1:±tk-1,......T1:±t1]
(7)、如果只有左主格,没有上主格,分号可以省略,即可以写成如下格式:Cellx[Lk:±lk,Lk-1:±lk-1,......L1:±l1]
(8)、Lk与Tk的次序是从远到近的写法;也就是说离当前单元格最远的主格开始的,也可以理解为从最高级别的主单元格开始。越是前面的上级主格越靠前。
而找到位移坐标所表示的主格单元格是从最上级的主格开始。
举例:位移坐标C1[A1:+2,B1:-1,C1+4]
每个节点都是首先跟当前单元格比较求出相应的左主格。
例:A1:+2 找到当前单元格的左主格A1目标格;从此A1向下移动2行所对应的新的A1目标格,此新的A1目标格作为后续的左主格的区域范围限定条件;此例中就作为下一个B1的范围限定条件;
B1:-1 找到当前单元格的左主格B1目标格,根据偏移量计算出扩展次序。再通过上一步A1分组范围内B1单元格扩展次序==B1刚刚计算出来的次序;获取到的新的目标格B1(左主格),此格继续作为下一个的范围判定条件。 C1+4 依次类推
(9)、共同区域范围:通过当前单元格(NowCell)与位移坐标定位到的某个主格 (relCell)两者之间取交集范围。即NowCell和relCell两个单元格所共同拥有的主格所组成的区域范围内取交集(两者之间的共同的主格所限定的区域范围)
(10)、最终在共同区域范围内来查找获取符合条件的目标单元格Cellx出来;
(11)、完整的位移坐标表达式应该包括Cellx的所有主格。^0 根格可以省略。
位移坐标的获取与表达式写在哪个单元格中有密切的关联关系。
在报表中常常需要计算同期比、比上期之类的与时间相关的运算,而这些运算往往需要用到下一行的数据减上一行数据,后一列数据减去前一列数据等等,这种涉及行间、列间的元算,被称为位移运算,相关的表达式被称为位移表达式。
下面我们通过几个实例对位移坐标进一步进行说明和描述。
实例说明:
例1:在D1单元格中写入位移坐标获取值;
如果位移坐标表达式写在图示18的位置,那么获取的就是5;在扩展后的报表中,可以看出,D1~D9 是获取不到数据的。
例2:通过下图再次说明位移坐标
C2[B2,A2]:表示当前格所在当前分组格B2和A2的共同覆盖区域中的所有的C2单元格;
C2[B2:-1],A2:+1]: 表示当前格所在当前分组格B2之前偏移一个位置的B2分组格和当前格所在当前分组格A2之后偏移一个位置的A2分组格共同覆盖区域中的所有C2单元格;
C2[-1]:表示离当前格最近的分组格之前偏移一个位置的分组格覆盖区域中的C2单元格;
B2[B2,A2]=B2[B2:0,A2:0]=B2[B2:0,A2:0]=B2 都表示当前单元格。