重写发票界面Release动作后,报错仍释放发票的问题求助
解决Acumatica发票Release动作抛错后仍被释放的问题
你的代码逻辑存在两个关键问题,导致抛出异常后发票还是被释放了,我们一步步来修复:
问题分析
- 错误的原方法调用方式:你用
Base.release.Press(adapter)触发原释放逻辑,这会直接触发按钮点击事件,可能绕过重写方法的异常拦截机制。正确的做法应该调用重写的原方法Base.Release(adapter)。 - 代码分支逻辑漏洞:当
paymentSetup和paymentSettings有效且发票状态为已支付时,你的代码没有调用原释放方法就直接返回null,会导致正常场景下发票无法释放;而异常抛出分支虽然中断了当前代码,但按钮事件的触发逻辑可能还是执行了释放动作。
修复后的代码
[PXOverride] public virtual IEnumerable Release(PXAdapter adapter) { if (Base.Document.Current != null) { var paymentSetup = PaySetup.SelectSingle(Base.Document.Current.PaymentMethodID); var paymentSettings = PaySettingDetails.SelectSingle(Base.Document.Current.PaymentMethodID); // 仅当支付设置有效且激活时,执行自定义验证 if (paymentSettings != null && paymentSetup != null && paymentSetup.IsActive == true) { if (this.PayCurrentInvoice.Current != null && !string.Equals(this.PayCurrentInvoice.Current.PayStatus, KNPIConstants.PAID, StringComparison.OrdinalIgnoreCase)) { // 抛出异常直接中断流程,不会执行后续原释放方法 throw new PXException(KNPIMessages.NotPaid); } } } // 所有验证通过后,执行原Release逻辑 return Base.Release(adapter); }
关键修复点
- 替换原方法调用:用
Base.Release(adapter)替代Base.release.Press(adapter),确保重写方法的逻辑被正确执行,异常能有效拦截原流程。 - 统一逻辑结构:把原释放方法的调用放在所有验证逻辑之后,只有当所有自定义条件满足(或无需验证)时才执行释放;一旦抛出异常,代码直接中断,不会走到原方法调用步骤。
- 优化字符串比较:使用
StringComparison.OrdinalIgnoreCase替代ToUpper(),更高效还能避免PayStatus为null时的空引用风险。
修改后,当自定义验证不满足抛出异常时,原Release方法不会被执行,发票也就不会被释放;验证通过时则正常执行原释放逻辑。
内容的提问来源于stack exchange,提问作者Vivek
相关产品推荐
相关产品推荐

