为INItemLotSerial添加带PXDefault当前日期的UsrMfgDate字段仅拆解操作报错
Acumatica拆解操作中UsrMfgDate字段非空错误排查建议
我们在INTran、INTranSplit、INItemLotSerial、POReceiptLine、POReceiptLineSplit这几个表中添加了自定义字段UsrMfgDate,配置了PXDefault默认取当前业务日期,在常规生产订单和采购收货场景下都正常,但执行拆解操作保存时,会抛出“UsrMfgDate不能为空”的错误。字段代码如下:
#region UsrMfgDate [PXDBDate] [PXUIField(DisplayName="Mfg Date")] //[PXDefault(typeof(AccessInfo.businessDate))] [PXDefault(typeof(AccessInfo.businessDate), PersistingCheck = PXPersistingCheck.NullOrBlank)] public virtual DateTime? UsrMfgDate { get; set; } public abstract class usrMfgDate : PX.Data.BQL.BqlDateTime.Field<usrMfgDate> {} #endregion
可能的原因
- 拆解操作的记录生成逻辑绕过了字段默认值触发流程:拆解时后台代码可能直接创建数据库记录,没有走UI或标准初始化流程,导致
PXDefault的默认值没有被赋值到字段上 AccessInfo.BusinessDate在拆解场景下未正确获取:部分后台操作场景中,AccessInfo上下文可能未正确初始化,导致默认值表达式无法获取到有效日期PersistingCheck校验时机问题:NullOrBlank的校验在拆解记录保存时提前触发,此时字段还未被默认值逻辑赋值
解决建议
调整字段的校验规则
将PersistingCheck改为PXPersistingCheck.Nothing,避免强制非空校验,同时保留默认值赋值逻辑:[PXDefault(typeof(AccessInfo.businessDate), PersistingCheck = PXPersistingCheck.Nothing)]通过Row事件手动确保字段赋值
在对应表的RowInserted或RowPersisting事件中,手动检查并赋值UsrMfgDate,以覆盖所有场景:protected virtual void INTran_RowInserted(PXCache cache, PXRowInsertedEventArgs e) { var tran = (INTran)e.Row; if (tran?.UsrMfgDate == null) { var ai = PXAccess.GetAccessInfo(); cache.SetValueExt<INTran.usrMfgDate>(tran, ai.BusinessDate); } } // 同样的逻辑可以复制到INTranSplit、INItemLotSerial等表的对应事件中检查拆解操作的后台代码
如果拆解操作是通过自定义代码实现的,查看是否在创建INTran等表的记录时,没有手动赋值UsrMfgDate,需要在代码中主动设置该字段值为当前业务日期:AccessInfo ai = PXAccess.GetAccessInfo(); newTran.UsrMfgDate = ai.BusinessDate;验证Lot/Serial表的字段赋值
拆解操作通常会生成INItemLotSerial记录,重点检查该表的UsrMfgDate是否被正确赋值,因为子表字段的非空错误也可能触发保存失败提示
内容的提问来源于stack exchange,提问作者David Eichner
相关产品推荐
相关产品推荐

