多通貨に関するSO=に関するさまざまなQ&Aを読みましたが、どれも明確ではないか、使用例に関して十分な詳細を提供していません。
シナリオ:
Raddo社には、英国、フランス、米国の3つの支店があります。 Raddoの基本通貨は米ドルです。予算は米ドルで作成されます。 Raddoは、サポートされている通貨の為替レートをデータベースに格納します。
英国の従業員は英ポンドで発注書を作成し、フランスではユーロで発注書を作成します。
Q1:注文書/注文項目データベーステーブルに何を保存する必要がありますか-支店の場所の通貨と現在の為替レートまたは換算された金額を基本通貨の米ドルで?為替レートはPO作成時のものでなければならないことに注意してください。
Q2:米ドル/基本通貨でレポートを生成できるようにするには、何をいつ変換する必要がありますか?
Q3:2年後に基本通貨を米ドルからオーストラリアオーストラリアドルに変更した場合、既存のデータにどのような影響がありますか?
Q4:アプリケーションが最小量の変換を処理するように複数通貨を処理するための最良の方法は何ですか?
あなたが受け取る答えは主観的であることを覚えておいてください。免責事項はありますが、これが私がこのようなシステムをセットアップする方法です。
TL; DR:通貨レート表を使用して、該当する場合、異なる通貨および日付の通貨レートを格納します。現地通貨と計算されたUSD値の両方で金額を保存します。
通貨レート表
次の形式の通貨テーブル(FXレート)を作成します。
FX_RATES
--------
SOURCE_CURRENCY -- e.g. USD, GBP, EUR
TARGET_CURRENCY -- as above
EXCHANGE_RATE -- a suitable decimal field representing the conversion
VALID_FROM_DATE -- date range when the above exchange rate is valid
VALID_TO_DATE -- as above
VALID_FROM_DATE
とVALID_TO_DATE
の間にない日付があってはなりません)。('USD', 'USD', 1, smallest_date, largest_date)
も入力します。これにより、基本通貨自体で入力が行われた場合の処理が容易になります。サンプルテーブルは次のようになります。 1つの行の終了日と次の行の開始日の間には重複があるように見えますが、ルックアップ操作では、1つの列(つまり>= VALID_FROM_DATE AND < VALID_TO_DATE
)のみが等しいかどうかをチェックします
SOURCE_CURRENCY TARGET_CURRENCY EXCHANGE_RATE VALID_FROM_DATE VALID_TO_DATE
--------------- --------------- ---------------------- --------------- --------------
GBP USD 1.250000 06-Mar-2017 13-Mar-2017
GBP USD 1.260000 13-Mar-2017 20-Mar-2017
GBP USD 1.240000 20-Mar-2017 27-Mar-2017
GBP USD 1.250000 27-Mar-2017 03-Apr-2017
USD GBP 0.800000 06-Mar-2017 13-Mar-2017
USD GBP 0.793651 13-Mar-2017 20-Mar-2017
USD GBP 0.806452 20-Mar-2017 27-Mar-2017
USD GBP 0.800000 27-Mar-2017 03-Apr-2017
USD USD 1.000000 01-Jan-1900 31-Dec-9999
POテーブルの列
注文書の表で、次のフィールドを保持します。
PURCHASE_ORDERS
---------------
... other fields
PO_TXN_DATE -- Date for the PO that represents the financial transaction
ORDER_VALUE_LOC -- Decimal field with the order value in local currency
ORDER_CURRENCY_LOC -- The currency used for ORDER_VALUE_LOC (e.g. GBP/EUR)
ORDER_VALUE_USD -- The order value in USD (as this is the company's base currency)
... other fields
PO列の入力
POテーブルにデータを入力するプロセスがすでにあります。これは、次のフィールドにデータを入力するために拡張する必要があります。
PO_TXN_DATE
は、POでの金融取引の日付です。ビジネスルールに基づいて、これはPOが作成/レイズされた日付である場合とそうでない場合があります。ORDER_VALUE_LOC
は、現地通貨でのトランザクションの値です。ORDER_CURRENCY_LOC
は、現地通貨の通貨コードです。ORDER_VALUE_USD
は、FX_RATES
テーブルで為替レートを検索することで入力されます。ORDER_VALUE_USD
への入力は、次の疑似コードで示されています
ORDER_VALUE_USD = PURCHASE_ORDERS.ORDER_VALUE_LOC * FX_RATES.EXCHANGE_RATE
WHERE
FX_RATES.SOURCE_CURRENCY = PURCHASE_ORDERS.ORDER_CURRENCY_LOC
AND FX_RATES.TARGET_CURRENCY = 'USD'
AND PURCHASE_ORDERS.PO_TXN_DATE >= FX_RATES.VALID_FROM_DATE
AND PURCHASE_ORDERS.PO_TXN_DATE < FX_RATES.VALID_TO_DATE
OPの質問への回答
Q1:注文書/注文項目データベーステーブルに何を保存する必要がありますか-支店の場所の通貨と現在の為替レートまたは換算された金額を基本通貨の米ドルで?為替レートはPO作成時のものでなければならないことに注意してください。
前述のように、発注書テーブルには、現地通貨の値、取引日、現地通貨名が格納されます。また、基本通貨(USD)で値を計算して保存します。必要に応じて為替レートを再度検索できます。ここに重複して保存する必要はありません。
USD値はここに格納され、単一の通貨での集計を容易にします(たとえば、本社に送信する未払いのPOの合計値を示すレポートを生成するため)。このようなユースケースの必要性が低い場合、USD値を保存する必要はありません。それは、必要な時間のFXレートテーブルから計算できます。ただし、次の質問は、基本通貨(USD)で値を取得する必要があることを意味します。
Q2:米ドル/基本通貨でレポートを生成できるようにするには、何をいつ変換する必要がありますか?
基本通貨と米ドルの両方で値を保存することにより、そのようなレポートは大幅に簡素化されます。これが、USD値の計算と保存に1回限りのコストがかかるため、何度でも読み取れる理由です。
Q3:誰か(2年後など)が基本通貨を米ドルからオーストラリアドルに変更した場合、既存のデータにどのような影響がありますか?
技術的には、このような変更が予想される場合は、USD
を使用してデータベース構造に名前を付けないでください。代わりに、BASE
のような一般的なものを使用してください。 :-)
そのような変更が行われた場合、会社の財務部門が財務データを再表示する方法を指示します-たとえば、取引時の一般的な為替レートに基づいてベース値を再計算する必要がありますか、それともフラットな換算係数を使用する必要がありますか?いずれの場合も、この決定が下されたら、適切な変換係数をFX_RATES
テーブルに入力し、1回限りのプロセスを実行してPURCHASE_ORDERS.ORDER_VALUE_BASE
列に再入力する必要があります。 FXレートとは別に、このルックアップの他のすべての情報はPURCHASE_ORDERS
テーブルにすでに存在し、変更されていません。
Q4:アプリケーションが最小量の変換を処理するように複数の通貨を処理するための最良の方法は何ですか?
これもまた、ビジネスニーズによって推進され、技術的な決定ではありません。現地通貨と基本(USD)通貨の両方について頻繁にレポートする必要がある場合、関連するトランザクション値を両方の通貨で格納すると役立ちます。一度計算して保存することで、その後保存されたデータにアクセスできるというメリットがあります。
また、データを破棄しないので、必要に応じていつでも財務情報を再計算できます。これが必要になる可能性のあるシナリオは次のとおりです。
FX_RATES
テーブルを検索します。ORDER_VALUE_USD
と、今日の為替レートを使用してFX_RATES
テーブルから再計算された値との差を取得し、そのようなシフトのドルへの影響を判断できます。Q5:取引時の為替レートを発注表に保存できませんか?このようにして、システムは為替レート表で為替レートを調べる必要がなくなります。 (フォローアップコメントで質問)
為替レートは、USD金額の代わりにPOテーブルに確実に保存できます。為替レートをPOテーブルに格納することには本質的に「誤り」はなく、代わりにUSD金額を格納することに「正しい」ものもありません。
もちろん、それが問題につながります。最初にルックアップテーブルに格納しない場合、POテーブルにデータを入力するために、どこから為替レートを取得するのでしょうか。大企業/グローバル企業では、FXレートはおそらくLOBアプリケーション自体を介して入力されない可能性が高く、会社全体で使用されるFXレートを決定するFXレートチームなどの外部ソースになることに注意してください。このような場合、FXレートを別のテーブルに保存する方が便利です。
以下に、さまざまなアプローチの利点をいくつか挙げました。必要に応じて、使用するものを選択する必要があります。
ORDER_VALUE_LOC x EXCHANGE_RATE
を計算する必要はありませんレポートの実行)。FX_RATES
テーブルは必要ありません。もちろん、追加の情報(ストレージのトレードオフ)を冗長的に保存して、利益を得ることができます(たとえば、POテーブルに、現地通貨の金額、為替レート、およびUSDの金額を保存し、別の為替レートのテーブルを保持します。これはを使用すると、現地通貨の金額と、それをUSD金額に変換するために使用されるFXレートを表示するPO文書を簡単に印刷できます。同時に、FXレートテーブルは、信頼できる為替レートのソースとして残ります)。
質問とその回答は主観的なものであるため、正しいことも間違ったこともありません。これらすべての推奨事項を要件と会社の標準に合わせて調整してください。
通常、会社が拠点を置く国の通貨を使用し、税金を支払います。そのため、取引時に他の通貨を有効な為替レートで米ドルに換算する必要があります。すべてのデータを取得するとすぐに変換が行われます。通貨だけでなく、多くの事柄を変える可能性があるため、通貨の変更による影響は不明です。最善の方法はわかりませんが、トランザクションが発生するたびにすべての為替レートを追跡することは理にかなっているため、適切なデータを提供できます。