Calcula el tipo de cambio relativo entre un padre y un hijo y devuelve el valor como multiplicador.
Valor de retorno
Esta función devuelve un valor que se va a utilizar como parte de una función HS.EXP, por lo general en la sección de conversión.
Sintaxis
Rate (ExchangeRate, TriangulationCurrency)
Tabla 12-13 Sintaxis de la función Tasa
| Parámetro | Valores válidos | 
|---|---|
| ExchangeRate | Una cuenta principal del tipo "CurrencyRate" especificada como cadena de cuenta, sin hacer referencia a dimensiones personalizadas o de intercompañía; por ejemplo, "A#EOP_RATE". | 
| TriangulationCurrency | Una etiqueta de moneda válida, como una cadena o comillas dobles (" "). Al especificar una moneda, no es necesario hacer referencia a ninguna dimensión personalizada. | 
Descripción detallada
Esta función calcula el tipo de cambio relativo entre un padre y un hijo, y devuelve un valor como multiplicador. El valor se calcula según el parámetro TriangulationCurrency.
Si el parámetro TriangulationCurrency es una etiqueta de moneda válida, la cotización cruzada se basa en esta moneda.
Si el parámetro TriangulationCurrency se deja en blanco (" "), se busca primero una tasa directa y válida y, si no se encuentra ninguna, se utiliza la triangulación en comparación con la moneda de la aplicación.
Si no se encuentran valores de tasa, la función devuelve 1.
Estas tablas muestran los métodos de búsqueda de datos y el orden en el que se realiza la búsqueda. El orden se representa por medio de un número entre paréntesis, por ejemplo (1). En cada caso, la búsqueda se lleva a cabo primero en la entidad hijo y, si no se encuentra ningún dato, a continuación, desde la entidad "[None]".
En la tabla siguiente, la moneda del hijo o del padre es la misma que la moneda de triangulación o, si la triangulación está en blanco, la moneda de la aplicación.
Tabla 12-14 Ejemplo de tasa: misma moneda de triangulación
| Tasas de la dimensión personalizada 2 | Tasas de la dimensión personalizada 1 | ||
|---|---|---|---|
| Hijo | Padre | ||
| Tasas de la dimensión personalizada 2 | Hijo | (2) | |
| Padre | (1) | ||
En la tabla siguiente, se ha especificado Triangulación y no es el mismo valor que las monedas padre o hijo.
Tabla 12-15 Ejemplo de tasa: moneda de triangulación diferente
| Tasas de la dimensión personalizada 2 | Tasas de la dimensión personalizada 1 | |||
|---|---|---|---|---|
| Hijo | Padre | Triangulación | ||
| Tasas de la dimensión personalizada 2 | Hijo | (2) | ||
| Padre | ||||
| Triangulación | (1) | |||
En la tabla siguiente, no se ha especificado la triangulación y la moneda de la aplicación es diferente de las monedas padre e hijo.
Tabla 12-16 Ejemplo de tasa: no se ha especificado la triangulación
| Tasas de la dimensión personalizada 2 | Tasas de la dimensión personalizada 1 | |||
|---|---|---|---|---|
| Hijo | Padre | Aplicación | ||
| Tasas de la dimensión personalizada 2 | Hijo | (2) | (4) | |
| Padre | (1) | |||
| Aplicación | (3) | |||
Ejemplo
El euro es la moneda de la aplicación y necesita convertir una entidad hijo de moneda francesa a una entidad padre de moneda estadounidense mediante estas tasas introducidas en la entidad [None] frente a C2#EURO:
Tabla 12-17 Ejemplo de la función Tasa
| Tipo | Tasa de apertura | Tasa de cierre | 
|---|---|---|
| C1#FFR | 0,16000 | 0,16500 | 
| C1#USD | 1,15862 | 1,15785 | 
La siguiente función multiplica la cuenta de balance de apertura por la diferencia entre las tasas a la apertura y al cierre. Esto resulta útil al calcular análisis de movimientos si la conversión no es coherente entre la moneda local y la de la aplicación.
HS.EXP "A#FXO = A#OPEN * (" & RATE("A#EOP_RATE"," ") & "-" & RATE("A#OPE_RATE"," ") &")"
Para el ejemplo anterior, si el valor de la cuenta OPEN para el hijo es 10.000.000 francos, el valor de la cuenta FXO padre estadounidense será 44.102 [10.000.000 * (0,165 /1,15785 - 0,16/1,15862)].
Script de ejemplo
' 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