You need to enable JavaScript to run this app. Acumatica 2017 R2下APReleaseProcess自定义扩展代码未生效问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

Acumatica 2017 R2下APReleaseProcess自定义扩展代码未生效问题咨询

问题场景

在「释放应付单据」界面对释放按钮开展自定义开发,需求为:单据释放过程中,将应付交易、应付发票、应付税务单据上的自定义字段值,同步写入总账交易对应的扩展字段。配套操作界面截图展示了应付单据释放页面的实际操作入口。

随后编写了如下自定义代码,尝试实现字段同步逻辑:

namespace PX.Objects.AP
{
  public class APReleaseProcess_Extension : PXGraphExtension<APReleaseProcess>
  {
    public delegate List<APRegister> ReleaseDocProcDel(JournalEntry je, ref APRegister doc, PXResult<APInvoice, 
                                                      CurrencyInfo, Terms, Vendor> res, bool isPrebooking, 
                                                      out List<INRegister> inDocs);
    [PXOverride]
    public List<APRegister> ReleaseDocProc(JournalEntry je, ref APRegister doc, 
                                          PXResult<APInvoice, CurrencyInfo, Terms, Vendor> res, 
                                          bool isPrebooking, 
                                          out List<INRegister> inDocs, ReleaseDocProcDel del)
    {
        je.RowInserting.AddHandler<GLTran>((sender, e) => 
        {
            GLTran glTran = e.Row as GLTran;
            APTran apTran = PXResult<APTran>.Current;
            if (glTran != null && apTran != null)
            {
                APTranExt apTranEx = PXCache<APTran>.GetExtension<APTranExt>(apTran);
                if (apTran != null && apTranEx.UsrJobOrderNbr != null)
                {
                    GLTranExt glTranEx = PXCache<GLTran>.GetExtension<GLTranExt>(glTran);
                    glTranEx.UsrJobOrderNbr = apTranEx.UsrJobOrderNbr;
                }
            }

            //APInvoice apInv = PXResult<APInvoice>.Current;
            APInvoice apInv = PXSelect<APInvoice,
                                  Where<APInvoice.refNbr, Equal<Required<GLTran.refNbr>>,
                                      And<APInvoice.docType,
                                          Equal<Required<GLTran.tranType>>>>>.Select(sender.Graph, glTran.RefNbr, glTran.TranType);

            if (glTran != null && apInv != null)
            {
                GLTranExt glTranEx = PXCache<GLTran>.GetExtension<GLTranExt>(glTran);
                glTranEx.UsrInvoiceNbr = apInv.InvoiceNbr;
            }

            APTaxTran apTaxTran = PXResult<APTaxTran>.Current;
            if (glTran != null && apTaxTran != null)
            {
                APTaxTranExt apTaxTranEx = PXCache<APTaxTran>.GetExtension<APTaxTranExt>(apTaxTran);
                if (apTaxTran != null && apTaxTranEx != null)
                {
                    GLTranExt glTranEx = PXCache<GLTran>.GetExtension<GLTranExt>(glTran);
                    glTranEx.UsrNoSeriFaktur = apTaxTranEx.UsrNoSeriFaktur;
                }
            }
        });
        return del(je, ref doc, res, isPrebooking, out inDocs);
    }
  }
}

当前遇到的现象:调试时代码内设置的所有断点始终无法触发,核心疑问包括:

  • 采用PXOverride重写ReleaseDocProc方法实现释放按钮自定义的开发方式是否正确
  • 断点不触发的根本原因
  • 对应的排查方向和优化方案

问题原因与排查指引

  • 重写方法签名不匹配是重写逻辑失效、断点不触发的最高发原因
    PXOverride机制的生效前提是:重写方法的参数列表、返回类型、委托定义必须和系统基类的原方法完全一致,只要存在参数顺序错误、参数修饰符(ref/out/值传递)不匹配、委托定义和原方法签名错位,系统就不会加载该重写逻辑,自然不会触发断点。需反编译对应版本的APReleaseProcess基类,逐字段核对原ReleaseDocProc方法的签名细节,避免因为和记忆中的签名不一致导致重写失效。
  • 事件绑定时机存在固有缺陷
    现有逻辑把GLTran的RowInserting事件处理器绑定在JournalEntry图形实例上,属于晚绑定逻辑:APReleaseProcess在执行ReleaseDocProc流程时,大量GLTran行的插入动作是在方法内部直接通过数据库批量提交、或是在ReleaseDocProc方法调用前就已经完成初始化的,晚绑定的事件处理器根本无法捕获已经发生的插入动作,即便重写逻辑被成功触发,绑定的事件也不会执行。
  • 基础校验排查项
    • 确认自定义项目编译生成的DLL已正确部署到Acumatica站点的Bin目录,不存在旧版本DLL被站点优先加载的问题
    • 确认当前操作入口的释放流程确实走APReleaseProcess的标准释放路径:从应付发票页面直接点释放、批量释放等入口,可能绕过ReleaseDocProc的调用逻辑,导致重写方法无法触发
    • 确认图扩展类为public访问修饰符,没有因为internal等访问限制被Acumatica扩展加载器识别失败
  • 更稳定的替代实现方案
    尽量避免通过重写内部核心释放流程实现字段同步,可直接对GLTran缓存附加RowPersisting事件,在数据持久化前根据GLTran记录的源单据类型、编号,通过查询匹配对应的APTran、APInvoice、APTaxTran记录,直接读取自定义扩展字段值赋值到GLTran的对应扩展字段。这种方式不依赖对内部方法的重写,不会因为系统版本升级调整方法签名导致自定义逻辑失效,兼容性更强。

内容的提问来源于stack exchange,提问作者HariEko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 10:15:05