销售统计信息报表 (112) 、“客户/项目销售”报表 (113) 、“库存 - 客户销售”报表 (713) 或 Microsoft Dynamics NAV 2009 Service Pack 1 中的客户统计信息窗体 (151) 中利润不正确

应用对象
Dynamics NAV 2009 Service Pack 1

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

症状

假设生成的销售订单在 Microsoft Dynamics NAV 2009 Service Pack 1 (SP1) 中具有项费用成本。 运行“销售统计信息”报表 (112) 时,“客户/项销售额”报表 (113) 、“库存 - 客户销售报表 (713) 或客户统计信息窗体 (151) ,利润不正确。 这些报表中不包括项费用成本。

原因

出现此问题的原因是,系统会使用这些报表中具有“客户源”类型的条目来计算成本金额。

解决方法

修补程序信息

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

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

代码更改

注意 在将修补程序应用到生产计算机之前,始终在受控环境中测试代码修复。
要解决此问题,请按照下列步骤操作:

  1. 更改客户/项销售报表 (113) 中的代码,如下所示:
    现有代码 1

        OnPreReport=BEGIN
                      CustFilter := Customer.GETFILTERS;
                      ItemLedgEntryFilter := "Value Entry".GETFILTERS;
                      PeriodText := "Value Entry".GETFILTER("Posting Date");
    
                      IF PrintToExcel THEN
                        MakeExcelInfo;
                    END;
    

    替换代码 1

        OnPreReport=BEGIN
                      CustFilter := Customer.GETFILTERS;
                      ItemLedgEntryFilter := "Item Ledger Entry".GETFILTERS;
                      PeriodText := "Item Ledger Entry".GETFILTER("Posting Date");
    
                      IF PrintToExcel THEN
                        MakeExcelInfo;
                    END;
    

    现有代码 2

                { 10  ;TextBox      ;0    ;0    ;18150;423  ;SourceExpr="Value Entry".TABLECAPTION + ': ' + ItemLedgEntryFilter;
                                                             DataSetFieldName=Value_Entry__TABLECAPTION__________ItemLedgEntryFilter }
    

    替换代码 2

                { 10  ;TextBox      ;0    ;0    ;18150;423  ;SourceExpr="Item Ledger Entry".TABLECAPTION + ': ' + ItemLedgEntryFilter;
                                                             DataSetFieldName=Value_Entry__TABLECAPTION__________ItemLedgEntryFilter }
    

    现有代码 3

            DataItemIndent=1;
            DataItemTable=Table5802;
            DataItemTableView=SORTING(Source Type,Source No.,Item No.,Posting Date)
                              WHERE(Source Type=CONST(Customer));
            OnPreDataItem=BEGIN
                            ValueEntryBuffer.RESET;
                            ValueEntryBuffer.DELETEALL;
    
                            NextEntryNo := 1;
                          END;
    
            OnAfterGetRecord=BEGIN
                               ValueEntryBuffer.SETRANGE("Item No.", "Item No.");
    
                               IF NOT ValueEntryBuffer.FIND('-') THEN BEGIN
                                 ValueEntryBuffer.INIT;
                                 ValueEntryBuffer."Entry No." := NextEntryNo;
                                 ValueEntryBuffer."Item No." := "Item No.";
                                 ValueEntryBuffer.INSERT;
    
                                 NextEntryNo := NextEntryNo + 1;
                               END;
    
                               ValueEntryBuffer."Invoiced Quantity" := ValueEntryBuffer."Invoiced Quantity" + "Invoiced Quantity";
                               ValueEntryBuffer."Sales Amount (Actual)" := ValueEntryBuffer."Sales Amount (Actual)" + "Sales Amount (Actual)";
                               ValueEntryBuffer."Cost Amount (Actual)" := ValueEntryBuffer."Cost Amount (Actual)" + "Cost Amount (Actual)";
                               ValueEntryBuffer."Discount Amount" := ValueEntryBuffer."Discount Amount" + "Value Entry"."Discount Amount";
                               ValueEntryBuffer."Cost Amount (Non-Invtbl.)" := ValueEntryBuffer."Cost Amount (Non-Invtbl.)" + "Cost Amount (Non-Invtbl.)";
                               ValueEntryBuffer.MODIFY;
                             END;
    
            ReqFilterFields=Item No.,Inventory Posting Group,Posting Date;
            DataItemLink=Source No.=FIELD(No.),
                         Posting Date=FIELD(Date Filter),
                         Global Dimension 1 Code=FIELD(Global Dimension 1 Filter),
                         Global Dimension 2 Code=FIELD(Global Dimension 2 Filter);
    

    替换代码 3

            DataItemIndent=1;
            DataItemTable=Table32;
            DataItemTableView=SORTING(Source Type,Source No.,Item No.,Variant Code,Posting Date)
                              WHERE(Source Type=CONST(Customer));
            OnPreDataItem=BEGIN
                            ValueEntryBuffer.RESET;
                            ValueEntryBuffer.DELETEALL;
    
                            NextEntryNo := 1;
                          END;
    
            OnAfterGetRecord=BEGIN
                               ValueEntryBuffer.SETRANGE("Item No.", "Item No.");
    
                               IF NOT ValueEntryBuffer.FIND('-') THEN BEGIN
                                 ValueEntryBuffer.INIT;
                                 ValueEntryBuffer."Entry No." := NextEntryNo;
                                 ValueEntryBuffer."Item No." := "Item No.";
                                 ValueEntryBuffer.INSERT;
    
                                 NextEntryNo := NextEntryNo + 1;
                               END;
                               CALCFIELDS("Sales Amount (Actual)","Cost Amount (Actual)","Cost Amount (Non-Invtbl.)");
                               ValueEntryBuffer."Invoiced Quantity" := ValueEntryBuffer."Invoiced Quantity" + "Invoiced Quantity";
                               ValueEntryBuffer."Sales Amount (Actual)" := ValueEntryBuffer."Sales Amount (Actual)" + "Sales Amount (Actual)";
                               ValueEntryBuffer."Cost Amount (Actual)" := ValueEntryBuffer."Cost Amount (Actual)" + "Cost Amount (Actual)";
    
                               ValueEntry.SETCURRENTKEY("Item Ledger Entry No.");
                               ValueEntry.SETRANGE("Item Ledger Entry No.","Entry No.");
                               IF ValueEntry.FINDSET THEN
                                 REPEAT
                                   ValueEntryBuffer."Discount Amount" := ValueEntryBuffer."Discount Amount" + ValueEntry."Discount Amount";
                                 UNTIL ValueEntry.NEXT = 0;
    
                               ValueEntryBuffer."Cost Amount (Non-Invtbl.)" := ValueEntryBuffer."Cost Amount (Non-Invtbl.)" + "Cost Amount (Non-Invtbl.)";
                               ValueEntryBuffer.MODIFY;
                             END;
    
            ReqFilterFields=Item No.,Posting Date;
            DataItemLink=Source No.=FIELD(No.),
                         Posting Date=FIELD(Date Filter),
                         Global Dimension 1 Code=FIELD(Global Dimension 1 Filter),
                         Global Dimension 2 Code=FIELD(Global Dimension 2 Filter);
    
  2. 更改“客户/项销售”报表 (113) MakeExcelInfo@5 函数中的代码,如下所示:
    现有代码

        BEGIN
          ExcelBuf.AddInfoColumn("Value Entry".GETFILTERS,FALSE,'',FALSE,FALSE,FALSE,'');
    

    替换代码

        BEGIN
          ExcelBuf.AddInfoColumn("Item Ledger Entry".GETFILTERS,FALSE,'',FALSE,FALSE,FALSE,''); 
    
  3. 在 713) 的“库存 - 客户销售”报表的 Post 函数中添加一个新的本地变量 (,然后指定变量,如下所示:

    • 名称:ItemLedgerEntry@1001
    • DataTypeRecord
    • 长度:32
  4. 更改库存 - 客户销售报表中值条目 - OnAfterGetRecord 触发器中的代码 (713) ,如下所示:
    现有代码

    IF "Expected Cost" THEN
    CurrReport.SKIP;
    
    Profit := "Sales Amount (Actual)" + "Cost Amount (Actual)" + "Cost Amount (Non-Invtbl.)";
    
    IF ISSERVICETIER THEN
    IF "Source No." <> '' THEN
    

    替换代码

    IF "Expected Cost" THEN
      CurrReport.SKIP;
    
    //Add the following lines.
    WITH ItemLedgerEntry DO BEGIN
    SETRANGE("Entry No.","Item Ledger Entry No.");
    IF FINDFIRST THEN BEGIN
     CALCFIELDS("Sales Amount (Actual)","Cost Amount (Actual)","Cost Amount (Non-Invtbl.)");
    Profit := "Sales Amount (Actual)" + "Cost Amount (Actual)" + "Cost Amount (Non-Invtbl.)";
    END;
    END;
    //End of the lines.
    
    IF ISSERVICETIER THEN
     IF "Source No." <> '' THEN
    
  5. 更改成本计算管理代码单元中的 NonInvtblCostAmt 函数中的代码 (5836) ,如下所示:
    现有代码

            END;
          END;
    
          //Delete the following lines.
          PROCEDURE NonInvtblCostAmt@29(VAR Customer@1001 : Record 18) : Decimal;
          VAR
            ValueEntry@1000 : Record 5802;
          BEGIN
            WITH ValueEntry DO BEGIN
          //End of the lines.
    
              SETCURRENTKEY("Source Type","Source No.");
              SETRANGE("Source Type","Source Type"::Customer);
              SETRANGE("Source No.",Customer."No.");
    

    替换代码

            END;
          END;
    
          //Add the following lines.
          PROCEDURE NonInvtblCostAmt@29(VAR Customer@1001 : Record 18) CostAmtNonInvtbl : Decimal;
          VAR
            ItemLedgerEntry@1000 : Record 32;
          BEGIN
            WITH ItemLedgerEntry DO BEGIN
          //End of the lines.
    
              SETCURRENTKEY("Source Type","Source No.");
              SETRANGE("Source Type","Source Type"::Customer);
              SETRANGE("Source No.",Customer."No.");
    
  6. 更改成本计算管理代码单元中的 NonInvtblCostAmt 函数中的代码 (5836) ,如下所示:
    现有代码

              SETFILTER("Global Dimension 1 Code",Customer."Global Dimension 1 Filter");
              SETFILTER("Global Dimension 2 Code",Customer."Global Dimension 2 Filter");
    
              //Delete the following lines.
              CALCSUMS("Cost Amount (Non-Invtbl.)");
              EXIT("Cost Amount (Non-Invtbl.)");
              //End of the lines.
    
            END;
          END;
    

    替换代码

              SETFILTER("Global Dimension 1 Code",Customer."Global Dimension 1 Filter");
              SETFILTER("Global Dimension 2 Code",Customer."Global Dimension 2 Filter");
    
              //Add the following lines.
              IF FINDSET THEN
                REPEAT
                  CALCFIELDS("Cost Amount (Non-Invtbl.)");
                  CostAmtNonInvtbl += "Cost Amount (Non-Invtbl.)";
                UNTIL NEXT = 0;
              EXIT(CostAmtNonInvtbl);
              //End of the lines.
    
            END;
          END;
    

先决条件

必须安装 Microsoft Dynamics NAV 2009 Service Pack 1 才能应用此修补程序。

删除信息

无法删除此修补程序。

状态

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

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