Crystal Report 2013内存不足问题

2020-08-30 06:24发布

         点击此处--->   EasySAP.com群内免费提供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。 b__10(任务1 p)d:\ builds \ eic_main_systest \ products \ eic \ src\ reporting \ HistoricalReporting \ ReportEngine \ ReportEngineModule \ ViewModels \ ReportViewer.cs(562)

ContinuationTaskFromResultTask`1.InnerInvoke()上的

在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。

pmcapture.jpg (141.9 kB)

         点击此处--->   EasySAP.com群内免费提供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。 b__10(任务1 p)d:\ builds \ eic_main_systest \ products \ eic \ src\ reporting \ HistoricalReporting \ ReportEngine \ ReportEngineModule \ ViewModels \ ReportViewer.cs(562)

ContinuationTaskFromResultTask`1.InnerInvoke()上的

在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。

pmcapture.jpg (141.9 kB)
付费偷看设置
发送
5条回答
xfwsx85
1楼 · 2020-08-30 06:59.采纳回答

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

Bunny_CDM
2楼-- · 2020-08-30 06:51

感谢您提供详细信息。

我想在这里更新以下内容:

1。 我们正在运行报告的系统上有足够的磁盘空间(> 25 GB)。 甚至清除了所有临时文件,没有运气。

2。 我们正在使用单一连接-此报告通过存储过程(SP)获取数据,并且SP返回单个结果集。 所有加入都发生在SP本身中。

3。 该报告的精选专家中没有任何内容。

4。 是的,该报告在出现故障时仅针对极少的大数据(3个月)运行。 运行包含1个月数据的报告运行良好。 在此数据上,调用了许多求和和聚合函数。 那是问题所在吗? Crystal Report 2013在处理大数据方面是否存在任何已知限制? SAP的任何官方知识库或注释都将对您有所帮助。

谢谢!

Sanjoy。

风早神人
3楼-- · 2020-08-30 07:00

您正在使用SP 9,我们现在使用的是SP 25,因此本周应该发布26 ...

查看升级是否可以解决问题,并在更新应用程序时阅读SP 21的所有信息。

https: //wiki.scn.sap.com/wiki/display/BOBJ/Crystal+Reports%2C+Developer+for+Visual+Studio+Downloads

樱桃小丸子0093
4楼-- · 2020-08-30 07:09

Hi Don,

感谢补丁详细信息。 我已将补丁升级到最新版本:

很遗憾,现在没有报告在运行。 CR本身会引发以下错误:

