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

