第八篇介绍的是exp函数右边是一个数值的场景,实际场景中用的更多的是exp函数左右两边都是维度组合(也叫P OV ),而非数值。今天深入探讨exp函数的使用。
1、维度交叉点考虑因素
如果不指定 Exp
从中获取数据以及 Exp
放入数据的维交叉点,则源和目标交叉点由下列因素决定:
· 目标(等号 左边 )。如果未在等号左侧指定任何ICP维或C1-Cn维的成员,则 Exp
会将数据写入所有与ACCOUNT维度为有效组合的POV上。
· 源(等号 右边 )。如果未在等号的右侧指定维的成员,则存在下列几种可能:
o 如果维只有一个成员,则 Exp 会从此成员与源科目的交叉点获取数据。
o 如果维与源科目只有一个有效的交叉点,则 Exp 会从此交叉点获取数据。
o 如果维与源科目有几个交叉的成员,则数据的源交叉点由等式左侧决定:
1)如果在左侧指定了一个成员,则 Exp 会尝试从此成员与源科目的交叉点获取数据。
2)如果未在左侧指定任何成员,则 Exp 将尝试将数据置于目标科目与维成员的每个有效交叉点。 Exp 将从该成员与源科目的相应交叉点获取目标交叉点的数据。
注:
如果源交叉点无效,则 Exp 不会更改相应目标交叉点中的数据。
总结下:笔者认为就两点
1)就是前面的文章也提到的,exp函数左右的维度组合个数(POV)最好要对应,能明确的维度一定要显示写出来。通常规则是:
Hs.exp “A#.I#.C1#.Cn#= A#.I#.C1#.Cn#”
规则中一般只用account、ICP,C1-Cn维度,这一点很重要。
2)等号两边的科目需要特别注意,比如等号左边的POV中科目属性是ICP科目(isicp=Y),等号右边的科目是非ICP科目(isicp=N)。所以写规则的时候特别要关注等号左右两边科目的属性(CnTOPMEMBER,ISICP,ISconsolidated等)
2、同时计算多个科目
--->要将数据插入与当前视点交叉的所有科目中,可将 All 用于帐户表达式中。您可以使用此方法来设置所有科目的期初余额。在以下示例中, IsFirst 函数将测试当前期间是否是第一个期间。如果是第一个期间,则 Exp 会将当前期间每个科目的值设置为前一年最后一个期间的科目值。
If HS.Period.IsFirst = TRUE Then
HS.Exp "A#ALL = A#ALL.Y#PRIOR.P#LAST"
End If
上面这段的变种其实就是我们常见的年初数结转规则,如下:
If HS.Period.IsFirst = TRUE Then
HS.Exp "A#ALL.C1#movbeg01 = A#ALL.C1#[None].Y#PRIOR.P#LAST"
End If
实际业务中,主要是资产负债类的科目的年初结转,我们知道,资产负债表的第一列是年初数据,
第二列是期末数据。年初数数据就是上面这段规则计算出来的
(实际使用时涉及到增减变动的结转,会略复杂)。
</