web-dev-qa-db-ja.com

複数通貨のベストプラクティスと実装

複数の通貨を処理するためのベストプラクティスに関する議論を見つけるのは難しいと感じています。誰かが助けになる洞察やリンクを提供できますか?

これを行うにはいくつかの方法があることを理解しています。トランザクションで入力した値をそのまま保存する方法と、機能的に基本レートに変換する方法があります。どちらの場合も、将来の換算が必要になる可能性のある各通貨の取引時間をカバーする為替レートを保存する必要があります。

トランザクションアプローチの柔軟性が気に入っています。これにより、古い為替レート情報を後日入力できるようになりますが、機能的アプローチよりも(多くの為替レートデータを保存する必要があるため)オーバーヘッドが増える可能性があります。

パフォーマンスとスケーラビリティは主要な要素です。私たちは(すべて.net)Win&Webクライアント、レポートスイート、およびデータベースバックエンドに機能を提供する一連のWebサービスを持っています。必要に応じて、為替レート情報をどこかに(クライアントなどで)キャッシュできます。

編集:私は本当にいくつかのドキュメントへのリンク、または以前の経験からの「得点」を含む回答が欲しいです。

62
Mr Shoubs

私は決定的な議論を見つけることができなかったので、私の発見を投稿します。

通貨テーブルには、グローバリゼーションクラスを利用するためのカルチャコードを含める必要があります。

取引方法

  • 顧客の現地通貨で保存し、トランザクションの発生時に適用されたトランザクション通貨の複数の換算レートを保存します。
  • 各通貨に複数の為替レートが必要
  • サイト設定テーブルは入力通貨を保存します
  • 値が正しい通貨であると想定できるため、クライアントレベルでの値の入出力にはオーバーヘッドがありません。
  • 為替レートを適用するには、入力した値の通貨(クロスクライアントレポートでは異なる場合があります)を把握し、これにトランザクション期間中に有効だった関連エンティティの為替レートを掛ける必要があります。

機能的方法

  • 1つの基本通貨で保存し、長期にわたって適用されるこの通貨の換算レートを保持する
  • 値を変換するには、フロントエンドとデータベースの間のポイントを考慮する必要があります。
  • 基本通貨への変換を行う必要があるため、入力パフォーマンスはわずかに影響を受けます。為替レートはクライアントでキャッシュできます(各エンティティが異なる為替レートを使用する場合があることに注意してください)
  • これには、1セットの為替レートが必要でした(基本から他のすべての必要な通貨まで)
  • 為替レートを適用するには、すべての取引を基本通貨と必要通貨の間で変換する必要があります

複合

  • トランザクションの時点で、トランザクション値と機能値を格納します。これにより、為替レート情報を格納する必要がなくなります。 (これは、特定の値に対して2つの通貨に効果的に制限するため、適切なソリューションではありません)

比較

現実的には、関数方式とトランザクション方式のどちらかを選択する必要があります。どちらにも長所と短所があります。

機能的な方法では、トランザクションに現地通貨を格納する必要はありません。現在のdb値を基本通貨に変換する必要があり、1組の為替レートのみが必要です。必要なストレージは少ないですが、実装と保守が少し難しいです。

Transactionsメソッドはより柔軟ですが、保持する為替レート情報が多く必要であり、各トランザクションを入力通貨に関連付ける必要があります(ただし、これは各トランザクションではなく顧客のグループに適用できます)。現地通貨は引き続きローカルレベルで使用され、このソリューションの実装と保守が容易になるため、一般に、既に運用中のコードには影響しません。ただし、別の通貨に変換する必要のあるレポートや値には影響があります。

どちらの場合も、トランザクションごとに、換算する必要のある通貨ごとに為替レートが必要になります。これは、トランザクションの時点で機能メソッドに必要ですが、トランザクションメソッドでは、過去の為替レートデータをいつでも(任意の通貨を使用できるようにする)、つまり、機能メソッドで他の為替レートを使用できなくなります。

結論

