报表文档修改缓慢-C#

2020-09-05 11:18发布

         点击此处--->   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"版本兼容的其他时间数字。

任何帮助将不胜感激!

         点击此处--->   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条回答
派大星 ヾ
1楼 · 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

骆驼绵羊
2楼-- · 2020-09-05 11:22

嗨,Igor,

我使用.NET对象模型进行类似的报表设计更新,但看不到速度问题。
我只是 计时了SaveAs()步骤,甚至不到一秒钟。

您确定只是计时了吗?

我是小鹏鹏啊
3楼-- · 2020-09-05 11:29

这已经知道很多年了。

您正在将苹果与橙子进行比较,RDC直接使用COM,.NET使用.NET框架。

解决方法是在应用打开时加载虚拟报表,以便预加载所有运行时 。

我们绝对无法加快速度,这就是它的方式...。

一周热门 更多>