层次坐标
在进行报表设计时,单元格尚未进行扩展,但是其它某些单元格的表达式往往需要对这个单元格扩展后的单元格进行精确定位并运算。
例3.4.1-1:
对单元格B3来说,需要从B2扩展出来的单元格中找到对应月份为3月的格子然后返回其值。
然而B2能扩展出几个格子以及每个格子在什么位置,在扩展前很难描述,因此,为了避免混淆,应该对扩展后的每个单元格进行唯一性定义,这就是单元格的层次坐标。层次坐标是用于唯一描述(精确定位)扩展后的每一个单元格的表达式。
层次坐标的运算结果返回目标单元格。如果层次坐标能够定位到一个单元格,那么返回该单元格的值,如果定位到多个单元格,那么返回这些单元格中的第一个单元格的值。
表达式规则:
说明:
例3.4.1-2:
例3.4.1-3:
位移坐标
有了层次坐标后,很多时候并不够用,因为大部分时候报表设计者并不知道目标单元格的具体位置,仅仅知道目标单元格相对于当前单元格的位置,基于这种考虑,我们给出了位移坐标,从而层次坐标更多时候成了模型上的意义,而非应用上的意义。
位移坐标的运用非常广泛,例如报表中常常需要计算同期比、比上期之类的与时间相关的运算,而这些运算往往需要用到下一行的数据减上一行数据,后一列数据减前一列数据,等等,这种涉及到相邻n行或者n列的行间、列间的运算,称为位移运算,相关的表达式称为位移表达式。
位移坐标是用来描述目标单元格和当前格之间的位置关系的表达式。
表达式规则:
说明
例3.4.3-1:
由于层次坐标和位移坐标的表示很烦琐,而大部分时候对于单元格的定位是和当前格的位置有关系的,一般是指当前格的主格或者和当前格有着相同主格的单元格,此时可以采用缺省的写法。
缺省情况下,如果目标单元格的某个主格Lk和当前单元格的主格相同,那么层次坐标(位移坐标)中该主格可以不写
如果目标单元格与当前格的关系满足3.3.2中的缺省引用规则,那么直接遵循该规则的引用表示法,不需要层次坐标(位移坐标)。
例3.4.2-1:
描述: 在3.3.1中提到了根格的概念,即报表有个首格(根格),报表中的扩展单元格是逐级扩展的,有主格、附属格的概念,呈树状的结构,而根格则是这棵树的根。如下图所示:
由此可以看出,单元格逐级扩展后实际形成了以根格(报表首格)为根的一棵树,报表中存在多片独立扩展,那么根上就长出多棵树,每一个可主动扩展的格子都是树上的一个节点,最末一级的不可扩展格则是节点上的叶子。而层次坐标相当于描述任意一个节点或者叶子到达根的路径。
由于根格是客观存在的,而树上的所有节点都是由根格发展而来,因此前面介绍的层次坐标忽略了根节点的描述,下面我们加上根坐标的描述,把层次坐标重新表示一下:
表达式规则:
Cellx[`0, Lk:lk, Lk-1:lk-1,……L1:lk; `0, Tk:tk, Tk-1:tk-1,……T1:t1]
从上面的层次坐标可以看出,完整的层次坐标是从根上开始的,而`0 则代表根坐标。
描述: 从前面的介绍可知,单元格是可以扩展的,一个格子可以扩展出多个,那么如何知道某个扩展出来的格子在所有扩展出来的格子中排第几呢?此时我们就引入了&运算符,他可以获得当前格所属的某主格在所有扩展出来的格子中排第几,这种运算我们也称为层次坐标的逆运算。
表达式规则: &Cellx
返回值: 整数,当前格所属的Cellx主格在所有扩展出来的格子中的排序
说明: Cellx必须是当前格的主格,这样&Cellx才能够正确运算,其返回值相当于是当前格所属的Cellx主格的位置