web-dev-qa-db-ja.com

マルチ通貨-何を保存し、いつ変換するか?

多通貨に関するSO=に関するさまざまなQ&Aを読みましたが、どれも明確ではないか、使用例に関して十分な詳細を提供していません。

シナリオ:

Raddo社には、英国、フランス、米国の3つの支店があります。 Raddoの基本通貨は米ドルです。予算は米ドルで作成されます。 Raddoは、サポートされている通貨の為替レートをデータベースに格納します。

英国の従業員は英ポンドで発注書を作成し、フランスではユーロで発注書を作成します。

Q1:注文書/注文項目データベーステーブルに何を保存する必要がありますか-支店の場所の通貨と現在の為替レートまたは換算された金額を基本通貨の米ドルで?為替レートはPO作成時のものでなければならないことに注意してください。

Q2:米ドル/基本通貨でレポートを生成できるようにするには、何をいつ変換する必要がありますか?

Q3:2年後に基本通貨を米ドルからオーストラリアオーストラリアドルに変更した場合、既存のデータにどのような影響がありますか?

Q4:アプリケーションが最小量の変換を処理するように複数通貨を処理するための最良の方法は何ですか?

22
Iffi

あなたが受け取る答えは主観的であることを覚えておいてください。免責事項はありますが、これが私がこのようなシステムをセットアップする方法です。

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 
  • 最初の4列の組み合わせは、一意のレコードを表します。
  • 通貨のペア(USD-> GBP)のレコードが入力されるたびに、同等の逆レコードも挿入されることをお勧めします(GBP-> USD)。また、実際の為替レート(いずれかの方法で異なるレートを使用する場合がある変換)を使用します。逆の方法より)、または元のレコードの逆を使用します。
  • 通貨のペアの場合、連続する行は日付の連続性を示す必要があります(つまり、通貨のペアの場合、正確に1つの行でVALID_FROM_DATEVALID_TO_DATEの間にない日付があってはなりません)。
  • 便宜上、データベースでサポートされている最小日付と最大日付を含む単一の行('USD', 'USD', 1, smallest_date, largest_date)も入力します。これにより、基本通貨自体で入力が行われた場合の処理​​が容易になります。
  • このテーブルにフィードする通貨のFXレートのソースと更新の頻度を決定する必要があります。たとえば、財務チームが毎週の為替レート表を発行する場合があります(通貨市場の値が毎日変化する場合でも)。

サンプルテーブルは次のようになります。 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は、現地通貨の通貨コードです。
  • これらの3つのフィールドは、FXレートテーブルを検索するために使用されます。
  • 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)通貨の両方について頻繁にレポートする必要がある場合、関連するトランザクション値を両方の通貨で格納すると役立ちます。一度計算して保存することで、その後保存されたデータにアクセスできるというメリットがあります。

また、データを破棄しないので、必要に応じていつでも財務情報を再計算できます。これが必要になる可能性のあるシナリオは次のとおりです。

  • 基本的な通貨は、POが引き上げられた時点での実勢為替レートを使用して計算されるという企業の決定が行われますが、基本的な(USD)通貨は、POがクローズまたは請求さ​​れるときに再計算されます。このような場合、POのクローズ時に別の日付を使用してFX_RATESテーブルを検索します。
  • ポンドが急に変動し、1 GBP = 1.25 USDから1.5 GBP = 1 USDに変化した場合、そのような変化によるドルの影響を計算する必要があるかもしれません。次に、格納された値ORDER_VALUE_USDと、今日の為替レートを使用してFX_RATESテーブルから再計算された値との差を取得し、そのようなシフトのドルへの影響を判断できます。

Q5:取引時の為替レートを発注表に保存できませんか?このようにして、システムは為替レート表で為替レートを調べる必要がなくなります。 (フォローアップコメントで質問)

為替レートは、USD金額の代わりにPOテーブルに確実に保存できます。為替レートをPOテーブルに格納することには本質的に「誤り」はなく、代わりにUSD金額を格納することに「正しい」ものもありません。

もちろん、それが問題につながります。最初にルックアップテーブルに格納しない場合、POテーブルにデータを入力するために、どこから為替レートを取得するのでしょうか。大企業/グローバル企業では、FXレートはおそらくLOBアプリケーション自体を介して入力されない可能性が高く、会社全体で使用されるFXレートを決定するFXレートチームなどの外部ソースになることに注意してください。このような場合、FXレートを別のテーブルに保存する方が便利です。

以下に、さまざまなアプローチの利点をいくつか挙げました。必要に応じて、使用するものを選択する必要があります。

  • POテーブルにUSDを格納する利点:USDでの金額は、追加の計算を必要とせずに直接利用できます(つまり、ORDER_VALUE_LOC x EXCHANGE_RATEを計算する必要はありませんレポートの実行)。
  • 個別のFXレートテーブルの利点:FXレートは単一のテーブルに集中的に保存されるため、更新と確認が簡単になります(大企業には、会社全体で使用するために為替レートを修正する別のチームがいる可能性があることを忘れないでください)、および検証する(eg連続性をチェックするなど) FXレートの例-上記の例では、連続する行の有効な開始日/終了日をつなぎ合わせることで、FXレートにギャップがないことを簡単に確認できます)。 FXレートは複数のテーブルに分散されていません。
  • POテーブルにFXレートを格納する利点:個別のFX_RATESテーブルは必要ありません。

もちろん、追加の情報(ストレージのトレードオフ)を冗長的に保存して、利益を得ることができます(たとえば、POテーブルに、現地通貨の金額、為替レート、およびUSDの金額を保存し、別の為替レートのテーブルを保持します。これはを使用すると、現地通貨の金額と、それをUSD金額に変換するために使用されるFXレートを表示するPO文書を簡単に印刷できます。同時に、FXレートテーブルは、信頼できる為替レートのソースとして残ります)。

質問とその回答は主観的なものであるため、正しいことも間違ったこともありません。これらすべての推奨事項を要件と会社の標準に合わせて調整してください。

34
Phylyp

通常、会社が拠点を置く国の通貨を使用し、税金を支払います。そのため、取引時に他の通貨を有効な為替レートで米ドルに換算する必要があります。すべてのデータを取得するとすぐに変換が行われます。通貨だけでなく、多くの事柄を変える可能性があるため、通貨の変更による影響は不明です。最善の方法はわかりませんが、トランザクションが発生するたびにすべての為替レートを追跡することは理にかなっているため、適切なデータを提供できます。

1
Zed McJack