点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)问候! 目前,我正在处理一位客...
点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)问候! 目前,我正在处理一位客...
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
问候!
目前,我正在处理一位客户的问题。 该问题是Crystal Report 2013内存不足的问题。 以下是问题的详细信息:
我们的客户针对中等大小的MS SQL Server数据库运行了3个月(最后一个季度)的报告。 他们遇到以下错误:
[错误] ReportViewer.RefreshReport:RunReport期间发生异常。 Cancelled = False
最高例外
Type = System.Runtime.InteropServices.COMException
Source = rptcontrollers.dll
Message = 没有足够的内存用于操作。
StackTrace:
at CrystalDecisions.ReportAppServer.Controllers.ReportSourceClass.GetLastPageNumber(RequestContext pRequestContext)
at CrystalDecisions.ReportSource.EromReportSourceBase.GetLastPageNumber(ReportPageRequestContext reqContext)
,位于CrystalDecisions.CrystalReports.Engine.FormatEngine.GetLastPageNumber(ReportPageRequestContext reqContext)
d中的ININ.Reporting.Historical.Engine.Module.ViewModels.CrystalReportsViewerControl.RunReport()上的cs:125行
在System.Threading.Tasks.Task`1.InnerInvoke()
在System.Threading.Tasks.Task.Execute()
StackTrace:
在<> c__DisplayClass16。 em>
at AggregateException.Handle(Func`2谓词)
在ReportViewer。
在Task.Execute()上
在Task.ExecutionContextCallback(Object obj)
在ExecutionContext.RunInternal(ExecutionContext执行上下文,ContextCallback回调,对象状态,布尔值saveSyncCtx)
在ExecutionContext.Run(ExecutionContext执行上下文,ContextCallback回调,对象状态,布尔值saveSyncCtx)
在Task.ExecuteWithThreadLocal(Task&currentTaskSlot)
在Task.ExecuteEntry(布尔值bPreventDoubleExecution)
在SynchronizationContextTaskScheduler.PostCallback(Object obj)
在ExceptionWrapper.InternalRealCall(委托回调,对象args,Int32 numArgs)
在ExceptionWrapper.TryCatchWhen(对象源,委托回调,对象args,Int32 numArgs,委托catchHandler)
在DispatcherOperation.InvokeImpl()
在DispatcherOperation.InvokeInSecurityContext(对象状态)
在ExecutionContext.RunInternal(ExecutionContext执行上下文,ContextCallback回调,对象状态,布尔值saveSyncCtx)
在ExecutionContext.Run(ExecutionContext执行上下文,ContextCallback回调,对象状态,布尔值saveSyncCtx)
在ExecutionContext.Run(ExecutionContext执行上下文,ContextCallback回调,对象状态)
在CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext执行上下文,ContextCallback回调,对象状态)
在DispatcherOperation.Invoke()
在Dispatcher.ProcessQueue()
在Dispatcher.WndProcHook(IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam,布尔值和已处理)
HwndWrapper.WndProc中的(IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam,布尔值和已处理)
HwndSubclass.DispatcherCallbackOperation(Object o)上的
在ExceptionWrapper.InternalRealCall(委托回调,对象args,Int32 numArgs)
在ExceptionWrapper.TryCatchWhen(对象源,委托回调,对象args,Int32 numArgs,委托catchHandler)
位于Dispatcher.LegacyInvokeImpl(DispatcherPriority优先级,TimeSpan超时,Delegate方法,对象args,Int32 numArgs)
HwndSubclass.SubclassWndProc上的(IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam)
在UnsafeNativeMethods.DispatchMessage(MSG&msg)
在Dispatcher.PushFrameImpl(DispatcherFrame frame)
在Dispatcher.PushFrame(DispatcherFrame frame)
在Application.RunDispatcher(对象忽略)
在Application.RunInternal(窗口窗口)
在Application.Run(窗口窗口)
at WpfShellImplementation.ShowAndRun()d:\ builds \ eic_main_systest \ products \ eic \ src\ Cafe \ Library.Wpf \ WpfShellImplementation.cs(72)
CafeApplication.Run()上的d:\ builds \ eic_main_systest \ products \ eic \ src\ Cafe \ Library \ CafeApplication.cs(203)
在ShellApplication.RunApp()
在ShellApplication.Main()
我们也可以使用其数据库在本地测试环境中重现该问题。 我们已经用16 GB的内存测试了该报告,但是运行Crystal Report的应用程序在可用内存下就很好了。
我们还测试了数据库查询,结果如下:
进一步调查该问题,我们尝试搜索有关该错误的一些内容,发现此链接表明,作为32位应用程序,Crystal Report在任何给定时间点只能访问大约2GB的RAM。 我们的Crystal Report版本是13.0.9.1312:
无法运行的报告具有不同组的聚合/求和公式。 如果运行时间较短(<30天),则此报告运行良好。
CR2013在处理具有不同组的聚合/求和公式的大数据集时是否有任何限制? 感谢您为解决此问题提供的帮助。
谢谢!
Sanjoy。
Crystal的"内存"实际上是两件事之一-RAM或磁盘空间。 Crystal不会使用Windows交换空间,而是会创建自己的临时文件,这些文件将被命名为"〜* .rpt"或"〜* .tmp"。 另外,当报表抛出这样的错误时,Crystal不会删除该文件进行清理。 因此,如果磁盘空间不足,那将使情况变得更糟。
报表设计中可能会发生某些事情,这些事情也会使Crystal使用更多的内存。 其中一些是:
-在报表中使用多个连接-跨数据库连接。 Crystal将从每个连接中提取数据,然后将其加入内存。 必要时,我通常会尝试在一个数据库中创建一个视图,该视图将链接到另一个数据库以从那里获取数据,以便联接发生在数据库中,而不是在Crystal中。
- 在Select Expert中使用Crystal函数。 Crystal将再次将所有数据拉入内存并在那里进行过滤。 我通常尝试创建一个SQL表达式,该表达式将在数据库中执行相同的操作,并在select Expert中使用它,而不是使用Crystal函数。
-在Select Expert中使用If语句。 Crystal不能总是将它们解析为SQL,因此它将把数据存储到内存中并在其中进行过滤。 有许多方法可以编写布尔表达式而不是使用If语句,从而使Crystal可以更轻松地将它们解析为SQL。
-运行大量数据的报告。 如果您需要显示细节,则无法解决。 但是,如果仅显示摘要,则最好使用Command(SQL Select语句),以便摘要出现在数据库中而不是在Crystal中。 有关使用命令的更多信息,请参见 https://blogs.sap.com/2015/04/01/best-practices-when-using-commands-with-crystal-reports/。
-Dell
一周热门 更多>