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

Acumatica中重写PO录入界面“Email Purchase Order”动作时弹窗异常问题排查

问题分析与解决方案

第一个问题:弹窗反复显示的原因

你最初的代码里,当用户点击"No"时返回了adapter.Get(),这是问题的核心。在Acumatica的Action处理逻辑中,返回adapter.Get()会告诉系统“继续执行当前Action的后续流程”,这就导致整个Notification方法被反复调用,弹窗自然会一直弹出来,直到你点击关闭按钮中断流程。

正确的做法是返回空的结果集,明确告知系统终止当前Action的执行,而不是返回适配器的数据源。

第二个问题:弹窗不显示的原因

你更新后的代码有两个潜在问题:

  1. 调用Base.notification.Press(adapter)时没有传递notificationCD参数,原通知Action需要这个参数来确定要执行哪条通知规则,缺少它会导致逻辑不触发。
  2. 直接重新定义notification Action可能和系统原有的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 23:32:30