Acumatica 2021 R1 明细扩展字段求和无法写入表头扩展字段咨询
该问题本质是Acumatica默认聚合计算逻辑对扩展字段的依赖触发不完整,并非PXParent没有覆盖扩展字段逻辑,按照以下步骤修改即可生效:
- 步骤1:调整表头扩展字段属性
若需要将汇总结果持久化到数据库,将字段属性[PXDecimal]替换为[PXDBDecimal];若仅需前端实时计算展示,保留[PXDecimal]的同时新增聚合计算声明,修改后代码如下:
using PX.Data;
using System;
namespace PX.Objects.IN
{
public class INPIHeaderExt : PXCacheExtension<PX.Objects.IN.INPIHeader>
{
#region UsrTotalBookCost
// 需持久化请替换为[PXDBDecimal]
[PXDecimal]
[PXUIField(DisplayName="Total Book Cost")]
[PXFormula(typeof(Sum<Select<INPIDetail, Where<INPIDetail.refNoteID, Equal<Current<INPIHeader.noteID>>>>, INPIDetailExt.usrExtBookCost>))]
public virtual Decimal? UsrTotalBookCost { get; set; }
public abstract class usrTotalBookCost : PX.Data.BQL.BqlDecimal.Field
#endregion
}
}
- 步骤2:调整明细扩展字段触发逻辑 新增源字段依赖声明,确保bookQty、unitCost修改时自动触发扩展字段重算,修改后代码如下: ```csharp using PX.Data; using System; namespace PX.Objects.IN { public class INPIDetailExt : PXCacheExtension<PX.Objects.IN.INPIDetail> { #region UsrExtBookCost // 需持久化请替换为[PXDBDecimal] [PXDecimal] [PXUIField(DisplayName="Ext. Book Cost")] [PXFormula(typeof(Mult<INPIDetail.bookQty, INPIDetail.unitCost>), typeof(SumCalc<INPIHeaderExt.usrTotalBookCost>))] [PXDependsOnFields(typeof(INPIDetail.bookQty), typeof(INPIDetail.unitCost))] public virtual Decimal? UsrExtBookCost { get; set; } public abstract class usrExtBookCost : PX.Data.BQL.BqlDecimal.Field<usrExtBookCost> { } #endregion } }
步骤3:页面属性校验
打开「实物库存盘点审核」页面对应的ASPX文件,确认明细网格中bookQty和unitCost两个字段的CommitChanges属性设置为True,确保字段值修改后立即提交到后端触发计算逻辑。步骤4:兜底方案(可选)
若以上配置后仍未生效,可通过扩展INPIEntry图添加行事件手动触发汇总计算,代码如下:
using PX.Data;
using PX.Objects.IN;
using System.Linq;
public class INPIEntryExt : PXGraphExtension
{
protected void INPIDetail_RowUpdated(PXCache sender, PXRowUpdatedEventArgs e) => RecalculateTotal();
protected void INPIDetail_RowDeleted(PXCache sender, PXRowDeletedEventArgs e) => RecalculateTotal();
protected void INPIDetail_RowInserted(PXCache sender, PXRowInsertedEventArgs e) => RecalculateTotal();
private void RecalculateTotal() { if (Base.Document.Current == null) return; var headerExt = Base.Document.Current.GetExtension<INPIHeaderExt>(); headerExt.UsrTotalBookCost = Base.Transactions.Select() .RowCast<INPIDetail>() .Sum(d => d.GetExtension<INPIDetailExt>().UsrExtBookCost ?? 0m); }
}
--- 内容的提问来源于stack exchange,提问作者Dave Richards

