You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

D365 FO中SRS报表TotalAmount字段重复首行值的修复请求

解决D365 FO SRS报表TotalAmount字段重复首行数值的问题

核心问题与修改方案

问题根源是SalesTotals对象在循环外部初始化,且未为每个SalesTable实例重新构造,导致始终使用初始的空记录(或首条循环记录)计算金额。

修改要点:

  • 将SalesTotals的构造代码移到while select salesTable循环内部,每次处理新的销售订单时,用当前循环的SalesTable实例重新初始化SalesTotals。
  • 清理原代码中未使用的冗余变量,优化重复查询逻辑提升性能。

修改后的完整DP类代码

public void processReport()
{
    SalesTable salesTable;
    SalesTotals salestotals;
    DirPerson dirperson;
    UserInfo userinfo;
    CompanyId companyId;
    str _company;
        
    // 原代码此处select userinfo时salesTable未赋值,逻辑异常,需根据业务需求调整执行位置
    // select networkalias from userinfo
    //    join dirPerson
    //         where userinfo.name == DirPerson::find(HcmWorker::find(salesTable.WorkerSalesTaker).Person).Name;
    
    companyId = _company == "" ? curExt() : _company;
    changecompany(companyId)
    {
        while select * from salesTable
               order by SalesId asc
               where salesTable.SalesStatus == 1 && salesTable.MGAOriginalOrderType == 2
        {
            ReportTmp.clear();

            reportTmp.SalesId = salesTable.SalesId;
            reportTmp.CreateBy = salesTable.CreatedBy;
            reportTmp.MGAOrderFillType = salesTable.MGAOrderFillType;
            reportTmp.InventLocationId = salesTable.InventLocationId;
            reportTmp.MGARiskStatus = salesTable.MGARiskStatus;
            reportTmp.SalesOrginId = salesTable.SalesOriginId;
            reportTmp.SalesPoolId = salesTable.SalesPoolId;
            reportTmp.CustomerRef = salesTable.CustomerRef;
            reportTmp.ShippingDateRequested = salesTable.ShippingDateRequested;
            reportTmp.MGACreatedDateTime = salesTable.CreatedDateTime;
            reportTmp.SalesOrginId = salesTable.SalesOriginId;
            reportTmp.CustAccount = salesTable.CustAccount;
            reportTmp.MGAOriginalCustName = salesTable.MGAOriginalCustName;
            reportTmp.DeliveryName = salesTable.DeliveryName;
            reportTmp.DeliveryTerm = salesTable.DlvTerm;
            reportTmp.SalesTaxGroup = salesTable.TaxGroup;
            reportTmp.MGAInCreditManagement = enum2Str(salesTable.CredManInCreditControl);
            reportTmp.Status = enum2Str(salesTable.SalesStatus);
            reportTmp.MGAEOrderStatus = enum2Str(salesTable.DocumentStatus);
            reportTmp.CreditHoldId = salesTable.CredManId;
            reportTmp.CurrencyCode = salesTable.CurrencyCode;
            reportTmp.MGAOriginalOrderType = salesTable.MGAOrigOrderType;
            reportTmp.InvoiceAccount = salesTable.InvoiceAccount;
            
            // 优化SalesTaker查询逻辑,减少重复数据库调用
            HcmWorker worker = HcmWorker::find(salesTable.WorkerSalesTaker);
            if (worker && worker.Person)
            {
                DirPerson person = DirPerson::find(worker.Person);
                if (person)
                {
                    reportTmp.SalesTaker = person.Name;
                }
            }

            // 关键修改:为当前销售订单重新构造SalesTotals实例
            salestotals = SalesTotals::construct(salesTable);
            reportTmp.TotalAmount = salestotals.totalAmount();

            reportTmp.insert();
        }
    }
}

额外说明

  1. 原代码中select userinfo的逻辑在salesTable未赋值时执行,会导致查询结果无效,建议根据实际业务需求将该段代码移到循环内部执行。
  2. 优化后的SalesTaker获取逻辑避免了重复调用find方法,降低了数据库查询开销。

内容的提问来源于stack exchange,提问作者clc988

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 09:48:12