Acumatica生产订单维护界面字段更新致表头字段清空问题修复求助
问题背景与异常现象
在Acumatica制造模块的「库存项(Stock Items)」界面新增了自定义复选框,需求为:当该复选框勾选时,「生产订单维护(Production Order Maintenance)」界面的「允许预分配批次/序列号(Allow Preassigning Lot/Serial Numbers)」复选框自动勾选。
当前代码已实现复选框联动逻辑,但触发事件处理程序时,会清空Inventory ID等其他表头字段,需修复该异常。
原代码
using PX.Objects.Common.Exceptions; using PX.Objects.Common.Scopes; using PX.Objects.PM; using IQtyAllocated = PX.Objects.IN.Overrides.INDocumentRelease.IQtyAllocated; using LocationStatus = PX.Objects.IN.Overrides.INDocumentRelease.LocationStatus; using LotSerialStatus = PX.Objects.IN.Overrides.INDocumentRelease.LotSerialStatus; using SiteLotSerial = PX.Objects.IN.Overrides.INDocumentRelease.SiteLotSerial; using SiteStatus = PX.Objects.IN.Overrides.INDocumentRelease.SiteStatus; using System; using PX.Data; using PX.Objects.IN; using PX.Objects.CS; using System.Collections; using System.Collections.Generic; using System.Text; using PX.Objects.AM.GraphExtensions; using PX.Common; using PX.Objects.Common; using PX.Objects.SO; using PX.Objects.AM.Attributes; using System.Linq; using PX.Objects.AM.CacheExtensions; using PX.Data.BQL.Fluent; using PX.Data.BQL; using PX.Objects.AR; using PX.Objects.CR; using PX.Objects.GL; using PX.Objects; using PX.Objects.AM; using INInventoryItemExt = PX.Objects.IN.InventoryItemExt; namespace PX.Objects.AM { public class ProdMaint_Extension : PXGraphExtension<ProdMaint.ItemLineSplittingExtension,PX.Objects.AM.ProdMaint> { protected virtual void AMProdItem_InventoryID_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e) { var row = (AMProdItem)e.Row; if (row?.InventoryID == null) return; var item = InventoryItem.PK.Find(Base, row.InventoryID); if (item == null) return; var itemExt = PXCache<InventoryItem>.GetExtension<INInventoryItemExt>(item); cache.SetValueExt<AMProdItem.preassignLotSerial>(row, itemExt.UsrAutoGenerateNumberChecker == true); } } }
修复方案
异常原因
使用SetValueExt方法会触发完整的字段更新生命周期,包括验证、关联事件触发等,这会导致当前行的其他字段被意外重置。应改用SetValue方法,仅直接设置字段值,不触发额外业务逻辑。
修改后的代码
using PX.Data; using PX.Objects.IN; using PX.Objects.AM; using INInventoryItemExt = PX.Objects.IN.InventoryItemExt; namespace PX.Objects.AM { public class ProdMaint_Extension : PXGraphExtension<ProdMaint.ItemLineSplittingExtension, ProdMaint> { protected virtual void AMProdItem_InventoryID_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e) { var row = (AMProdItem)e.Row; if (row?.InventoryID == null) return; var item = InventoryItem.PK.Find(Base, row.InventoryID); if (item == null) return; var itemExt = PXCache<InventoryItem>.GetExtension<INInventoryItemExt>(item); // 替换SetValueExt为SetValue,避免触发额外字段更新逻辑 cache.SetValue<AMProdItem.preassignLotSerial>(row, itemExt.UsrAutoGenerateNumberChecker); } } }
优化说明
- 移除了未使用的命名空间,精简代码结构
- 直接使用
itemExt.UsrAutoGenerateNumberChecker赋值,无需多余的布尔判断(该属性本身为布尔类型)
内容的提问来源于stack exchange,提问作者Tharidhi P
相关产品推荐
相关产品推荐

