Rate

Calcule le taux de change relatif entre un parent et un enfant et renvoie la valeur sous la forme d'un multiplicateur.

Valeur renvoyée

Cette fonction renvoie une valeur à utiliser dans le cadre d'une fonction HS.EXP, généralement dans la section de conversion.

Syntaxe

Rate (ExchangeRate, TriangulationCurrency)

Tableau 12-13 Syntaxe de la fonction Rate

Paramètre Valeurs valides

ExchangeRate

Un compte principal de type "CurrencyRate" spécifié en tant que chaîne de compte, sans référence à des dimensions libres ou intragroupes, par exemple "A#EOP_RATE"

TriangulationCurrency

Un libellé de devise valide sous forme de chaîne ou de guillemets (" "). Lors de la spécification d'une devise, il n'est pas nécessaire de référencer une dimension libre.

Description détaillée

  • Cette fonction permet de calculer le taux de change relatif entre un parent et un enfant, et renvoie une valeur sous la forme d'un multiplicateur. La valeur est calculée sur la base du paramètre TriangulationCurrency.

  • Si le paramètre TriangulationCurrency est un libellé de devise valide, le taux croisé repose sur cette devise.

  • Si le paramètre TriangulationCurrency est vide ( " " ), la fonction recherche d'abord un taux direct valide et si elle n'en trouve aucun, elle utilise la devise de triangulation plutôt que la devise de l'application.

  • Si aucune valeur de taux n'est trouvée, la fonction renvoie la valeur 1.

Les tableaux suivants présentent les méthodes de recherche des données et l'ordre dans lequel la recherche est effectuée. L'ordre est représenté par un nombre entre parenthèses, par exemple (1). Dans chaque cas, la recherche est d'abord effectuée dans l'entité enfant, puis dans l'entité [None] si aucune donnée n'est trouvée.

Dans le tableau suivant, la devise de l'enfant ou du parent est identique à la devise de triangulation ou, si la triangulation n'est pas spécifiée, à la devise de l'application.

Tableau 12-14 Exemple de taux - Devise de triangulation identique

Taux de la dimension Custom 2 Taux de la dimension Custom 1
 

Enfant

Parent

Taux de la dimension Custom 2

Enfant

 

(2)

Parent

(1)

   

Dans le tableau suivant, la triangulation a été spécifiée et n'est pas identique à la devise enfant ou parent.

Tableau 12-15 Exemple de taux - Devise de triangulation différente

Taux de la dimension Custom 2 Taux de la dimension Custom 1
 

Enfant

Parent

Triangulation

Taux de la dimension Custom 2

Enfant

   

(2)

Parent

       

Triangulation

 

(1)

 

Dans le tableau suivant, la triangulation n'a été pas été spécifiée et la devise de l'application est différente des devises parent et enfant.

Tableau 12-16 Exemple de taux - Triangulation non spécifiée

Taux de la dimension Custom 2 Taux de la dimension Custom 1
 

Enfant

Parent

Application

Taux de la dimension Custom 2

Enfant

 

(2)

(4)

Parent

(1)

     

Application

 

(3)

 

Exemple

La devise de l'application est Euros et vous devez convertir une entité enfant française en entité parent américiane à l'aide des taux saisis dans l'entité [None] par rapport à C2#EURO :

Tableau 12-17 Exemple de fonction Rate

Rate Taux d'ouverture Taux de clôture

C1#FFR

0,16000

0,16500

C1#USD

1,15862

1,15785

La fonction suivante multiplie le compte de balance d'ouverture par la différence entre les taux d'ouverture et de clôture relatifs. Cela s'avère utile lors du calcul des analyses du flux si la conversion n'est pas cohérente entre la devise locale et la devise d'application.

HS.EXP "A#FXO = A#OPEN * (" & RATE("A#EOP_RATE"," ") & "-" & RATE("A#OPE_RATE"," ") &")"

Pour l'exemple précédent, si la valeur du compte OPEN pour l'enfant est de 10 000 000 FFR, la valeur du compte FXO parent américain est de 44,102 [10,000,000 * (0.165 /1.15785 - 0.16 /1.15862)] USD.

Exemple de script

' 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