重写员工工时卡Release方法后生成重复日记账分录求助
问题分析与解决方案
你遇到的重复日记账问题,根源在于代码中三个关键错误:
- 工时卡明细获取方式错误:
PXResult<EPTimecardDetail>.Current无法正确关联当前PMTran对应的工时卡明细,可能导致错误地修改多条PMTran记录,或重复处理同一记录。 - 字段修改未通过缓存API:直接赋值
tran.BranchID未通知Acumatica缓存系统,导致数据状态不一致,触发重复的日记账生成逻辑。 - 事件时机选择不当:在
RowInserted事件(记录插入后)修改BranchID,会触发系统默认的分支相关处理,进而生成额外分录。
修改后的代码
public class TimeCardMaint_Extension : PXGraphExtension<TimeCardMaint> { #region Event Handlers public delegate IEnumerable ReleaseDelegate(PXAdapter a); [PXOverride] public IEnumerable Release(PXAdapter adapter, ReleaseDelegate InvokeBase) { PXGraph.InstanceCreated.AddHandler<RegisterEntry>((graph) => { // 改用RowCreated事件,在记录创建初期设置分支 graph.RowCreated.AddHandler<PMTran>((sender, e) => { var tran = (PMTran)e.Row; if (tran == null || string.IsNullOrEmpty(tran.RefNbr) || tran.LineNbr == null) return; // 通过PMTran的RefNbr和LineNbr关联对应工时卡明细 EPTimecardDetail detail = PXSelect<EPTimecardDetail, Where<EPTimecardDetail.refNbr, Equal<Required<PMTran.refNbr>>, And<EPTimecardDetail.lineNbr, Equal<Required<PMTran.lineNbr>>>>> .Select(sender.Graph, tran.RefNbr, tran.LineNbr); if (detail != null && detail.ProjectID != null) { PMProject project = PXSelect<PMProject, Where<PMProject.contractID, Equal<Required<PMProject.contractID>>>> .Select(sender.Graph, detail.ProjectID); if (project != null && project.DefaultBranchID != tran.BranchID) { // 使用SetValueExt更新字段,确保缓存正确识别变更 sender.Graph.Caches[typeof(PMTran)].SetValueExt<PMTran.branchID>(tran, project.DefaultBranchID); } } }); }); return InvokeBase(adapter); } #endregion }
关键修改说明
- 关联正确的工时卡明细:通过PMTran的
RefNbr和LineNbr精准匹配对应的EPTimecardDetail,避免关联错误记录。 - 使用缓存API更新字段:
SetValueExt会自动处理字段的依赖逻辑与缓存状态,确保系统正确识别BranchID的变更,不会触发重复生成逻辑。 - 调整事件时机:
RowCreated在记录初始化时触发,此时修改BranchID不会触发后续的分支相关处理流程,从源头避免额外分录生成。
内容的提问来源于stack exchange,提问作者Tibu
相关产品推荐
相关产品推荐

