计算父代和子代之间的相对兑换率,返回一个乘数值。
返回值
此函数返回要在 HS.EXP 函数中(通常在转换部分)使用的值。
语法
Rate (ExchangeRate, TriangulationCurrency)
表 12-13 Rate 函数的语法
参数 | 有效值 |
---|---|
ExchangeRate |
指定为帐户字符串的一个 "CurrencyRate" 类型的主帐户,不引用自定义维或公司内维,例如 "A#EOP_RATE" |
TriangulationCurrency |
有效的货币标签(字符串形式)或双引号 (" ")。在指定货币时,不必引用任何自定义维。 |
详细说明
此函数计算父代和子代之间的相对兑换率,返回一个乘数值。该值是基于 TriangulationCurrency 参数计算的。
如果 TriangulationCurrency 参数是有效的货币标签,则交叉汇率将基于此货币。
如果 TriangulationCurrency 参数为空白 (" "),则该函数将先搜索有效的直接汇率;如果未找到直接汇率,则基于应用程序货币使用三角转换。
如果未找到任何汇率值,函数将返回 1。
以下各表显示了搜索数据的方法以及搜索的顺序。顺序用括号中的数字表示,例如 (1)。在每种情况下,搜索都先在子实体中进行;如果未找到数据,再从 "[None]" 实体中搜索。
在下表中,父代或子代的货币都与中间转换货币相同(如果中间转换货币为空白,则与应用程序货币相同)。
表 12-14 Rate 示例 - 中间转换货币相同
Custom 2 维汇率 | Custom 1 维汇率 | ||
---|---|---|---|
子代 |
父代 |
||
Custom 2 维汇率 |
子代 |
(2) |
|
父代 |
(1) |
在下表中,指定了中间转换货币,但中间转换货币与子代或父代的货币不同。
表 12-15 Rate 示例 - 中间转换货币不同
Custom 2 维汇率 | Custom 1 维汇率 | |||
---|---|---|---|---|
子代 |
父代 |
中间转换 |
||
Custom 2 维汇率 |
子代 |
(2) |
||
父代 |
||||
中间转换 |
(1) |
在下表中,未指定中间转换货币,并且应用程序货币与子代和父代的货币都不同。
表 12-16 Rate 示例 - 未指定中间转换货币
Custom 2 维汇率 | Custom 1 维汇率 | |||
---|---|---|---|---|
子代 |
父代 |
应用程序 |
||
Custom 2 维汇率 |
子代 |
(2) |
(4) |
|
父代 |
(1) |
|||
应用程序 |
(3) |
示例
应用程序货币为欧元,您需要使用在 [None] 实体中针对 C2#EURO 输入的以下汇率,将法国子实体换算为美国父实体:
表 12-17 Rate 函数的示例
Rate | 开盘汇率 | 收盘汇率 |
---|---|---|
C1#FFR |
0.16000 |
0.16500 |
C1#USD |
1.15862 |
1.15785 |
以下函数将期初余额帐户乘以相对收盘汇率与开盘汇率之间的差。当本地货币与应用程序货币之间的换算不一致时,此函数可用于计算动态分析。
HS.EXP "A#FXO = A#OPEN * (" & RATE("A#EOP_RATE"," ") & "-" & RATE("A#OPE_RATE"," ") &")"
对于前一个示例,如果子代的 OPEN 帐户中的值为 FFR 10,000,000,则美国父代 FXO 帐户中的值将为 USD 44,102(10,000,000 * (0.165 /1.15785 - 0.16 /1.15862))。
示例脚本
' sample statement written in the calling routine
SUB TRANSLATE()
HS.TRANS "A#FXO","A#FXO","A#EOP_RATE","" HS.EXP "A#FXO = A#OPEN * (" & RATE("A#EOP_RATE"," ") & "-" & RATE("A#OPE_RATE"," ") &")"
END SUB
' programming of the RATE function
FUNCTION RATE(sRATE,sTRI)
DIM sCCUR, sPCUR, sACUR, bRET, retValue, s3rdCUR DIM i
sRATE = UCASE(sRATE) sTRI = UCASE(sTRI) sCCUR = UCASE(HS.ENTITY.DEFCURRENCY("")) sPCUR = UCASE(HS.VALUE.CURRENCY) sACUR = UCASE(HS.APPSETTINGS.CURRENCY) retValue = 0
' check whether there is a triangulation specified, or if triangulation or application currencies are the same as either parent or child and set up the select case
IF sTRI = sCCUR OR sTRI = sPCUR OR (sTRI = " " AND (sACUR = sCCUR OR sACUR = sPCUR)) THEN
i = 1
ELSEIF sTRI <> " " THEN
i = 2
ELSE
i = 3
END IF
SELECT CASE i
CASE 1
' bRET is a boolean that returns true if data is found. First search the child... ' ...then search the [None] entity
bRET = GETVALUECP(".V#<Entity Currency>",retValue,sRATE,sCCUR,sPCUR)
IF NOT bRET THEN
bRET = GETVALUECP(".E#[None]",retValue,sRATE,sCCUR,sPCUR)
END IF
CASE 2
' use a dynamic parameter name for ease of writing the triangulation checks
s3rdCUR = sTRI
bRET = GETVALUE3(".V#<Entity Currency>",retValue,sRATE,sCCUR,sPCUR,s3rdCUR)
IF NOT bRET THEN
bRET = GETVALUE3(".E#[None]",retValue,sRATE, sCCUR,sPCUR,s3rdCUR)
END IF
CASE 3
' this case is used when the 2nd parameter is blank and is the most complex.
' first check direct rates in the child…
' … then check triangulation against application currency in the child
' then check direct rates in [None].
'… finally check triangulation in [None]
s3rdCUR = sACUR
bRET = GETVALUECP(".V#<Entity Currency>",retValue,sRATE,sCCUR,sPCUR)
IF NOT bRET THEN
bRET = GETVALUE3(".V#<Entity Currency>",retValue,sRATE,sCCUR,sPCUR,s3rdCUR)
IF NOT bRET THEN
bRET = GETVALUECP(".E#[None]",retValue,sRATE,sCCUR,sPCUR)
IF NOT bRET THEN
bRET = GETVALUE3(".E#[None]",retValue, sRATE,sCCUR,sPCUR,s3rdCUR)
END IF
END IF
END IF
END SELECT
IF bRET THEN
RATE = retValue
ELSE
RATE = 1
END IF
END FUNCTION
FUNCTION GETVALUECP(sENTITY,sVALUE,sRATE,sCCUR,sPCUR)
' this sub-function is used when comparing direct rates between child and parent
GETVALUECP = FALSE
' check if data exists for direct rate child to parent. If it does return it. ' if no direct child to parent rate check for indirect parent to child rate... ' return the inverse of the indirect rate.
IF HS.GETCELL(sRATE & ".C1#" & sCCUR & ".C2#" & sPCUR & sENTITY) <> 0 THEN
sVALUE = CDBL(HS.GETCELL(sRATE & ".C1#" & sCCUR & ".C2#" & sPCUR & sENTITY))
GETVALUECP = TRUE
ELSEIF HS.GETCELL(sRATE & ".C1#" & sPCUR & ".C2#" & sCCUR & sENTITY) <> 0 THEN
sVALUE = CDBL(1 / HS.GETCELL(sRATE & ".C1#" & sPCUR & ".C2#" & sCCUR & sENTITY))
GETVALUECP = TRUE
END IF
END FUNCTION
FUNCTION GETVALUE3(sENTITY,sVALUE,sRATE,sCCUR,sPCUR,s3rdCUR)
' this sub-function is used when triangulating ' check if data exists for direct rate child to triangulation… ' … if it does return the direct relative rate child to parent… ' if no direct child to triangulation rate check for indirect triangulation to child rate… ' … return the inverse of the indirect relative rates.
GETVALUE3 = FALSE
IF HS.GETCELL(sRATE & ".C1#" & sCCUR & ".C2#" & s3rdCUR & sENTITY) <> 0 THEN
sVALUE = CDBL(HS.GETCELL(sRATE & ".C1#" & sCCUR & ".C2#" & s3rdCUR & sENTITY) / HS.GETCELL(sRATE & ".C1#" & sPCUR & ".C2#" & s3rdCUR & sENTITY))
GETVALUE3 = TRUE
ELSEIF HS.GETCELL(sRATE & ".C1#" & s3rdCUR & ".C2#" & sCCUR & sENTITY) <> 0 THEN
sVALUE = CDBL(HS.GETCELL(sRATE & ".C1#" & s3rdCUR & ".C2#" & sPCUR & sENTITY) / HS.GETCELL(sRATE & ".C1#" & s3rdCUR & ".C2#" & sCCUR & sENTITY))
GETVALUE3 = TRUE
END IF
END FUNCTION