親と子の間で関連する為替レートを計算し、値を乗数として戻します。
戻り値
この関数は、通常、換算セクションでHS.EXP関数の一部として使用される値を戻します。
構文
Rate (ExchangeRate, TriangulationCurrency)
表12-13 Rate関数の構文
パラメータ | 有効な値 |
---|---|
ExchangeRate |
勘定科目文字列として指定されたCurrencyRateタイプのメイン勘定科目で、A#EOP_RATEなどのカスタム・ディメンションや内部取引ディメンションへの参照は含まれません |
TriangulationCurrency |
文字列または二重引用符(" ")のいずれかの有効な通貨ラベル。通貨を指定する際は、カスタム・ディメンションを参照する必要はありません。 |
詳細説明
この関数は、親と子の間で関連する為替レートを計算し、値を乗数として戻します。この値は、TriangulationCurrencyパラメータに基づいて計算されます。
TriangulationCurrencyパラメータが有効な通貨ラベルの場合、クロス・レートはこの通貨に基づきます。
TriangulationCurrencyパラメータが空白(" ")の場合は有効な直接レートが検索され、検出されないときには、アプリケーションの通貨に対してトライアンギュレーションが使用されます。
レート値が見つからない場合は、関数により1が戻されます。
後続の表には、データの検索方法と、その検索が行われる順序が示されています。順序は、(1)のように、カッコで囲んだ数値で表されています。いずれの場合も、検索は最初に子エンティティで実行され、データが見つからない場合に[None]エンティティで検索されます。
次の表では、子の通貨または親の通貨がトライアンギュレーション通貨と同一であり、トライアンギュレーションが空白の場合には、アプリケーションの通貨と同一です。
表12-14 Rateの例 - トライアンギュレーション通貨と同一の場合
カスタム2ディメンションのレート | カスタム1ディメンションのレート | ||
---|---|---|---|
子 |
親 |
||
カスタム2ディメンションのレート |
子 |
(2) |
|
親 |
(1) |
次の表では、トライアンギュレーションが指定されており、子と親のいずれの通貨とも同一ではありません。
表12-15 Rateの例 - トライアンギュレーション通貨と異なる場合
カスタム2ディメンションのレート | カスタム1ディメンションのレート | |||
---|---|---|---|---|
子 |
親 |
トライアンギュレーション |
||
カスタム2ディメンションのレート |
子 |
(2) |
||
親 |
||||
トライアンギュレーション |
(1) |
次の表では、トライアンギュレーションが指定されておらず、アプリケーションの通貨が子と親のいずれの通貨とも同一ではありません。
表12-16 Rateの例 - トライアンギュレーションが指定されていない場合
カスタム2ディメンションのレート | カスタム1ディメンションのレート | |||
---|---|---|---|---|
子 |
親 |
アプリケーション |
||
カスタム2ディメンションのレート |
子 |
(2) |
(4) |
|
親 |
(1) |
|||
アプリケーション |
(3) |
例
アプリケーションの通貨がユーロで、C2#EUROに対して[None]エンティティに入力された次のレートを使用して、French子エンティティをUS親エンティティに換算する必要があります:
表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の場合、USの親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