通貨管理のトランザクション方式は柔軟なアプローチを提供し、クライアントのパフォーマンスへの悪影響を回避し、クライアントコードの変更をゼロにします。異なる通貨が必要な場合、すべてが再処理を必要とするレポートでは、パフォーマンスに悪影響を及ぼす可能性があります。各クライアントサイトは、入力通貨が何であるかを示す通貨参照を保存する必要があります。為替レートを高いレベル(顧客サイトのグループなど)で保存することで回避できるはずです。これにより、保存されるデータの量が最小限になります。低いレベルで為替レート情報が必要な場合、問題が発生する可能性があります。

38
Mr Shoubs

単一の答えはありません。企業がこれらの通貨でのトランザクションを処理する方法に大きく依存するためです。一部の企業は、かなり高度な方法で外貨を管理しています。複数通貨の会計について読むことをお勧めします。

主なことは、ユニット内のデータをキャプチャすることです。値と日付で、ビジネストランザクションは変換せずに行われます。そうしないと、翻訳で何かを失うリスクがあります。表示とレポートの場合は、元の為替レート、またはユーザーの意図に応じてその他の為替レートを使用して、オンデマンドで変換します。

「10進数」(C#の場合)タイプの値を使用して保存および計算します。float/ doubleを使用しないでください。丸めエラーに対して脆弱になります。

たとえば、私が以前の人生でマルチ通貨アプリを実行した方法は次のとおりです。

  • 毎日、その日の為替レートが設定され、これはデータベースに保存され、アプリケーションで変換するためにキャッシュされます。
  • すべてのトランザクションは、値+通貨+日付(つまり、変換なし)としてキャプチャされます。
  • ユーザーの通貨でのトランザクションの表示は、その場で行われました。これは取引通貨ではなく表示通貨であることを明確にしてください。これは、休日に行ったときのクレジットカードの明細に似ています。それは外国の取引額とそれがあなたの自国の通貨であなたを犠牲にすることになるどのくらいかを示します。
17
Frederik

当社は、複数通貨の会計および予算編成を扱っています。私たちが実装したソリューションは非常に単純明快で、次のものが含まれています。

  1. 1つの通貨テーブル、通貨で考慮される小数の数を含むいくつかのフィールド(はい、一部の通貨は3つの小数で管理する必要があります...)と為替レート値。 「実行されていない」または「保留中の」金融取引を評価する場合の/デフォルトの為替レート(下記を参照)

  2. この通貨テーブルでは、レコードの1つに1の為替レートがあります。これは、システムのメイン/ピボット通貨です。

すべての金融トランザクション、または金融ディメンション(私たちの言語ではコミットメントと呼ばれます)を持つすべての操作は、「保留中」または「実行済み」としてソートされます。

  1. 保留中のトランザクションは、たとえば、特定の日付に特定の金額で受領されると予想される請求書です。予算フォローアップシステムでは、これらの金額は常に、通貨テー​​ブルで利用可能な「提案/デフォルトの為替レート」に従って再評価されます。

  2. 実行されたトランザクションは、常に実行日、金額、通貨とともに保存されます[〜#〜] and [〜#〜]為替レート。実行データを入力するときに確認/入力する必要があります。

9

(私はあなたが間違いなくあなたが通貨データをフロートとして保存すべきでないこととその理由を知っていると仮定しています)

私の意見では、単一の基本通貨で作業する方が簡単かもしれません。ただし、元の金額、元の通貨、換算レート、および基本通貨の金額を保存する必要があります-それ以外の場合は、経理部門。彼らは別の種類の通貨を並べ替えておく可能性が高いので、あなたは生きてあなたを食べるかもしれません。

2
Piskvor

為替レートは変動するため、1つのアプローチは前述のとおりです。変換されない「入力されたままの」金額を保存しますが、表示のみで変換された金額を示すコンパニオンフィールドを表示します。変換を行うには、為替レートと適用可能な日付範囲の表が必要です。これのサイズが小さい場合、クライアントでのキャッシュはオプションです。それ以外の場合は、変換を実行するためにリモート呼び出しが必要になります。

1
btreat