計算父項和子項之間的相關匯率,並傳回值作為乘數。
傳回值
這個函數會傳回作為 HS.EXP 函數一部分使用的值,通常是位於轉譯區段。
語法
Rate (ExchangeRate, TriangulationCurrency)
表格 12-13 Rate 函數的語法
參數 | 有效值 |
---|---|
ExchangeRate |
指定為帳戶字串的「CurrencyRate」類型主要帳戶,不會參照自訂或 Intercompany 維度,例如「A#EOP_RATE」 |
TriangulationCurrency |
以字串或雙引號 ( " ") 標示的有效幣別。指定幣別時,不需要參照任何自訂維度。 |
詳細說明
這個函數會計算父項和子項之間的相關匯率,並傳回值作為乘數。該值會根據 TriangulationCurrency 參數來計算。
如果 TriangulationCurrency 參數是有效的幣別標籤,則交叉匯率會以此幣別為基礎。
如果 TriangulationCurrency 參數是空白 ( " " ),則函數會先搜尋有效的直接匯率,如果找不到,則會對應用程式幣別使用三方幣別。
如果找不到任何匯率值,函數就會傳回 1。
這些表格顯示搜尋資料的方法,以及搜尋進行的順序。順序是以括號中的數字代表,例如 (1)。在各個案例中,會先在子項實體中進行搜尋,如果找不到任何資料,則會從 "[無]" 實體中進行搜尋。
在下列表格中,子項的幣別或父項的幣別和三方幣別相同,或如果三方幣別為空白,則是應用程式幣別。
表格 12-14 匯率範例 — 和三方幣別相同
自訂 2 維度匯率 | 自訂 1 維度匯率 | ||
---|---|---|---|
子項 |
父項 |
||
自訂 2 維度匯率 |
子項 |
(2) |
|
父項 |
(1) |
在下列表格中,三方幣別已指定,且與子項或父項幣別均不相同。
表格 12-15 匯率範例 — 三方幣別不同
自訂 2 維度匯率 | 自訂 1 維度匯率 | |||
---|---|---|---|---|
子項 |
父項 |
三方幣別 |
||
自訂 2 維度匯率 |
子項 |
(2) |
||
父項 |
||||
三方幣別 |
(1) |
在下列表格中,三方幣別未指定,且應用程式幣別與子項和父項幣別均不相同。
表格 12-16 匯率範例 — 三方幣別未指定
自訂 2 維度匯率 | 自訂 1 維度匯率 | |||
---|---|---|---|---|
子項 |
父項 |
應用程式 |
||
自訂 2 維度匯率 |
子項 |
(2) |
(4) |
|
父項 |
(1) |
|||
應用程式 |
(3) |
範例
應用程式幣別是歐元,而且您需要使用在 [無] 實體中輸入的這些匯率,針對 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