报表模版如下图所示:
D2处公式:
C2 - C2[A2:-1]{B2==$B2}
在上面的模版当中,D2 单元格中首先取到与其同行的 C2 单元格的值,然后利用单元格坐格,先取到当前 D2 单元格所在行的 A2 单元格的上一条 A2 单元格记录(-1表示坐标上移),然后再取这个 A2 下对应的 C2 单元格,但由于其下 C2 单元格还是有多个,所以这里加了个条件B2==$B2,这里的第一个 B2 表示当前单元格所在行对应的 B2 的值,$B2 表示坐标定位后(上一条A2单元格) C2 单元格对应的 B2 单元格的值,条件就是他们俩要相等,实际上就是月份相等,这样就达到了我们要实现的同比的目的,运行后的效果如下:
Ps:
关于B2==$B2的理解:
在上例中可以理解B2为
$B2可以理解为:
C2[A2:-1]{B2==$B2}
C2[A2:-1]:表示取A2的上一行的C2的值,上例中此时的C2存在多个值。
{B2==$B2}:对于C2存在的多个值加了额外条件,即还要满足上一行的B2的值需要跟下一行B2的值相等。取B2行值也相等的C2行的值。
关于$B2
在UReport2当中,在单元格名称前加$符号,表示取相对于目标单元格的单元格的值,多用在条件比较当中,比如上面的C2[A2:-1]{B2==$B2},这里的$B2就是指取到的C2单元格对应的B2单元格的值。
在上面的例子中,第一个分组2000下,所有的同比值都为0,这是因为这个分组下不存在 A2:-1 这个坐标,没法上移,所以系统默认取了当前记录自身,所以计算后的值都是0。如果我们不希望显示0,那么可以加个 if 条件判断表达式,如果当前位于第一个分组,就输出空字符串,否则输出实际计算后的值,修改后的报表模版如下图所示:
D2 单元格对应的表达内容如下图所示:
if(&A2==1){
return "";
}else{
C2 - C2[A2:-1]{B2==$B2}
}
运行后的效果如下图所示:
在上面的例子中,我们使用了 if 判断表达式,当然你也可以换成三元表达式判断或 case 判断,在这个 if 判断中,首先我们判断的是 &A2==1 是否成立,这里的 &A2 指的是相对于当前单元格 A2 单元格展开后的序号,在 UReport2 中,可以采用“&单元格名称”的方式标记某个单元格展开后的序号,需要注意的是,使用“&单元格名称”来标记目标单元格展开后的序号时,当前单元格必须是目标单元格的子格或间接子格;比如,在上面的例子中,使用 &A2 的单元格是 D2,D2 是 A2 单元格的间接子格,这样就可以正确取到 A2 展开后的序号值。
关于&标记的使用
在使用“&单元格名称”来标记目标单元格展开后的序号时,除上需要注意上面描述的内容外,还需要注意,取序号将以他们共同的父格为基准,如果他们有共同的父格,那么将以这个父格里目标单元格的数量来进行序号编排,这在之前视频教程介绍报表计算模型中,实现明细型主从报表,对从表数据进行编号时就有体现。
注意:上述公式中在减号前后存在空格,其中减号前面的空格不可省略,否则表达式报错,减号后面空格可以省略,不过不建议省略。