报表文档修改缓慢-C#

2020-09-05 11:18发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)嗨, 在通过C#代码更改某些...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

在通过C#代码更改某些报告.rpt文件时,我们会遇到一些计时问题。

为了快速支持应用程序的多语言功能-我们的Windows桌面应用程序(C#)打开报告文件,循环访问所有报告部分(包括子报告),并翻译文本框,标签等中的文本。还完成了一些格式设置 (例如,基于地理区域/区域的日期格式)。 修改后的报告将重新保存在临时位置,并加载到CR Viewer中。

问题

与"旧" CRAXDDRT.dll相比,当前版本的报告修改需要额外的5-9秒。

此开销与报告的"首次"加载或报告文件的大小(无数据)无关。

数字非常一致。

环境

MS Visual Studio 2015

MS SQL Server 2014

SAP Crystal Reports 2011(版本14.0.6..1036RTM)-建立报告

应用程序框-Windows Server 2008 R2 Enterprise

用于.NET Framework(32位)的SAP Crystal Reports运行时引擎

用于.NET Framework(64位)的SAP Crystal Reports运行时引擎-sp17

所有应用程序盒都运行64位环境。

代码

================================================ ========================

旧版本:

CRAXDDRT.Report report = ...//一些报告对象

foreach(report.Sections中的CRAXDDRT.Section部分)

{

//以下功能可对当前节中的所有字段进行翻译和格式化

TranslateTextFields(部分)

TranslateNumericsAndDateTime(section)

//循环遍历当前节中的每个子报表(如果有的话),并替换每个字段对象和文本字段(如果需要,请设置格式)

foreach((Report.ReportObjects.OfType ()中的CRAXDDRT.SubreportObject子报表)

{

subReport = subreport.OpenSubreport();

foreach(subReport.Sections中的CRAXDDRT.Section subreportSection)

{

TranslateTextFields(subreportSection)

TranslateNumericsAndDateTime(subreportSection)

}

}

}

///将报告保存在临时位置

report.SaveAs(path,CRAXDDRT.CRReportFileFormat.crDefaultFileFormat);

================================================ ========================

在新版本中:

CrystalDecisions.CrystalReports.Engine.ReportDocument reportDocument = ...///一些报告对象

foreach(reportDocument.ReportDefinition.Sections中的CrystalDecisions.CrystalReports.Engine.Section eSection)

{

ReportDefModel.Section部分= reportClientDocument.ReportDefinition.FindSectionByName(eSection.Name);

TranslateNumericsAndDateTime(section);

TranslateTextFields(section);

}

//遍历所有子报表

///用公式替换每个可翻译的文本字段

//向每个数字字段添加公式

foreach(reportDocument.Subreports中的CrystalDecisions.CrystalReports.Engine.ReportDocument subReportDocument)

{

SubreportClientDocument subReportClientDocument = reportClientDocument.SubreportController.GetSubreport(subReportDocument.Name);

foreach(subReportDocument.ReportDefinition.Sections中的CrystalDecisions.CrystalReports.Engine.Section部分)

{

ReportDefModel.Section subReportSection =(ReportDefModel.Section)subReportClientDocument.ReportDefController.ReportDefinition.FindSectionByName(section.Name);

TranslateNumericsAndDateTime(subReportSection);

TranslateTextFields(subReportSection);

}

}

reportDocument.SaveAs(path,false);

================================================ ========================

问题/疑虑:

新代码中有两个瓶颈:

1。 foreach(reportDocument.ReportDefinition.Sections中的CrystalDecisions.CrystalReports.Engine.Section eSection)-访问集合

reportDocument.ReportDefinition。部分需要2-4秒。

*在"旧"版本中,获取子报告仅需200-300毫秒

2。 reportDocument.SaveAs(path,false); -需要2-3秒("旧"版本需要400-600毫秒)。

为什么要花比旧版本更长的时间? 这是由于新的Crystal具有更多的内置功能使其变得更重吗?

如前所述,目前我们仅处理空白报告文件; 将带有数据的报告加载到CR Viewer中没有速度问题。

与"旧CRAXDDRT"版本兼容的其他时间数字。

任何帮助将不胜感激!

3条回答
派大星 ヾ
2020-09-05 11:47 .采纳回答

嗨,伊藤,很遗憾,这是正确的计时步骤。 但是我发现访问子报表集合的解决方法:

foreach(eSection.ReportObjects.OfType ()中的SubreportObject subreportObject)

{

SubreportClientDocument subReportClientDocument = reportClientDocument.SubreportController.GetSubreport(subreportObject.SubreportName);

foreach(subReportClientDocument.ReportDefController.ReportDefinition.Areas中的ReportDefModel.Area区域)

{

foreach(CrystalDecisions.ReportAppServer.ReportDefModel.Section reportSection in area.Sections)

{

ReportDefModel.Section subReportSection = subReportClientDocument.ReportDefController.ReportDefinition.FindSectionByName(reportSection.Name);

TranslateSubReportSection(reportDocument,reportId,languageId,subReportClientDocument,subReportSection);

}

}

}

这将我们的开销时间减少了一半。

.SaveAs()对我们来说仍然是一个问题。

感谢您的答复

Igor

一周热门 更多>