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(); } } }
额外说明
- 原代码中
select userinfo的逻辑在salesTable未赋值时执行,会导致查询结果无效,建议根据实际业务需求将该段代码移到循环内部执行。 - 优化后的
SalesTaker获取逻辑避免了重复调用find方法,降低了数据库查询开销。
内容的提问来源于stack exchange,提问作者clc988
相关产品推荐
相关产品推荐

