33

我已经阅读了关于多货币的不同问答,但没有一个对我来说很清楚,或者没有提供关于我的用例的足够详细信息。

设想:

公司 Raddo 有 3 个分支机构,英国、法国和美国。Raddo 有基础货币美元。预算以美元创建。Raddo 将支持的货币汇率存储在数据库中。

英国的员工以英镑创建采购订单,而法国的员工以欧元创建采购订单。

Q1:采购订单/订单项目数据库表中应该存储什么 - 分公司地点货币和当前汇率或以基础货币美元换算的金额?请记住,汇率必须是创建采购订单时的汇率。

Q2:要转换什么以及何时能够生成美元/基础货币的报告?

Q3:如果有人说2年后将基础货币从美元改为AUS澳元,对现有数据有什么影响?

Q4:处理多币种以使应用程序处理最少转换量的最佳方式是什么?

4

2 回答 2

54

请记住,您收到的答案将是主观的。有了这个免责声明,这就是我将如何建立这样一个系统。

TL;DR:使用货币汇率表存储不同货币和适用日期的汇率。以当地货币和计算的美元价值存储金额。


货币汇率表

创建以下形式的货币表(外汇汇率):

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),或者使用真实汇率(一种转换方式可能使用不同的汇率)比其他方式),或与原始记录相反。
  • 对于一对货币,连续的行必须表现出日期的连续性(即,对于一对货币,不应该有一个日期不正好在一行之间VALID_FROM_DATEVALID_TO_DATE
  • ('USD', 'USD', 1, smallest_date, largest_date)为方便起见,还请输入包含数据库支持的最小和最大日期的单行。这使得以基础货币本身进行输入时的处理更容易。
  • 您将需要确定为该表提供数据的货币汇率来源以及更新频率。例如,您的财务团队可能会发布每周外汇汇率表(即使货币市场的价值每天都在变化)。

示例表如下所示。虽然看起来一行的结束日期和下一行的开始日期之间存在重叠,但查找操作仅检查一列的相等性(即>= 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_TXN_DATE是采购订单上金融交易的日期。根据您的业务规则,这可能是也可能不是创建/提出 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:采购订单/订单项目数据库表中应该存储什么 - 分公司地点货币和当前汇率或以基础货币美元换算的金额?请记住,汇率必须是创建采购订单时的汇率。

如前所述,在采购订单表中存储当地货币价值、交易日期、当地货币名称;还以基础货币 (USD) 计算和存储价值。如果需要,可以再次查询汇率,这里不需要多余的存储。

美元值存储在此处,以便于以单一货币进行汇总(例如,生成一份报告,显示要发送到总部的未完成采购订单的总价值)。如果对此类用例的需求较低,则无需存储美元值,它可以根据需要的时间从 FX 汇率表中计算出来。但是,以下问题意味着有合理的需要以基础货币 (USD) 获取价值。

Q2:要转换什么以及何时能够生成美元/基础货币的报告?

通过以基础货币和美元存储值,将大大简化此类报告。这就是我们采用一次性成本计算和存储美元价值的原因,因此可以多次读取。

Q3:如果有人(比如 2 年后)将基础货币从美元更改为 AUD 澳元,对现有数据有何影响?

从技术上讲,如果预期会发生这样的变化,那么不要用 . 命名任何数据库结构USD,而是使用像BASE. :-)

如果进行了此类更改,公司的财务部门将指导您如何重述财务数据 - 例如,您是否应该根据交易时的现行汇率重新计算基值,或者仅使用统一的转换因子? 无论如何,一旦做出此决定,您只需在FX_RATES表中输入适当的转换因子,然后运行一次性流程来重新填充该PURCHASE_ORDERS.ORDER_VALUE_BASE列。除外汇汇率外,此查找的所有其他信息都已存在且未在PURCHASE_ORDERS表中更改。

Q4:处理多种货币以便应用程序处理最少转换量的最佳方式是什么?

这将再次由您的业务需求驱动,而不是技术决策。如果需要经常报告当地货币和基础 (USD) 货币,则有助于以两种货币存储相关交易价值。通过计算一次并存储它,您可以从之后访问存储的数据中受益。

此外,由于您没有丢弃任何数据,因此如果需要,您可以随时重新计算财务数据。可能需要这样做的一些场景是:

  • 公司决定使用发起采购订单时的现行汇率计算基础货币,但在关闭采购订单或开具发票时将重新计算基础(美元)货币。在这种情况下,您将FX_RATES在关闭采购订单时使用不同的日期来查找表格。
  • 如果英镑突然下跌,从 1 GBP = 1.25 USD 变为 1.5 GBP = 1 USD,您可能需要计算这种变化对美元的影响。然后,您可以从表中获取存储值ORDER_VALUE_USD与使用今天的汇率重新计算的值之间的差值FX_RATES,以确定这种转变对美元的影响。

Q5:不能将交易时的汇率存入采购订单表吗?这样,系统就不需要在外汇汇率表中查找汇率了。(通过后续评论询问)

汇率绝对可以存储在 PO 表中,而不是美元金额。在 PO 表中存储汇率本质上没有“错误”,而存储美元金额也没有任何“正确”。

当然,这将导致一个问题 - 如果您首先不将汇率存储在某个查找表中,那么您从哪里获得汇率以便将其填充到 PO 表中。请记住,在大型/全球公司中,外汇汇率很可能不会通过 LOB 应用程序本身填充,它将是一些外部来源,例如确定要在整个公司使用的外汇汇率的外汇汇率团队。在这种情况下,将外汇汇率存储在单独的表格中更为方便。

我在下面列出了不同方法的一些好处。您需要根据需要选择您使用的那些。

  • 在采购订单表中存储美元的好处: 美元金额直接可用,无需任何进一步计算(即ORDER_VALUE_LOC x EXCHANGE_RATE在运行报告时无需计算)。
  • 单独的外汇汇率表的好处:外汇汇率集中存储在一个表格中,使其更容易更新和审查(请记住,大公司可能有一个单独的团队来固定外汇汇率以供公司范围内使用),以及验证(例如,检查外汇汇率的连续性——在上面的例子中,通过将连续行上的有效起始/截止日期串在一起来检查外汇汇率是否没有差距非常简单)。外汇汇率不会分散在多个表格中。
  • 在采购订单表中存储外汇汇率的好处:无需单独的FX_RATES表格。

当然,您可以冗余地存储额外信息(权衡存储)以获得好处(例如,在 PO 表中存储当地货币金额、汇率和美元金额,并保留单独的 FX 汇率表。这让您可以轻松打印出显示当地货币金额的采购订单文件,以及用于将其转换为美元金额的汇率。同时,外汇汇率表仍然是汇率的权威来源)。

请记住,问题及其答案是主观的,因此没有对错之分。根据您的要求和您公司的标准定制所有这些建议。

于 2017-03-22T20:05:59.423 回答
1

通常您使用公司所在国家的货币并缴纳税款。所以您应该在交易时以有效汇率将其他货币兑换成美元。一旦您获得所有数据,就会发生转换。改变货币的影响是未知的,因为它不仅可以改变货币,还可以改变很多东西。我不知道什么是最好的方法,但是每当发生任何交易时跟踪所有汇率似乎是合乎逻辑的,因此您可以提供适当的数据。

于 2017-03-22T18:58:06.170 回答