多货币最佳实践和实施

我发现很难find关于处理多种货币的最佳实践的讨论。 任何人都可以提供一些见解或链接来帮助?

我知道有很多方法可以做到这一点 – 无论是在交易中存储按原样input的值,还是在function上将其转换为基本费率。 在这两种情况下,都需要存储汇率,以涵盖将来可能需要转换的每种货币的交易时间。

我喜欢交易方式的灵活性,它允许在以后input旧的汇率信息,但可能比function方法有更多的开销(因为你必须存储更多的汇率数据)。

性能和可伸缩性是主要因素。 我们拥有(所有.net)一个win&web客户端,一个报告套件和一组Web服务,为数据库后端提供function。 如果需要,我可以将汇率信息caching在某个地方(如客户端)。

编辑:我真的很喜欢链接到一些文件,或答案,包括从以前的经验'陷阱'。

我找不到任何明确的讨论,所以我张贴我的发现,我希望它可以帮助别人。

货币表应该包括使用任何全球化类的文化代码。

交易方法

  • 以客户本地货币进行存储,并存储交易发生时应用的交易货币的多种兑换率。
  • 每种货币需要多种汇率
  • 网站设置表将存储input货币
  • 在客户端input和输出值不会有任何开销,因为它可以被认为是正确的货币价值
  • 要应用汇率,您需要知道input值的货币(交叉客户报告可能不同),然后将其乘以在交易时间段内有效的相关实体汇率。

function方法

  • 以一种基础货币进行存储,保持适用于该货币的转换率
  • 需要考虑在前端和数据库之间的点是转换值的最佳位置
  • 投入业绩受到轻微影响,因为需要转换为基础货币。 汇率可以caching在客户端(注意每个实体可能使用不同的汇率)
  • 这需要一套汇率(从基础到所有其他所需货币)
  • 要应用汇率,每笔交易都需要在基础货币和所需货币之间进行转换

综合

  • 在交易点,存储交易价值和function价值,这样就不需要存储汇率信息。 (这不是一个合适的解决scheme,因为它实际上限制你的任何给定值的两种货币)

对照

实际上,你必须在function和交易方法之间进行select。 两者都有其优点和缺点。

function方法不需要存储本地货币进行交易,需要将当前数据库值转换为基本货币,只需要一组汇率,实施和维护起来稍微困难一些,但需要的存储空间较小。

交易方法更为灵活,虽然它需要更多的汇率信息来保存,每笔交易都需要与input货币相关联(虽然这可以应用于一组客户而不是每笔交易)。 这通常不会影响已经生产的代码,因为本地货币仍然会在当地使用,这使得这个解决scheme易于实施和维护。 显然,任何需要转换为不同货币的报告或价值都会受到影响。

在这两种情况下,每笔交易在交易时都需要兑换所需兑换的每种货币的汇率 – 这是function方法交易点所需要的,但交易方法允许更大的灵活性,因为过去的汇率数据可以input任何时候(允许使用任何货币),即你失去了使用function方法的其他汇率的能力。

结论

货币pipe理的交易方法将提供一个灵活的方法,避免对客户端性能和零客户端代码修改的任何负面影响。 报告中可能会出现负面的业绩影响,如果需要不同的货币,所有这些都将需要返工。 每个客户站点将需要存储一个货币参考,说明他们的input货币是什么。 应该有可能摆脱高水平的存储汇率(例如一组客户站点等),这将最大限度地减less存储的数据量。 如果汇率信息要求较低,则可能会出现问题。

没有单一的答案,因为它非常依赖于业务处理这些货币交易的方式。 一些公司使用相当复杂的方式pipe理外汇。 我build议你阅读多币种会计。

要做的主要事情就是捕捉单位中的数据,业务交易的价值和date,而不必进行任何转换,否则您有可能在翻译中丢失一些东西。 为了显示和报告,根据用户的意图使用原始汇率或任何其他汇率按需转换。

以“Decimal”(以C#)types存储和计算值 – 不要使用float / double,否则容易出现舍入错误。

例如,我以前做过一个多货币应用程序的方式是:

  • 每天都会设置当天的汇率,并将其存储在数据库中,并在应用程序中caching以进行转换。
  • 所有的交易将被作为价值+货币+date(即没有转换)
  • 以用户货币显示交易是即时完成的。 明确这不是交易货币,而是显示货币。 这与您休假时的信用卡说明类似。 它显示了外汇交易金额,然后多less钱最终以您的本国货币计价。

我们公司处理多种货币会计和预算。 我们实施的解决scheme非常简单,包括以下内容:

  1. 一个货币表,有几个字段,包括小数位数要考虑的货币(是的,一些货币必须pipe理3小数…)和汇率的价值,这是没有其他的意义,而不是一个“提议/评估“未执行”或“未决”财务交易时的“默认汇率”(见下文)

  2. 在这个货币表中,其中一个logging的汇率为1.这是我们系统中的主要/主要货币

所有金融交易或所有具有财务维度的操作(我们称之为我们的语言的承诺),可以按照“等待”或“执行”sorting:

  1. 待处理交易例如预计在特定date收到一定金额的发票。 在我们的预算跟踪系统中,这些金额总是根据货币表中的“build议/默认汇率”重新评估。

  2. 执行的交易总是保存执行date,金额,货币汇率,在input执行数据时必须确认/input。

(我假设你已经知道你绝对不应该将货币数据存储为浮动,为什么)

在我看来,使用单一基础货币可能会更容易; 但是,您应该保存原始金额,原始币种,兑换率和基本货币金额 – 否则您的会计部门。 可能会把你活着吃掉,因为它们可能会分开保存不同的货币。

由于汇率波动,一种方法就像您提到的那样 – 存储没有转换的“按原样input”的金额,但显示仅显示的伴随字段并显示转换后的金额。 为了进行转换,需要一个汇率表及其适用的date范围。 如果这个大小很小,那么客户端上的caching是一个选项。 否则,为了执行转换,将需要远程调用。