Acumatica中重写PO录入界面“Email Purchase Order”动作时弹窗异常问题排查
问题分析与解决方案
第一个问题:弹窗反复显示的原因
你最初的代码里,当用户点击"No"时返回了adapter.Get(),这是问题的核心。在Acumatica的Action处理逻辑中,返回adapter.Get()会告诉系统“继续执行当前Action的后续流程”,这就导致整个Notification方法被反复调用,弹窗自然会一直弹出来,直到你点击关闭按钮中断流程。
正确的做法是返回空的结果集,明确告知系统终止当前Action的执行,而不是返回适配器的数据源。
第二个问题:弹窗不显示的原因
你更新后的代码有两个潜在问题:
- 调用
Base.notification.Press(adapter)时没有传递notificationCD参数,原通知Action需要这个参数来确定要执行哪条通知规则,缺少它会导致逻辑不触发。 - 直接重新定义
notificationAction可能和系统原有的Action产生冲突,优先推荐使用PXOverride来扩展原有逻辑,而不是重新定义。
修正后的代码示例
下面是结合两种场景的正确实现,既解决弹窗循环问题,又确保确认框正常显示:
public delegate IEnumerable NotificationDelegate(PXAdapter adapter, string notificationCD); [PXOverride] public IEnumerable Notification(PXAdapter adapter, string notificationCD, NotificationDelegate baseMethod) { // 只针对采购订单的邮件通知触发确认弹窗(注意匹配系统中实际的notificationCD值) if (string.Equals(notificationCD, "PURCHASE ORDER", StringComparison.OrdinalIgnoreCase)) { WebDialogResult result = Base.Document.Ask( "Are you sure you want to Email the PO?", MessageButtons.YesNo, MessageIcon.Question); if (result != WebDialogResult.Yes) { // 返回空集合,终止Action执行,避免循环调用 return Enumerable.Empty<POOrder>(); } } // 用户确认后,执行原有的通知逻辑 return baseMethod(adapter, notificationCD); }
关键说明:
- 使用
Enumerable.Empty<POOrder>()替代adapter.Get():直接终止Action流程,不会触发重复调用。 - 增加
notificationCD的精准判断:确保只有目标通知动作才会弹出确认框,不影响其他通知功能。 - 忽略大小写的字符串比较:避免系统中通知代码大小写不一致导致判断失效。
- 明确指定弹窗图标:提升用户体验,让确认框更直观。
内容的提问来源于stack exchange,提问作者Scott S
相关产品推荐
相关产品推荐

