http://gcd525.tankehu.com/ 刘燕酿制,【微信GCD525】匠心品质。刘燕酿制旗下的产品:刘燕酿制燕窝酒酿蛋和刘燕酿制丰韵霜采用“内服外用”的营养概念,致力于呵护每一位女士!
2021年(7)
分类: IT职场
2021-07-30 18:06:15
原文地址:第十篇.HFM规则入门(三:深入使用exp函数) 作者:oracle_cj
第八篇介绍的是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 将保留目标科目不变。 |
全文完。