IN301000入库单界面无法为INTran.LotSerialNbr等字段赋值问题
Acumatica IN301000入库单批次/有效期字段赋值失效问题解决
问题原因
- INTran表的
LotSerialNbr、ExpireDate字段属于前台展示用的计算字段,实际数据持久化存储在INTranSplit子表中,直接修改INTran行的这两个属性,会被系统标准逻辑后续从Split子表同步的数值覆盖,导致赋值不生效。 - INTranSplit相关事件默认不触发,是因为系统仅在用户手动打开批次拆分弹窗、或开启了自动批次/有效期分配规则时才会创建Split记录,没有Split行的场景下自然无法触发对应的子表事件。
- 原代码中直接对行属性赋值,未调用缓存的更新方法,部分场景下会被缓存的原值覆盖。
解决方法
方案1:使用FieldDefaulting事件赋值(最简方案,已验证该事件可正常触发)
直接为两个字段的FieldDefaulting事件编写赋值逻辑,该事件优先级高于系统默认赋值逻辑,设置后不会被后续逻辑覆盖:
using PX.Data; using PX.Objects.IN; using System; namespace PX.Objects.IN { public class INReceiptEntry_Extension : PXGraphExtension<INReceiptEntry> { #region Event Handlers protected void INTran_LotSerialNbr_FieldDefaulting(PXCache cache, PXFieldDefaultingEventArgs e) { var row = (INTran)e.Row; if (row == null) return; // 可自行增加判断条件,仅对符合要求的行赋值 e.NewValue = "TESTING"; e.Cancel = true; // 终止系统默认赋值逻辑 } protected void INTran_ExpireDate_FieldDefaulting(PXCache cache, PXFieldDefaultingEventArgs e) { var row = (INTran)e.Row; if (row == null) return; e.NewValue = new DateTime(2021, 12, 31); e.Cancel = true; } #endregion } }
方案2:需在InventoryID更新后触发赋值的场景
如果逻辑需要依赖InventoryID选择后的其他字段做判断,可修改代码同时处理INTran展示字段和Split子表的赋值,避免被覆盖:
using PX.Data; using PX.Objects.IN; using System; namespace PX.Objects.IN { public class INReceiptEntry_Extension : PXGraphExtension<INReceiptEntry> { #region Event Handlers protected void INTran_InventoryID_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e) { var row = (INTran)e.Row; if (row == null || row.InventoryID == null) return; // 更新INTran前台展示字段 cache.SetValueExt<INTran.lotSerialNbr>(row, "TESTING"); cache.SetValueExt<INTran.expireDate>(row, new DateTime(2021, 12, 31)); // 自动创建Split子表记录并赋值,避免后续被系统逻辑覆盖 Base.splits.Current = null; INTranSplit newSplit = Base.splits.Insert(); if (newSplit != null) { newSplit.InventoryID = row.InventoryID; newSplit.LotSerialNbr = "TESTING"; newSplit.ExpireDate = new DateTime(2021, 12, 31); newSplit.Qty = row.Qty; Base.splits.Update(newSplit); } } #endregion } }
验证注意事项
- 确认对应库存物品的批次管理、有效期管理属性已开启,否则系统不会处理这两个字段
- 自定义发布后清理浏览器缓存再测试,避免前端缓存旧的页面逻辑
内容的提问来源于stack exchange,提问作者Jerry Kurtz
相关产品推荐
相关产品推荐

