You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重写员工工时卡Release方法后生成重复日记账分录求助

问题分析与解决方案

你遇到的重复日记账问题,根源在于代码中三个关键错误:

  1. 工时卡明细获取方式错误:PXResult<EPTimecardDetail>.Current无法正确关联当前PMTran对应的工时卡明细,可能导致错误地修改多条PMTran记录,或重复处理同一记录。
  2. 字段修改未通过缓存API:直接赋值tran.BranchID未通知Acumatica缓存系统,导致数据状态不一致,触发重复的日记账生成逻辑。
  3. 事件时机选择不当:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:50:11