在北美版本的 Microsoft Dynamics NAV 2009 中创建外币银行对帐时,总帐余额的计算不正确

应用对象
Dynamics NAV 2009

本文适用于以下国家/地区和语言区域设置的 Microsoft Dynamics NAV。

  • 加拿大英语 () (en-ca)
  • 英语 (美国) (en-us)
  • 西班牙语 (墨西哥) (es-mx)
  • 加拿大法语 () (fr-ca)

症状

假设你在北美版本的 Microsoft Dynamics 2009 中过帐使用外币银行帐户的现金收据日记帐。 通过运行 货币调整汇率... 函数,为现金收据日记帐创建调整。 在这种情况下,在外币银行帐户上创建银行对帐时,建议行中的总帐余额计算错误。 银行对帐计算不包括银行帐户的已实现收益或已实现的损失。
以下产品中会出现此问题:

  • Microsoft Dynamics NAV 2009 R2 的北美版本
  • 北美版 Microsoft Dynamics NAV 2009 Service Pack 1 (SP1)

解决方法

重要信息 修补程序 (2548309) 已还原为原始代码,应从应用此更改的任何数据库中删除。 如果进行了“代码更改”部分中所述的代码更改,则可以重新更改代码,以便代码与“现有代码”部分匹配。 如果未还原代码,则可以在银行对帐的“ 常规 ”选项卡上有差异,然后无法发布帖子。
本文的最初重新创建方案中,总帐 (总帐) 在北美数据库银行对帐上不平衡的问题进行了重新审视和研究。 通过进一步分析,产品管理和开发确定,报告不平衡的问题不是银行对帐计算标准代码不正确的结果,而是由银行帐户的初始设置引起的数据问题。 银行帐户的初始设置不正确,包括断开银行账本条目和总帐账本条目之间的链接。 错误的外币银行帐户设置步骤可能包括类似于以下步骤的内容:

  1. 将总帐过帐到银行帐户的总帐帐户的初始余额,例如总帐帐户 11650。

    注意 此交易通常包含在初始总帐试用余额设置中。

  2. 将现金收据日记帐条目过帐到银行帐户,其中银行帐户过帐组具有临时总帐帐户(例如 11000,已分配),以及任何未结帐交易(如未结支票和现金收据)到该银行帐户。 平衡帐户还设置为同一个帐户(例如 11000),以生成一个清洗条目。

  3. 然后,银行帐户过帐组帐户将从临时总帐帐户更改为总帐帐户 11650。 因此,在步骤 2 中为建立详细银行帐户设置而发布的原始条目是指向另一个总帐帐户。 因此,不再建立与总和条目的链接。

外币银行帐户的其他错误设置如下所示:

  1. 将总帐过帐到银行帐户的总帐帐户的初始余额,例如总帐帐户 11650。
  2. 然后,将一般日记帐过帐到银行帐户,将平衡帐户设置为银行帐户过帐组中指定的同一总帐科目,在本例中为总帐帐户 11650。

同样,步骤 1 中发布的总帐条目与步骤 2 中发布的银行帐户账本条目之间没有链接。

这些步骤是处理新外国银行帐户启动操作的错误方法。 如果运行此错误过程,可能会遇到本文 (2548309) 中所述的问题。 添加了此修补程序 (2548309) ,以更正由类似于上一方案的设置引起的特定方案。 但是,如果设置了银行帐户,但随后不将总帐帐户保留在银行过帐组中,或者如果银行帐户条目与总帐条目之间没有直接关联,则不同的过帐方案会导致持续不平衡的问题。

