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
相关产品推荐
相关产品推荐

