複数の通貨を処理するためのベストプラクティスに関する議論を見つけるのは難しいと感じています。誰かが助けになる洞察やリンクを提供できますか?
これを行うにはいくつかの方法があることを理解しています。トランザクションで入力した値をそのまま保存する方法と、機能的に基本レートに変換する方法があります。どちらの場合も、将来の換算が必要になる可能性のある各通貨の取引時間をカバーする為替レートを保存する必要があります。
トランザクションアプローチの柔軟性が気に入っています。これにより、古い為替レート情報を後日入力できるようになりますが、機能的アプローチよりも(多くの為替レートデータを保存する必要があるため)オーバーヘッドが増える可能性があります。
パフォーマンスとスケーラビリティは主要な要素です。私たちは(すべて.net)Win&Webクライアント、レポートスイート、およびデータベースバックエンドに機能を提供する一連のWebサービスを持っています。必要に応じて、為替レート情報をどこかに(クライアントなどで)キャッシュできます。
編集:私は本当にいくつかのドキュメントへのリンク、または以前の経験からの「得点」を含む回答が欲しいです。
私は決定的な議論を見つけることができなかったので、私の発見を投稿します。
通貨テーブルには、グローバリゼーションクラスを利用するためのカルチャコードを含める必要があります。
取引方法
機能的方法
複合
比較
現実的には、関数方式とトランザクション方式のどちらかを選択する必要があります。どちらにも長所と短所があります。
機能的な方法では、トランザクションに現地通貨を格納する必要はありません。現在のdb値を基本通貨に変換する必要があり、1組の為替レートのみが必要です。必要なストレージは少ないですが、実装と保守が少し難しいです。
Transactionsメソッドはより柔軟ですが、保持する為替レート情報が多く必要であり、各トランザクションを入力通貨に関連付ける必要があります(ただし、これは各トランザクションではなく顧客のグループに適用できます)。現地通貨は引き続きローカルレベルで使用され、このソリューションの実装と保守が容易になるため、一般に、既に運用中のコードには影響しません。ただし、別の通貨に変換する必要のあるレポートや値には影響があります。
どちらの場合も、トランザクションごとに、換算する必要のある通貨ごとに為替レートが必要になります。これは、トランザクションの時点で機能メソッドに必要ですが、トランザクションメソッドでは、過去の為替レートデータをいつでも(任意の通貨を使用できるようにする)、つまり、機能メソッドで他の為替レートを使用できなくなります。
結論
通貨管理のトランザクション方式は柔軟なアプローチを提供し、クライアントのパフォーマンスへの悪影響を回避し、クライアントコードの変更をゼロにします。異なる通貨が必要な場合、すべてが再処理を必要とするレポートでは、パフォーマンスに悪影響を及ぼす可能性があります。各クライアントサイトは、入力通貨が何であるかを示す通貨参照を保存する必要があります。為替レートを高いレベル(顧客サイトのグループなど)で保存することで回避できるはずです。これにより、保存されるデータの量が最小限になります。低いレベルで為替レート情報が必要な場合、問題が発生する可能性があります。
単一の答えはありません。企業がこれらの通貨でのトランザクションを処理する方法に大きく依存するためです。一部の企業は、かなり高度な方法で外貨を管理しています。複数通貨の会計について読むことをお勧めします。
主なことは、ユニット内のデータをキャプチャすることです。値と日付で、ビジネストランザクションは変換せずに行われます。そうしないと、翻訳で何かを失うリスクがあります。表示とレポートの場合は、元の為替レート、またはユーザーの意図に応じてその他の為替レートを使用して、オンデマンドで変換します。
「10進数」(C#の場合)タイプの値を使用して保存および計算します。float/ doubleを使用しないでください。丸めエラーに対して脆弱になります。
たとえば、私が以前の人生でマルチ通貨アプリを実行した方法は次のとおりです。
当社は、複数通貨の会計および予算編成を扱っています。私たちが実装したソリューションは非常に単純明快で、次のものが含まれています。
1つの通貨テーブル、通貨で考慮される小数の数を含むいくつかのフィールド(はい、一部の通貨は3つの小数で管理する必要があります...)と為替レート値。 「実行されていない」または「保留中の」金融取引を評価する場合の/デフォルトの為替レート(下記を参照)
この通貨テーブルでは、レコードの1つに1の為替レートがあります。これは、システムのメイン/ピボット通貨です。
すべての金融トランザクション、または金融ディメンション(私たちの言語ではコミットメントと呼ばれます)を持つすべての操作は、「保留中」または「実行済み」としてソートされます。
保留中のトランザクションは、たとえば、特定の日付に特定の金額で受領されると予想される請求書です。予算フォローアップシステムでは、これらの金額は常に、通貨テーブルで利用可能な「提案/デフォルトの為替レート」に従って再評価されます。
実行されたトランザクションは、常に実行日、金額、通貨とともに保存されます[〜#〜] and [〜#〜]為替レート。実行データを入力するときに確認/入力する必要があります。
(私はあなたが間違いなくあなたが通貨データをフロートとして保存すべきでないこととその理由を知っていると仮定しています)
私の意見では、単一の基本通貨で作業する方が簡単かもしれません。ただし、元の金額、元の通貨、換算レート、および基本通貨の金額を保存する必要があります-それ以外の場合は、経理部門。彼らは別の種類の通貨を並べ替えておく可能性が高いので、あなたは生きてあなたを食べるかもしれません。
為替レートは変動するため、1つのアプローチは前述のとおりです。変換されない「入力されたままの」金額を保存しますが、表示のみで変換された金額を示すコンパニオンフィールドを表示します。変換を行うには、為替レートと適用可能な日付範囲の表が必要です。これのサイズが小さい場合、クライアントでのキャッシュはオプションです。それ以外の場合は、変換を実行するためにリモート呼び出しが必要になります。