微信公众号:大话epm 10年epm产品线经验,精通hfm/tagetik产品
(18)
(17)
(1)
分类: it职场
2021-07-22 16:14:45
第八篇介绍的是exp函数右边是一个数值的场景,实际场景中用的更多的是exp函数左右两边都是维度组合(也叫p ov ),而非数值。今天深入探讨exp函数的使用。
如果不指定 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等)
--->要将数据插入与当前视点交叉的所有科目中,可将 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
实际业务中,主要是资产负债类的科目的年初结转,我们知道,资产负债表的第一列是年初数据,
第二列是期末数据。年初数数据就是上面这段规则计算出来的
(实际使用时涉及到增减变动的结转,会略复杂)。
----->要将数据写入到科目与自定义维或icp维的所有有效组合式上,可使用 all 关键字或省略 a# 字符。上面的写法可以等价为为:
if hs.period.isfirst = true then
hs.exp "c1#movbeg01 = c1#[none].y#prior.p#last"
end if
示 例
下例设置 statetax 帐户中的金额。此示例通过将 2014 年 sales 帐户中的金额乘以 2014 年 staterate 帐户中的汇率来计算此金额。
hs.exp "a#statetax = a#sales.y#2014 * a#staterate.y#2014"
3、exp和维度交叉点考虑因素
以下示例说明了 “维交叉点考虑因素” 中提到的考虑因素。将介绍以下交叉点类型:
a) 所有交叉点对于源科目和目标科目均有效。
b) 某些交叉点对于源科目和目标科目有效,其他一些交叉点则无效。
c)只有一个成员对于源科目有效。
以下所有示例都将名为 targacct 和 sourceacct 的帐户与名为 member001 、 member002 和 member003 的 custom1 维配合使用。下表中列出了所有示例的源交叉点数据。后面的例子的基础都是此例子为前提。
成员 |
sourceacct 交叉点中的数据 |
member001 |
10 |
member002 |
nodata 状态 |
member003 |
15 |
维交叉点示例的数据
先翻译下上面这个表格,怎么理解?
等价于如下公式:
使用smartview刷数或者web表单展示如下:
a# sourceacct.c1# member001=10
a# sourceacct.c1# member002=空,这里用空作意思表示,smartview刷出来或者表单显示是空白
a# sourceacct.c1# member003=15
对于以下示例, targacct 和 sourceacct 科目与 custom1 成员的所有交叉点都是有效的:
hs.exp "a#targacct = a#sourceacct"
如果目标科目targacct和源科目sourceacct的设置的属性一样,那么上面的规则就是将源科目的数据复制一份到目标科目上,也就是我们常说的平转。
应用公式后的结果如下:
custom1 成员 |
数据 |
交叉点 |
member001 |
10 |
sourceacct 和 member001 |
member002 |
--- |
不适用。 targacct 和 member002 的交叉点未更改,因为 sourceacct 和 member002 的交叉点状态为 nodata 。 |
member003 |
15 |
sourceacct 和 member003 |
可以翻译为:
a# targacct .c1# member001=10
a# targacct .c1# member002=空,这里用空作意思表示,smartview刷出来或者表单显示是空白
a# targacct .c1# member003=15
à 如果 在等号左侧将 exp 与 member001 成员一起使用:
hs.exp "a#targacct.c1#member001 = a#sourceacct"
targacct 和 member001 的交叉点设置为 10 。 exp 从 sourceacct 与 member001 的交叉点获取数据,因为在左侧指定了 member001 。
à 如果 在等号右侧将 exp 与 member003 一起使用:
hs.exp "a#targacct = a#sourceacct.c1#member003"
这样写等价于右边就是一个数值,那么会填充左边目标pov上所有有效组合:
custom1 成员 |
数据 |
交叉点 |
member001 |
15 |
sourceacct 和 member003 |
member002 |
15 |
sourceacct 和 member003 |
member003 |
15 |
sourceacct 和 member003 |
上面的表格翻译为:
a# targacct .c1# member001=15
a# targacct .c1# member002=15
a# targacct .c1# member003=15
所以这种写法是很危险的,特别是要防止是一个常数的情况
在以下示例中,源帐户与目标帐户各有无效组合。
a)sourceacct.member002 和 member003 有效, member001 无效。
b) targacct.member001 和 member002 有效, member003 无效。
下面这个公式及应用公式后的结果值得初学者细品,笔者不再赘述:
hs.exp "a#targacct = a#sourceacct"
使用公式后的结果 :
a) targacct.member001 = sourceacct.member001 。 sourceacct 与 member001 为无效交叉点。
b)targacct.member002 = sourceacct.member002 。因为 sourceacct 和 member002 的交叉点为 nodata 状态,所以 targacct 和 member002 的交叉点保持不变。
c)targacct.member003 = sourceacct.member003 。 targacct 与 member003 为无效交叉点。
在以下示例中, exp 与在等号左侧指定的 member001 一起使用:
hs.exp "a#targacct.c1#member001 = a#sourceacct"
targacct.member001 保持不变,因为 exp 尝试从无效的交叉点( sourceacct 和 member001 )检索数据。
在以下示例中, exp 与在等号右侧指定的 member003 一起使用:
hs.exp "a#targacct = a#sourceacct.c1#member003"
该函数将此数据置于 custom1 成员与 targacct 科目 的交叉点中:
custom1 成员 |
数据 |
交叉点 |
member001 |
15 |
sourceacct 和 member003 |
member002 |
15 |
sourceacct 和 member003 |
member003 |
n/a |
不适用。 member003 对于 targacct 帐户是一个无效交叉点。 |
在以下示例中,源科目的有效组合中仅具有一个有效成员,目标科目组合中具有两个有效成员。
a) sourceacct.member003 是唯一有效的交叉点。
b)targacct.member001 和 member002 有效, member003 无效。
在以下示例中,使用 exp 时未在等号的任一侧指定 custom1 成员:
hs.exp "a#targacct = a#sourceacct"
该函数将此数据置于 custom1 成员与 targacct 科目的交叉点中:
custom1 成员 |
数据 |
交叉点 |
member001 |
15 |
sourceacct 和 member003 ( sourceacct 科目的唯一有效交叉点) |
member002 |
15 |
sourceacct 和 member003 ( sourceacct 科目的唯一有效交叉点) |
member003 |
n/a |
不适用。 member003 对于 targacct 科目是一个无效交叉点。 |
在以下示例中, exp 与在等号左侧指定的 member001 一起使用:
hs.exp "a#targacct.c1#member001 = a#sourceacct"
targacct 和 member001 的交叉点设置为 15 ,这是 sourceacct 和 member003 的交叉点中的数据。
提示: |
如果 sourceacct 科目和 custom1 维有多个有效交叉点,则 exp 将尝试从 sourceacct 和 member001 的交叉点中获取数据。如果此交叉点是无效交叉点,则 exp 将保留目标科目不变。 |
全文完。