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

Acumatica 24R2批量打印工单报表合并失效问题求助

问题:Acumatica 24R2批量打印工单报表仅输出首个文档

在Acumatica处理界面调用销售订单(SO301000)的自定义动作,意图将多个销售订单关联的自定义工单报表(PS652000)合并为单个PDF,但选择多个订单时仅第一个文档被输出,其余未合并。该动作在销售订单界面正常,仅处理界面失效,且24R2版本前功能正常。调试确认代码遍历了所有选中文档,但合并逻辑失效。

动作代码如下:

public PXAction<SOOrder> printworkorder;
[PXUIField(DisplayName = "Print Job Order", MapEnableRights = PXCacheRights.Select)]
[PXButton(DisplayOnMainToolbar = false)]
protected virtual IEnumerable printWorkorder(PXAdapter adapter)
{
    PSConfigReportMapping mapping = PXSelect<PSConfigReportMapping, Where<PSConfigReportMapping.jobType, Equal<Required<PSConfigReportMapping.jobType>>>>.Select(Base, "S");
    PSConfig crow = PXSelect<PSConfig>.Select(Base);

    string reportID = "PS652000";
    List<SOOrder> list = adapter.Get<SOOrder>().ToList();
    if (list.Count > 0)
    {
        Base.Save.Press();
        Dictionary<string, string> parameters = new Dictionary<string, string>();
        string actualReportID = null;

        PXReportRequiredException ex = null;
        Dictionary<PX.SM.PrintSettings, PXReportRequiredException> reportsToPrint = new Dictionary<PX.SM.PrintSettings, PXReportRequiredException>();
        foreach (SOOrder order in list)
        {
            parameters = new Dictionary<string, string>();
            parameters["OrderType"] = order.OrderType;
            parameters["OrderNbr"] = order.OrderNbr;
            parameters["JobCode"] = null;
            parameters["PONumber"] = null;

            object cstmr = PXSelectorAttribute.Select<SOOrder.customerID>(Base.Document.Cache, order);
            actualReportID = new NotificationUtility(Base).SearchCustomerReport(reportID, order.CustomerID,
                    order.BranchID);
            ex = PXReportRequiredException.CombineReport(ex, actualReportID, parameters, OrganizationLocalizationHelper.GetCurrentLocalization(Base));
            ex.Mode = PXBaseRedirectException.WindowMode.New;
            reportsToPrint = PX.SM.SMPrintJobMaint.AssignPrintJobToPrinter(reportsToPrint, parameters,
                adapter, new NotificationUtility(Base).SearchPrinter, SONotificationSource.Customer,
                reportID, actualReportID, order.BranchID, OrganizationLocalizationHelper.GetCurrentLocalization(Base));
            actualReportID = null;
        }
        if (ex != null)
        {
            Base.LongOperationManager.StartAsyncOperation(async ct =>
            {
                await PX.SM.SMPrintJobMaint.CreatePrintJobGroups(reportsToPrint, ct);
                throw ex;
            });
        }
    }
    return adapter.Get();
}

排查与修复建议

  • 验证CombineReport合并逻辑:24R2版本可能更新了PXReportRequiredException.CombineReport的内部处理逻辑,每次循环后检查ex的Reports集合,确认后续订单的报表参数是否被正确添加。同时确保actualReportID未返回null,空值会导致合并中断。
  • 调整异步操作的异常抛出时机:当前代码在异步任务中抛出合并后的异常,24R2的异步上下文异常处理可能有变更。尝试将异常抛出移至主线程,确保合并后的报表集合完整传递:
    if (ex != null)
    {
        ex.Mode = PXBaseRedirectException.WindowMode.New;
        Base.LongOperationManager.StartAsyncOperation(async ct =>
        {
            await PX.SM.SMPrintJobMaint.CreatePrintJobGroups(reportsToPrint, ct);
        });
        throw ex;
    }
    
  • 修复处理界面的缓存上下文:处理界面的PXAdapter上下文与销售订单界面不同,循环时手动将当前订单设置为缓存的当前记录,确保报表生成时能获取正确的上下文:
    foreach (SOOrder order in list)
    {
        Base.Document.Current = order;
        // 后续参数设置与报表合并逻辑
    }
    
  • 简化打印作业组逻辑:暂时注释reportsToPrint相关代码,仅保留CombineReport和抛出异常的逻辑,验证是否能正常合并PDF。若正常,再逐步排查SMPrintJobMaint.CreatePrintJobGroups在24R2中的行为变更。
  • 启用报表日志排查:在系统偏好设置中开启报表日志,查看每个订单的报表生成记录,确认后续订单的报表是否被生成但未合并,或根本未触发生成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:23:30