Calcula a taxa de câmbio relativa entre um pai e um filho e retorna o valor como um multiplicador.
Valor de Retorno
Essa função retorna um valor a ser usado como parte de uma função HS.EXP, geralmente na seção de conversão.
Sintaxe
Rate (ExchangeRate, TriangulationCurrency)
Tabela 12-13 Sintaxe de Função Taxa
Parâmetro | Valores Válidos |
---|---|
ExchangeRate |
Uma conta principal do tipo "CurrencyRate" especificada como uma string de conta, sem referência para as dimensões Personalizada ou Intercompanhia, por exemplo, "A#EOP_RATE" |
TriangulationCurrency |
Ou um rótulo válido como uma string ou aspas duplas ( " "). Ao especificar uma moeda, não será necessário mencionar nenhuma dimensão personalizada. |
Descrição Detalhada
Essa função calcula a taxa de câmbio relativa entre um pai e um filho e retorna o valor como um multiplicador. O valor é calculado com base no parâmetro TriangulationCurrency.
Se o parâmetro TriangulationCurrency for um rótulo de moeda válido, a taxa cruzada será baseada nesta moeda.
Se o parâmetro TriangulationCurrency estiver em branco ( " " ), a função primeiro procurará uma taxa direta válida e, se nenhuma for encontrada, usará a Triangulação na moeda do aplicativo.
Se nenhum valor de taxa for encontrado, a função retornará 1.
Essas tabelas mostram os métodos de pesquisa pelos dados e a ordem em que a pesquisa é feita. A ordem é representada por um número entre parênteses, por exemplo (1). Em cada caso, a pesquisa é feita primeiro na entidade filho e, caso nenhum dado seja encontrado, na entidade "[Nenhum]".
Na tabela a seguir, ou a moeda do filho ou do pai será a mesma que a da moeda de Triangulação, ou caso a Triangulação esteja em branco, a moeda do aplicativo.
Tabela 12-14 Exemplo de Taxa — Mesma Moeda da Triangulação
Taxas da dimensão Personalizada 2 | Taxas da dimensão Personalizada 1 | ||
---|---|---|---|
Child |
Parent |
||
Taxas da dimensão Personalizada 2 |
Child |
(2) |
|
Parent |
(1) |
Na tabela a seguir, a Triangulação foi especificada e não é a mesma que as moedas do filho e do pai.
Tabela 12-15 Exemplo de Taxa — Moeda da Triangulação Diferente
Taxas da dimensão Personalizada 2 | Taxas da dimensão Personalizada 1 | |||
---|---|---|---|---|
Child |
Parent |
Triangulation |
||
Taxas da dimensão Personalizada 2 |
Child |
(2) |
||
Parent |
||||
Triangulation |
(1) |
Na tabela a seguir, a Triangulação não foi especificada e a moeda do aplicativo é diferente das moedas do filho e do pai.
Tabela 12-16 Exemplo de Taxa — Triangulação Não Especificada
Taxas da dimensão Personalizada 2 | Taxas da dimensão Personalizada 1 | |||
---|---|---|---|---|
Child |
Parent |
Application |
||
Taxas da dimensão Personalizada 2 |
Child |
(2) |
(4) |
|
Parent |
(1) |
|||
Application |
(3) |
Exemplo
A moeda do aplicativo são Euros e é necessário converter uma entidade filha francesa em uma entidade pai dos EUA usando essas taxas inseridas na entidade [Nenhum] em C2#EURO:
Tabela 12-17 Exemplo de Função Taxa
Rate | Opening Rate | Closing Rate |
---|---|---|
C1#FFR |
0.16000 |
0.16500 |
C1#USD |
1.15862 |
1.15785 |
A seguinte função multiplica a conta de saldo inicial pela diferença entre as taxas final e inicial relativas. Isso é útil durante o cálculo das análises de movimento caso a conversão não seja consistente entre as moedas local e do aplicativo.
HS.EXP "A#FXO = A#OPEN * (" & RATE("A#EOP_RATE"," ") & "-" & RATE("A#OPE_RATE"," ") &")"
Para o exemplo anterior, se o valor na conta OPEN para o filho for FFR 10.000.000, o valor na conta FXO pai dos EUA será de USD 44.102 [10.000.000 * (0.165 /1.15785 - 0.16 /1.15862)].
Script de Amostra
' 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