Acumatica弹窗设置InventoryID后缺失默认确认弹窗异常
解决Acumatica中设置InventoryID后Item Class确认弹窗异常触发的问题
嘿,看起来你遇到的问题是自定义代码设置InventoryID后,Acumatica把新物料误判成了已创建的现有物料,导致修改Item Class时触发了不该出现的确认弹窗。我来帮你梳理下原因和修复方案:
核心原因分析
Acumatica的Item Class确认弹窗,通常是在InventoryItem DAC的ItemClassID字段相关的RowUpdating事件中触发的——逻辑是仅当物料是已存在(已保存到数据库)的记录时,修改Item Class才会弹出确认框。你的自定义代码可能不小心让缓存里的物料记录被标记为「已存在/待更新」状态,而非「新增」状态,导致系统误触发了这个逻辑。
从你提供的代码片段看,PXCache<InventoryItem>.CreateCopy(Base.Item.Current)是关键隐患:复制当前缓存里的记录时,会继承原记录的缓存状态(比如如果原记录是从数据库加载的,复制后的实例可能会被标记为待更新状态)。
修复方案
方案1:创建全新的InventoryItem实例(推荐)
避免复制现有记录,直接构建新实例并插入缓存,确保系统识别为新增物料:
[PXButton] [PXUIField(DisplayName = "Generate")] public IEnumerable GenerateInv(PXAdapter adapter) { string inventoryCD = "ACUMATICA"; // 直接初始化新的物料实例,而非复制现有记录 InventoryItem newItem = new InventoryItem { InventoryCD = inventoryCD, // 可以在这里设置其他默认字段值,比如ItemStatus等 ItemStatus = InventoryItemStatus.Active }; // 将新实例插入缓存,并标记为新增状态 Base.Item.Cache.Insert(newItem); return adapter.Get(); }
方案2:如果必须使用CreateCopy,手动重置缓存状态
如果你需要基于现有记录的模板来创建新物料,记得手动重置缓存状态,清除原有Item Class的痕迹:
[PXButton] [PXUIField(DisplayName = "Generate")] public IEnumerable GenerateInv(PXAdapter adapter) { string inventoryCD = "ACUMATICA"; InventoryItem item = PXCache<InventoryItem>.CreateCopy(Base.Item.Current); // 重置为新增状态,告诉系统这是一条新记录 Base.Item.Cache.SetStatus(item, PXEntryStatus.Insert); // 清除原有Item Class值,避免触发「变更检测」逻辑 item.ItemClassID = null; // 设置新的InventoryID item.InventoryCD = inventoryCD; // 插入缓存 Base.Item.Cache.Insert(item); return adapter.Get(); }
调试小技巧
可以在代码中添加日志,验证缓存记录的状态是否正确:
// 输出当前记录的缓存状态,确认是Insert而非Update PXTrace.WriteInformation($"Current Item Status: {Base.Item.Cache.GetStatus(item)}");
这样修改后,系统会正确识别这条物料是新增的,修改Item Class时就不会触发针对现有物料的确认弹窗了。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

