点击此处---> 群内免费提供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
{
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"版本兼容的其他时间数字。
任何帮助将不胜感激!
嗨,伊藤,很遗憾,这是正确的计时步骤。 但是我发现访问子报表集合的解决方法:
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
嗨,Igor,
我使用.NET对象模型进行类似的报表设计更新,但看不到速度问题。
我只是 计时了SaveAs()步骤,甚至不到一秒钟。
您确定只是计时了吗?
这已经知道很多年了。 p>
您正在将苹果与橙子进行比较,RDC直接使用COM,.NET使用.NET框架。
解决方法是在应用打开时加载虚拟报表,以便预加载所有运行时 。
我们绝对无法加快速度,这就是它的方式...。
唐
一周热门 更多>