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 13-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 13-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 13-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 13-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 13-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