상위 멤버와 하위 멤버 간의 상대 환율을 계산하고 이 값을 승수로 반환합니다.
반환 값
이 함수는 대체로 환산 섹션에서 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