本节将重点介绍比值报表的制作,学习绝对层次坐标的用法。
我们看下面这个报表例子:
该表的数据集为ds1:
SELECT EMPLOYEE.NAME,订单明细.数量,订单明细.单价 FROM EMPLOYEE,订单,订单明细 WHERE 订单.订单ID = 订单明细.订单ID AND EMPLOYEE.EID = 订单.雇员ID
B2单元格的表达式为:=ds1.group(NAME;NAME:1;ds1.sum(数量*单价):-1)
A2的左主格为C2,B2的左主格为`0,预览如下:
这个报表中,和第一名的差距这个指标的运算逻辑是:当前销售的销售额/第一名的销售额
从上图中可以看出,D2格的表达式最关键的在于如何表达出“第一名的销售额”,该报表是按照销售额从大到小排列的,因此第一名的销售额肯定是第一个C2格。如何在报表扩展前在表达式中描述出扩展后的第N个C2格呢?
这里用到了润乾报表非线性模型中的绝对层次坐标,请参见 绝对层次坐标 ,我们把D2格的表达式写成:=C2[1]-C2,如下图所示:
报表保存为12.3.1.rpx,预览效果:
在进行报表设计时,单元格尚未进行扩展,但是其它某些单元格的表达式往往需要对这个单元格扩展后的单元格进行精确定位并运算。
例12.3.2-1:
月份 |
产值 |
A2(月份) |
B2 |
其中 三月份产值为: |
B3 |
扩展后:
月份 |
产值 |
1月 |
|
2月 |
|
3月 |
|
4月 |
|
5月 |
|
6月 |
|
7月 |
|
8月 |
|
其中 三月份产值为: |
需要定位到3月份对应的产值并返回 |
对单元格B3来说,需要从B2扩展出来的单元格中找到对应月份为3月的格子然后返回其值。
然而B2能扩展出几个格子以及每个格子在什么位置,在扩展前很难描述,因此,为了避免混淆,应该对扩展后的每个单元格进行唯一性定义,这就是单元格的层次坐标。层次坐标是用于唯一描述(精确定位)扩展后的每一个单元格的表达式。
层次坐标的运算结果返回目标单元格。如果层次坐标能够定位到一个单元格,那么返回该单元格的值,如果定位到多个单元格,那么返回这些单元格中的第一个单元格的值。
表达式规则:
说明:
a)
为Cellx的左主格,
为左主格扩展后的次序,即扩展后的第几个单元格,如果不指定
或者
为0,则表示为当前表达式所在单元格所属的当前左主格,Cellx为目标单元格,应该为
,
…
的附属单元格。与之类似,Tk为Cellx的上主格,tk为上主格扩展后的次序。
b) 如果只有上主格,没有左主格,分号不能省略,即应该写成:
Cellx [;Tk:tk, Tk-1: tk-1,……T1: t1]
如果只有左主格,没有上主格,分号可以省略,即可以写成:
Cellx [Lk:lk, Lk-1:lk-1,……L1:l1 ]
c)
与Tk的次序是从远到近的,也就是说越上级的主格越靠前。而找到层次坐标所表示单元格的次序是从最上级的主格开始。
如:
C1[A1:2,B1:1]找C1的次序是:先找单元格A1展开后的第2格,再找第二个A1下属的B1单元格扩展出来的第一个B1,然后找到和该B1对应的C1。
d) 完整的层次坐标表达式应该包括Cellx的所有主格,层次坐标与写在哪个单元格中无关。
例12.3.2-2:
例12.3.2-3: