【问题标题】:MS Access query to convert values from one currency to another currencyMS Access 查询将值从一种货币转换为另一种货币
【发布时间】:2014-01-28 10:07:33
【问题描述】:

好的,我需要一些帮助来解决我面临的问题。 我正在做一个数据库项目,在将货币价值从各种不同的货币转换为美元时遇到了问题。

我遇到困难的原因是我需要以原始货币格式维护原始记录,但我还必须能够将这些值转换为美元,然后执行一些动态查询来总结特定的值记录,然后将最终结果输出到一系列报告中。

我已经有一个表格,其中包含我的所有交易(包括货币类型字段和几个货币价值字段(每条记录 12 个字段)) 我有第二个表,其中包含货币类型的参考列表以及基于它们与美元的关系在 12 个月内的必要转换率(同样是 12 个数字字段)。 (即,输入美元后会跟随 12 个字段,对于 1 比 1 的汇率,所有字段的值都为 1)

我希望能够运行一个查询,将记录从我的交易表中复制到一个新表中,然后将它们全部转换为美元等值值。但是,我不是编写此类查询的专家,希望得到一些帮助。是否可以将 where 子句写入查询中的表达式,以便从事务中获取每条记录,找到正确月份的正确转换率,进行数学运算并输出到具有修改值的相同记录的另一个表?

或者有没有办法使用 VBA 脚本来执行相同的功能?如果是这样,您会对该代码提出什么样的建议?

进展/解决方案更新 因此,在查看了这里的解决方案和 cmets 之后,这是我想出的解决方案。 我以我想要的 CurrencyName 格式构建了我的汇率表 (ExRates),然后是 12 个月中每个月的转换率(这是由于必须使用现有的数据库元素)

构建了以下 2 个查询 Match & Convert

    SELECT ForcastTrans.*, ExRates.JanRate, ExRates.FebRate, ExRates.MarRate, ExRates.AprRate, ExRates.MayRate, ExRates.JunRate, ExRates.JulRate, ExRates.AugRate, ExRates.SepRate, ExRates.OctRate, ExRates.NovRate, ExRates.DecRate
    FROM ForcastTrans, ExRates
    WHERE ForcastTrans.Currency=ExRates.CurrencyName;

    SELECT qryExRatematch.EntityID, qryExRatematch.Account, qryExRatematch.Currency, [qryExRatematch]![Month1]*[qryExRatematch]![JanRate] AS Jan, [qryExRatematch]![Month2]*[qryExRatematch]![FebRate] AS Feb, [qryExRatematch]![Month3]*[qryExRatematch]![MarRate] AS Mar, [qryExRatematch]![Month4]*[qryExRatematch]![AprRate] AS Apr, [qryExRatematch]![Month6]*[qryExRatematch]![JunRate] AS Jun, [qryExRatematch]![Month7]*[qryExRatematch]![JulRate] AS Jul, [qryExRatematch]![Month8]*[qryExRatematch]![AugRate] AS Aug, [qryExRatematch]![Month9]*[qryExRatematch]![SepRate] AS Sep, [qryExRatematch]![Month10]*[qryExRatematch]![OctRate] AS Oct, [qryExRatematch]![Month11]*[qryExRatematch]![NovRate] AS Nov, [qryExRatematch]![Month12]*[qryExRatematch]![DecRate] AS [Dec]
    FROM qryExRatematch
    ORDER BY qryExRatematch.EntityID, qryExRatematch.Account, qryExRatematch.Currency;

这些为我提供了所需的转换,我可以将我的报告查询重新连接到这些表,而不是在没有转换的情况下完成的原始查询。

感谢大家的帮助、建议和意见,我将这个答案归功于 Johnny Bones,因为他的回答引导我进行实验,帮助我找到解决方案。

再次感谢您的帮助

【问题讨论】:

  • 我不愿建议一系列嵌入的IIF 语句。您应该能够通过 JOIN 完成此操作。您可能应该更加规范化您的转换表 - 将每个月放在自己的行中以使连接更容易。
  • 我试图避免过度规范化我的数据(已经有这个问题)我可以将交换器规范化到一个单独的表中。你会建议我如何构建这样一个表?
  • 第三范式是not over-规范化。范式是为了解决常见问题而创建的,数十年的使用证明它非常擅长完成工作。
  • 也许我误解了你。我最初的意图是设置表格,以便每一行都是特定类型的货币,月份是列标题。您是否建议我将其反转,以便不同的列标题是不同的货币,而行代表特定的月份?

标签: sql vba ms-access


【解决方案1】:

您的餐桌布局是否一成不变?最简单的方法是使用 3 个字段设置您的货币表:

  • CurrencyDate - 新货币汇率的日期
  • CurrencyName - 货币名称(日元、英镑、弗兰克等)
  • CurrencyRate - 当天的汇率

然后您将设置一个名为 qryCurrentExchange 的查询,您将在其中获取每种货币的 Max(CurrencyDate)。这将为您提供一个查询,其中包含每种货币的当前汇率。

使用您的交易表创建另一个查询,并通过 CurrencyName 内部加入上述查询,您应该能够获取汇率,您可以将其乘以交易表中的货币字段。如果要将结果输出到表中,可以保留查询原样或将其转换为 Make Table 查询。

【讨论】:

  • 我喜欢你的想法,不幸的是我认为它不能满足我必须满足的业务需求。现在,该表在 Mth12Rate 上包含以下字段 CurrencyName、Mth1Rate、Mth2Rate、...,原因是它必须保持并可能重新应用在历史上指定的转换率。此表还用作多个表的查找参考,以创建下拉列表供人们选择正确的货币。
  • 如果需要符合您的建议,我可以合理地将转化率分开到不同的表格中,但您将如何构建该查询?
  • 我必须回到我日常工作中的一些事情(我讨厌扑灭你没有点燃的大火......)但我的表格结构是可扩展且符合逻辑的。我多年来一直在做这件事。您可以轻松过滤您需要的内容,并将该过滤器应用于任何情况。就目前而言,听起来您每年都需要一张新桌子?仅此一项就应该告诉您这是错误的。稍后我会尝试弹回来,看看是否可以帮助查询。
  • 这很有意义。
  • 你能详细说明一下Remou吗?你同意 Johnny Bones 的观点还是我所说的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
相关资源
最近更新 更多