Tipo

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