如何在Release流程中将APTran用户字段同步至GLTran?
AP单据Release时同步APTran用户字段到GLTran的问题修复
原代码未生效的核心问题是无法正确关联GLTran对应的APTran记录,以下是修正后的代码及问题说明:
问题点分析
- 原代码中使用
PXResult<APTran>.Current获取APTran是错误的,在JournalEntry生成GLTran的上下文里,当前上下文不会自动持有对应的APTran实例,必须主动通过关联字段查询。 - 未处理GLTran可能存在的空值情况,匹配逻辑的可靠性不足。
修正后的代码
public class APReleaseProcessExt : PXGraphExtension<APReleaseProcess> { public static bool IsActive() { return true; } #region Event Handlers public delegate List<APRegister> ReleaseInvoiceDelegate(JournalEntry je , ref APRegister doc , PXResult<APInvoice, CurrencyInfo, Terms, Vendor> res , Boolean isPrebooking , ref List<INRegister> inDocs); [PXOverride] public List<APRegister> ReleaseInvoice(JournalEntry je, ref APRegister doc, PXResult<APInvoice, CurrencyInfo, Terms, Vendor> res, bool isPrebooking, ref List<INRegister> inDocs, ReleaseInvoiceDelegate baseMethod) { // 为JournalEntry的GLTran添加RowInserting事件处理器 je.RowInserting.AddHandler<GLTran>((s, e) => { GLTran glTran = e.Row as GLTran; if (glTran == null) return; // 跳过非AP来源的GLTran if (glTran.TranType != APInvoice.TypeInvoice && glTran.TranType != APInvoice.TypeDebitMemo && glTran.TranType != APInvoice.TypeCreditMemo) return; // 通过GLTran的关联字段查询对应的APTran记录 APTran apTran = PXSelect<APTran, Where<APTran.tranType, Equal<Required<APTran.tranType>>, And<APTran.refNbr, Equal<Required<APTran.refNbr>>, And<APTran.lineNbr, Equal<Required<APTran.lineNbr>>>>>> .Select(Base, glTran.TranType, glTran.RefNbr, glTran.TranLineNbr); if (apTran == null) return; // 获取APTran的扩展字段值并同步到GLTran APTranExt apTranExt = apTran.GetExtension<APTranExt>(); if (!string.IsNullOrEmpty(apTranExt.UsrGrantID)) { GLTranExt glTranExt = glTran.GetExtension<GLTranExt>(); glTranExt.UsrGrantID = apTranExt.UsrGrantID; // 标记字段为已修改,确保值被保存 s.Cache.SetValueExt<GLTranExt.usrGrantID>(glTran, apTranExt.UsrGrantID); } }); return baseMethod(je, ref doc, res, isPrebooking, ref inDocs); } #endregion }
关键修改说明
- 主动查询APTran:通过GLTran的
TranType、RefNbr、TranLineNbr三个关联字段,从数据库中精准查询对应的APTran记录,确保关联关系正确。 - 增加类型过滤:只处理AP单据类型的GLTran,避免无关记录干扰。
- 标记字段修改:使用
SetValueExt方法明确标记GLTran的用户字段已修改,确保系统能正确保存同步后的值。 - 空值校验:在每一步都增加空值判断,避免空引用异常。
内容的提问来源于stack exchange,提问作者pmfith
相关产品推荐
相关产品推荐