[错误] ReportViewer.RefreshReport:顶级异常类型= System.Runtime.InteropServices.COMException源= clientdoc.dll消息=文档尚未打开。 StackTrace:位于CrystalDecisions.ReportAppServer.ReportClientDocumentWrapper.set_ReportAppServer(String值)的CrystalDecisions.ReportAppServer.ClientDoc.ReportClientDocumentClass.set_ReportAppServer(String pbsVal)的CrystalDecisions.CrystalReports.Engine.ReportDocument.Initialize()的CrystalDecisions.CrystalReports.Engine。 d:\ builds \ eic_main_systest \ products \ eic \ src\ reporting \ HistoricalReporting \ ReportEngine \ ReportEngineModule \ Views中的ININ.Reporting.Historical.Engine.Module.ViewModels.CrystalReportsViewerControl..ctor中的ctor(ReportData reportData,CancellationTokenSource tokenSource) \ CrystalReportsViewerControl.cs:第29行位于ININ.Reporting.Historical.Engine.Module.ViewModels.ViewerControl.GetViewerControl(ReportData reportData,CancellationTokenSource tokenSource,Action refreshAction)在d:\ builds \ eic_main_systest \ products \ eic \ src\ reporting \ HistoricalReporting \ ReportEngine \ ReportEngineModule \ ViewModels \ ViewerControl.cs:ININ.Reporting.Historical的第39行。 d:\ builds \ eic_main_systest \ products \ eic \ src\ reporting \ HistoricalReporting \ ReportEngine \ ReportEngineModule \ ViewModels \ ReportViewer.cs:line 511 StackTrace:在ReportViewer.RefreshReport()d中的Engine.Module.ViewModels.ReportViewer.RefreshReport() :\ Builds \ eic_main_systest \ products \ eic \ src\ reporting \ HistoricalReporting \ ReportEngine \ ReportEngineModule \ ViewModels \ ReportViewer.cs(583)at ReportViewer.SwitchReportView()d:\ builds \ eic_main_systest \ products \ eic \ src\ reporting \ HistoricalReport 在ReportViewer.Execute处的\ ReportEngine \ ReportEngineModule \ ViewModels \ ReportViewer.cs(207)(字符串commandName,Object context)d:\ builds \ eic_main_systest \ products \ eic \ src\ reporting \ HistoricalReporting \ ReportEngine \ ReportEngineModule \ ViewModels \ ReportViewer.cs (967)在ReadOnlyContextSensitiveCommandsProvider.Execute(String commandName,Object context)d:\ builds \ eic_main_systest \ products \ eic \ src\ Cafe \ Library \ Commands \ SupportedOperations.cs(101)在AssociatedWithActiveContentViewBehavior.Execute(ICommandItem因此 urceCommandItem,对象上下文)d:\ Builds \ eic_main_systest \ products \ eic \ src\ Cafe \ Interface \ Content \ ContentBehaviors.cs(639)at CommandItem.ININ.Cafe.Interface.Commands.ICommandItem.ExecuteCommand(Object context)d: \ builds \ eic_main_systest \ products \ eic \ src\ Cafe \ Library \ Commands \ CommandItem.cs(352)在CommandItem.ININ.Cafe.Library.Commands.ICommandExecutorInternal.ExecuteCommand(Object context)d:\ builds \ eic_main_systest \ products \ WpfUISite.System.Windows.Input.ICommand.Execute上的eic \ src\ Cafe \ Library \ Commands \ CommandItem.cs(364)(Object param)d:\ builds \ eic_main_systest \ products \ eic \ src\ Cafe \ Library.Wpf \ Commands \ UISites \ Wpf \ Controls \ WpfUISite.cs(309)在CommandHelpers.CriticalExecuteCommandSource(ICommandSource commandSource,Boolean userInitiated)在ButtonBase.OnClick()在Button.OnClick()在ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)在UIElement.OnMouseLeftButtonUpThunk (Object sender,MouseButtonEventArgs e)在MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandl) er,在RoutedEventArgs.InvokeHandler(代理处理程序,对象目标)处的对象GenericTarget)在EventRoute.InvokeHandlersImpl(对象源,RoutedEventArgs args,布尔值重新引发)处的RoutedEventHandlerInfo.InvokeHandler(对象目标,RoutedEventArgs routedEventArgs),在UIElement.ReRaiseEvents,Send args,UIElement.OnMouseUpThunk(Object sender,MouseButtonEventArgs e)处的RoutedEvent newEvent)在RoutedEventArgs.InvokeHandler(Delegate handler,Object target)在RoutedEventHandlerInfo.InvokeHandler(Delegate handler,Object target)处在MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler,Object genericTarget)中 UIElement处的EventRoute.InvokeHandlersImpl(Object source,RoutedEventArgs args,Boolean reRaised)UIElement.RaiseTrustedEvent(RoutedEventArgs args)处的UIElement.RaiseTrustedEvent(RoutedEventArgs args)处的UIElement.RaiseEvent(RoutedEventArgs args,布尔值受信任的) 输入项 HwndMouseInputProvider.FilterMessage(IntPtr)的Manager.ProcessInput(InputEventArgs输入)在HwndMouseInputProvider.ReportInput(IntPtr hwnd,InputMode模式,Int32时间戳,RawMouseActions操作,Int32 x,Int32 y,Int32滚轮)在InputProviderSite.ReportInput(InputReport inputReport) 在HwndSource.InputFilterMessage(IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam,布尔值和处理)处的msg,IntPtr wParam,IntPtr lParam,布尔值和已处理)在HwndWrapper.WndProc(IntPtr Hwnd,IntPtr wwnd, )在HwndSubclass.DispatcherCallbackOperation(Object o)在ExceptionWrapper.InternalRealCall(Delegate回调,Object args,Int32 numArgs)在ExceptionWrapper.TryCatchWhen(对象源,委托回调,Object args,Int32 numArgs,DelevatchHandler优先级在DispatcherIl ,TimeSpan超时,委托方法,对象参数,Int32 numArgs)位于HwndSubclass.SubclassWndProc(IntPtr hwnd,Int32 msg,IntP 在UnsafeNativeMethods.CallWindowProc(IntPtr wndProc,IntPtr hWnd,Int32 msg,IntPtr wParam,IntPtr lParam)处的tr wParam,IntPtr lParam)在NativeWindow.DefWndProc(Message&m)处的Int32 msg,IntPtr wParam,IntPtr lParam)。 at NativeWindow.Callback(IntPtr hWnd,Int32 msg,IntPtr lparam,IntPtr lparam)在NativeWindow.DefWndProc(Message&m)在NativeWindow.WndProc(Message&m)在NativeWindow.Callback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam) WpfShellImplementation处的UnsafeNativeMethods.DispatchMessage(MSG&msg)处的Dispatcher.PushFrameImpl(DispatcherFrame框架)Dispatcher.PushFrame(DispatcherFrame框架)Application.RunDispatcher(对象ignore)处Application.RunInternal(Window窗口) .ShowAndRun()d:\ builds \ eic_main_systest \ products \ eic \ src\ Cafe \ Library.Wpf \ WpfShellImplementation.cs(72)at CafeApplication.Run()d:\ builds \ eic_main_systest \ products \ eic \ src\ Cafe \ S处的Library \ CafeApplication.cs(203) ShellApplication.Main()处的hellApplication.RunApp()

我想念什么吗?

谢谢!

Sanjoy。

木偶小白
5楼-- · 2020-08-30 06:57

不要将CR运行时复制到\ Bin文件夹中。 应该将它们从GAC添加到您的项目中,而不要浏览到它们。

一周热门 更多>