使用PX.Reports函数时报表排序不可用,如何恢复原始排序?
恢复PX.Reports报表原始排序的解决方法
问题描述
使用PX.Reports函数生成SO643000报表时,排序功能失效,需要恢复报表设计时的原始排序规则,当前使用的代码如下:
Dictionary<String, String> parameters = new Dictionary<String, String>(); parameters["ARInvoice.DocType"] = Base.Document.Current.DocType; parameters["ARInvoice.RefNbr"] = Base.Document.Current.RefNbr; PXReportSettings settings = new PXReportSettings("SO643000"); PX.Reports.Controls.Report report = ReportLoader.CheckIfNull(nameof(ReportLoader)).LoadReport("SO643000", null); ReportLoader.InitReportParameters(report, parameters, settings, false); PX.Reports.Data.ReportNode reportNode = ReportDataBinder.CheckIfNull(nameof(ReportDataBinder)).ProcessReportDataBinding(report);
问题原因
直接通过ReportLoader和ReportDataBinder手动处理报表绑定的流程,容易丢失报表设计器中配置的原始排序规则——该流程未完整继承报表预设的数据处理逻辑。
解决方法
方法1:使用PXReportTools完整加载报表设置
通过PXReportTools工具类加载报表,确保保留设计时的排序、过滤等配置,修改后的代码如下:
Dictionary<String, String> parameters = new Dictionary<String, String>(); parameters["ARInvoice.DocType"] = Base.Document.Current.DocType; parameters["ARInvoice.RefNbr"] = Base.Document.Current.RefNbr; // 加载报表的原始设置 PXReportSettings settings = PXReportTools.LoadReportSettings("SO643000", null); // 注入参数 foreach (var param in parameters) { if (settings.ReportParameters.ContainsKey(param.Key)) { settings.ReportParameters[param.Key].Value = param.Value; } } // 基于保留原始设置的配置加载报表 PX.Reports.Controls.Report report = PXReportTools.LoadReport("SO643000", settings); // 可选:若仍未恢复,可手动指定排序规则(替换为报表设计时的原始排序字段) foreach (var dataSource in report.DataSources) { // 示例:按DocType升序、RefNbr升序排序 dataSource.Sorting = "ARInvoice.DocType ASC, ARInvoice.RefNbr ASC"; } // 处理数据绑定 PX.Reports.Data.ReportNode reportNode = ReportDataBinder.CheckIfNull(nameof(ReportDataBinder)).ProcessReportDataBinding(report);
方法2:使用PXReportViewer加载报表(推荐)
PXReportViewer会自动维护报表的原始配置(包括排序规则),无需手动处理设置,代码示例:
Dictionary<String, String> parameters = new Dictionary<String, String>(); parameters["ARInvoice.DocType"] = Base.Document.Current.DocType; parameters["ARInvoice.RefNbr"] = Base.Document.Current.RefNbr; PXReportViewer reportViewer = new PXReportViewer(); reportViewer.ReportID = "SO643000"; reportViewer.Parameters = parameters; reportViewer.LoadReport(); // 获取处理后的报表节点 PX.Reports.Data.ReportNode reportNode = reportViewer.ReportNode;
额外检查
- 先确认SO643000报表在设计器中的排序配置是否正确:打开报表设计界面,检查数据源的Sorting属性是否设置了原始排序规则。
- 确保参数注入过程中没有覆盖或清除数据源的排序条件。
内容的提问来源于stack exchange,提问作者Xavier LARTEM
相关产品推荐
相关产品推荐

