Acumatica销售订单网格非持久化字段事件触发问题
解决Acumatica销售订单网格中非持久化字段触发单价更新的问题
我之前也碰到过一模一样的情况——非持久化字段的事件总是不按预期触发,尤其是在网格场景里。别慌,咱们一步步来搞定:
第一步:确保非持久化字段的DAC扩展定义正确
首先,你的SOOrderDetail缓存扩展里的非持久化字段必须用[PXNonPersisted]标记,这是让Acumatica跟踪字段变化的关键。示例代码如下:
public class SOOrderDetailExt : PXCacheExtension<SOOrderDetail> { #region UsrCustomFactor [PXDecimal(2)] // 根据业务需求设置精度 [PXUIField(DisplayName = "自定义系数", Enabled = true)] [PXNonPersisted] // 核心标记:告知系统这是不持久化的字段 public decimal? UsrCustomFactor { get; set; } public abstract class usrCustomFactor : PX.Data.BQL.BqlDecimal.Field<usrCustomFactor> { } #endregion }
第二步:在Graph扩展中订阅字段离开事件(Tab/Enter触发)
当用户按Tab或Enter离开字段时,Acumatica会触发FieldUpdated事件——这正是你需要的触发时机。在SOOrderEntry的Graph扩展里订阅这个事件,然后在逻辑中更新单价:
public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry> { // 订阅自定义非持久化字段的FieldUpdated事件 protected void _(Events.FieldUpdated<SOOrderDetail, SOOrderDetailExt.usrCustomFactor> e) { if (e.Row == null) return; // 获取当前行的扩展字段值 var rowExt = e.Row.GetExtension<SOOrderDetailExt>(); var customFactor = rowExt.UsrCustomFactor; if (customFactor == null || customFactor == 0) return; // 这里替换成你的单价更新逻辑,比如基于系数计算新单价 // 示例:新单价 = 原单价 × 自定义系数 var originalPrice = e.Row.UnitPrice ?? 0m; e.Row.UnitPrice = originalPrice * customFactor.Value; // 强制刷新单价字段的界面显示,确保用户能看到更新后的值 Base.Transactions.Cache.SetValueExt<SOOrderDetail.unitPrice>(e.Row, e.Row.UnitPrice); } }
常见问题排查
如果事件还是没触发,检查这几个关键点:
- 界面布局是否正确:确认你已经把
UsrCustomFactor字段添加到销售订单的网格中,并且设置为可编辑状态(Enabled = true)。 - 事件订阅是否精准:核对
Events.FieldUpdated的泛型参数,必须是正确的DAC(SOOrderDetail)和扩展字段(SOOrderDetailExt.usrCustomFactor)。 - 尝试替代事件:如果
FieldUpdated依旧没反应,可以试试FieldVerifying事件(字段值验证前触发),或者用RowUpdated事件(需要判断新旧值是否变化):
// RowUpdated事件的替代方案 protected void _(Events.RowUpdated<SOOrderDetail> e) { var oldExt = e.OldRow.GetExtension<SOOrderDetailExt>(); var newExt = e.Row.GetExtension<SOOrderDetailExt>(); // 仅当自定义字段值发生变化时执行更新 if (oldExt.UsrCustomFactor != newExt.UsrCustomFactor) { if (newExt.UsrCustomFactor != null && newExt.UsrCustomFactor != 0) { e.Row.UnitPrice = (e.Row.UnitPrice ?? 0m) * newExt.UsrCustomFactor.Value; Base.Transactions.Cache.SetValueExt<SOOrderDetail.unitPrice>(e.Row, e.Row.UnitPrice); } } }
这样设置后,用户输入完自定义字段按Tab或Enter离开时,单价就会自动更新啦!
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

