Rate

상위 멤버와 하위 멤버 간의 상대 환율을 계산하고 이 값을 승수로 반환합니다.

반환 값

이 함수는 대체로 환산 섹션에서 HS.EXP 함수의 일부로 사용할 값을 반환합니다.

구문

Rate (ExchangeRate, TriangulationCurrency)

표 12-13 Rate 함수 구문

매개변수 적합한 값

ExchangeRate

사용자정의 또는 내부거래 차원을 참조하지 않고 계정 문자열로 지정된 "CurrencyRate" 유형의 기본 계정입니다(예: "A#EOP_RATE").

TriangulationCurrency

문자열 또는 큰따옴표(" ")로서 적합한 통화 레이블입니다. 통화를 지정할 때는 사용자정의 차원을 참조할 필요가 없습니다.

자세한 설명

  • 이 함수는 상위 멤버와 하위 멤버 간의 상대 환율을 계산하고 이 값을 승수로 반환합니다. 값은 TriangulationCurrency 매개변수를 기준으로 계산됩니다.

  • TriangulationCurrency 매개변수가 적합한 통화 레이블이면 상호 환율이 이 통화를 기반으로 합니다.

  • TriangulationCurrency 매개변수가 공백(" ")이면 이 함수는 먼저 적합한 직접 환율을 검색하고, 직접 환율이 없는 경우 애플리케이션 통화에 대해 삼각 분할을 사용합니다.

  • 환율 값을 찾을 수 없으면 함수에서 1이 반환됩니다.

이 표에서는 데이터 검색 방법과 검색 순서를 보여 줍니다. 순서는 (1)과 같이 괄호 안의 숫자로 표현됩니다. 각 경우에서 먼저 하위 엔티티에서 검색되고, 데이터를 찾을 수 없으면 "[None]" 엔티티에서 검색됩니다.

다음 표에서는 하위 멤버 또는 상위 멤버의 통화가 삼각 분할 통화와 같거나, 삼각 분할이 공백인 경우 애플리케이션 통화와 같습니다.

표 12-14 환율 예 - 삼각 분할 통화가 같음

사용자정의 2 차원 환율 사용자정의 1 차원 환율
 

1차 하위

상위

사용자정의 2 차원 환율

1차 하위

 

(2)

상위

(1)

   

다음 표에서는 삼각 분할이 지정되었으며 하위 통화 또는 상위 통화와 다릅니다.

표 12-15 환율 예 - 삼각 분할 통화가 서로 다름

사용자정의 2 차원 환율 사용자정의 1 차원 환율
 

1차 하위

상위

삼각 분할

사용자정의 2 차원 환율

1차 하위

   

(2)

상위

       

삼각 분할

 

(1)

 

다음 표에서는 삼각 분할이 지정되지 않았으며 애플리케이션 통화가 하위 통화 및 상위 통화와 다릅니다.

표 12-16 환율 예 - 삼각 분할이 지정되지 않음

사용자정의 2 차원 환율 사용자정의 1 차원 환율
 

1차 하위

상위

애플리케이션

사용자정의 2 차원 환율

1차 하위

 

(2)

(4)

상위

(1)

     

애플리케이션

 

(3)

 

애플리케이션 통화가 유로이고, C2#EURO에 대해 [None] 엔티티에 입력된 다음 환율을 사용하여 프랑스 하위 엔티티를 미국 상위 엔티티로 환산해야 합니다.

표 12-17 Rate 함수 예

Rate 기초 환율 기말 환율

C1#FFR

0.16000

0.16500

C1#USD

1.15862

1.15785

다음 함수는 기초 잔액 계정에 상대 종료 환율과 기초 환율의 차액을 곱합니다. 이 함수는 로컬 및 애플리케이션 통화 간에 환산이 일치하지 않는 경우 이동 분석을 계산할 때 유용합니다.

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

이전 예에서 하위 멤버에 대한 OPEN 계정의 값이 FFR 10,000,000이면 미국 상위 FXO 계정의 값은 USD 44,102 [10,000,000 * (0.165 /1.15785 - 0.16 /1.15862)]가 됩니다.

샘플 스크립트

' 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