Rate

计算父代和子代之间的相对兑换率,返回一个乘数值。

返回值

此函数返回要在 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