建议:假设 GL 的本地货币金额为 10,000 美元) ,则建立外币银行的建议过程类似于以下 (。

注意 - 以下基于 1:1 的货币汇率。 G/L 金额以当地货币更新。 因此,需要对银行帐户进行手动计算,以便使用正确的本地货币金额更新 GL。

  1. 将开始试用余额过帐到 GL 时,将银行的 GL 余额过帐到临时 G/L 帐户(如 G/L 帐户 11000),价格为 10,000 美元。

  2. 将一般日记帐发布到银行帐户,该帐户的“银行帐户过帐组”设置为所需的总帐帐户,在本例中为“总帐”帐户 11650。 在这里,你将平衡帐户设置为总帐 11000,这是最初作为初始试用余额设置的一部分过帐的初始临时现金帐户。

    -过帐此 10,000 美元条目将更新外国银行帐户和 G/L 帐户 11650,10,000 美元。 它还会将该临时总帐帐户 11000 减为 $0,因为该帐户与交易的抵消平衡帐户。 通过以这种方式过帐,银行账本条目和总帐账本条目之间有直接的联系。 这是处理和处理外国银行账户设置的正确方法。

      

修补程序信息

Microsoft现在提供了受支持的修补程序。 但是,它仅用于更正本文中所述的问题。 仅将其应用于遇到此特定问题的系统。 此修补程序可能会收到其他测试。 因此,如果你没有受到此问题的严重影响,我们建议你等待下一个Microsoft Dynamics NAV Service Pack 或包含此修补程序的下一Microsoft Dynamics NAV 版本。

注意 在特殊情况下,如果 Microsoft Dynamics 和相关产品的技术支持专业人员确定特定更新将解决你的问题,则通常由支持呼叫产生的费用可能会被取消。 对于相关特定升级无法解决的其他支持问题和事项,将照常收取支持费用。

            
          

安装信息

Microsoft 的编程示例仅用于说明,不做任何明示或暗示的保证。 这包括但不限于特定用途的适销性或适用性的隐含保证。 本文假定你熟悉所演示的编程语言以及用于创建和调试过程的工具。 Microsoft 支持工程师可以帮助解释特定过程的功能,但他们不会修改这些示例以提供新增功能或构建步骤以满足你的特定需要。

注意 在安装此修补程序之前,请验证所有 Microsoft Navision 客户端用户是否已从系统注销。 这包括 Microsoft Navision Application Services (NAS) 客户端用户。 实现此修补程序时,应是唯一登录的客户端用户。

若要实现此修补程序,必须具有开发人员许可证。

建议为 Windows 登录窗口或数据库登录名窗口中的用户帐户分配“SUPER”角色 ID。 如果无法为用户帐户分配“SUPER”角色 ID,则必须验证该用户帐户是否具有以下权限:

  • 要更改的 对象的“修改”权限。
  • 系统对象 ID 5210 对象和系统对象 ID 9015 对象的 Execute 权限。

                
注意 除非必须执行数据修复,否则您不必拥有数据存储的权限。

代码更改

注意 在将修补程序应用到生产计算机之前,始终在受控环境中测试代码修复。
若要解决此问题,请更改 Bank Rec. Header 表中的 CalculateBalance 函数中的代码, (10120) 如下所示:
现有代码

...
          REPEAT
            IF BankAccLedgEntry.GET(GLEntry."Entry No.") THEN BEGIN
              IF "Currency Code" <> BankAccLedgEntry."Currency Code" THEN BEGIN
                IF BankAccLedgEntry."Currency Code" <> '' THEN
                  "G/L Balance" += ROUND(CurrExchRate.ExchangeAmtFCYToFCY("Statement Date",
                                                                          BankAccLedgEntry."Currency Code",
                                                                          "Currency Code",
                                                                          BankAccLedgEntry.Amount),
                                         Currency."Amount Rounding Precision")
                ELSE
                  "G/L Balance" += ROUND(CurrExchRate.ExchangeAmtLCYToFCY("Statement Date",
                                                                          "Currency Code",
                                                                          BankAccLedgEntry.Amount,
                                                                          "Currency Factor"),
                                         Currency."Amount Rounding Precision");
              END ELSE BEGIN

                // Delete the folloiwng line.
                "G/L Balance" += BankAccLedgEntry.Amount;

              END;
            END ELSE BEGIN
              "G/L Balance" += ROUND(CurrExchRate.ExchangeAmtLCYToFCY("Statement Date",
                                                                      "Currency Code",
                                                                      GLEntry.Amount,
                                                                      "Currency Factor"),
                                     Currency."Amount Rounding Precision");
            END;
          UNTIL GLEntry.NEXT = 0;
...

替换代码

...
          REPEAT
            IF BankAccLedgEntry.GET(GLEntry."Entry No.") THEN BEGIN
              IF "Currency Code" <> BankAccLedgEntry."Currency Code" THEN BEGIN
                IF BankAccLedgEntry."Currency Code" <> '' THEN
                  "G/L Balance" += ROUND(CurrExchRate.ExchangeAmtFCYToFCY("Statement Date",
                                                                          BankAccLedgEntry."Currency Code",
                                                                          "Currency Code",
                                                                          BankAccLedgEntry.Amount),
                                         Currency."Amount Rounding Precision")
                ELSE
                  "G/L Balance" += ROUND(CurrExchRate.ExchangeAmtLCYToFCY("Statement Date",
                                                                          "Currency Code",
                                                                          BankAccLedgEntry.Amount,
                                                                          "Currency Factor"),
                                         Currency."Amount Rounding Precision");
              END ELSE BEGIN

                // Add the following lines.
                "G/L Balance" += ROUND(CurrExchRate.ExchangeAmtLCYToFCY("Statement Date",
                                                                        "Currency Code",
                                                                        GLEntry.Amount,
                                                                        "Currency Factor"),
                                       Currency."Amount Rounding Precision");
                // End of the lines.

              END;
            END ELSE BEGIN
              "G/L Balance" += ROUND(CurrExchRate.ExchangeAmtLCYToFCY("Statement Date",
                                                                      "Currency Code",
                                                                      GLEntry.Amount,
                                                                      "Currency Factor"),
                                     Currency."Amount Rounding Precision");
            END;
          UNTIL GLEntry.NEXT = 0;
...

          

先决条件

必须安装以下产品之一才能应用此修补程序:

  • Microsoft Dynamics NAV 2009 R2 的北美版本
  • Microsoft Dynamics NAV 2009 Service Pack 1 的北美版本

删除信息

无法删除此修补程序。

状态

Microsoft 已确认在 "适用于" 部分中所列的 Microsoft 产品中存在问题。

注意这是一篇由 Microsoft 支持组织直接创建的“快速发布”文章。 本文所包含的信息是按原样提供的,以应对新出现的问题。 由于发布速度较快,这些材料可能包含印刷错误,无需通知即可随时修改。 有关其他注意事项,请参阅使用条款