Je suis confronté à un problème très problématique, dans l'application ASP.NET, après avoir visionné le même rapport plusieurs fois simultanément, j'ai cette exception:
La limite maximale de travaux de traitement de rapport configurée par votre système administrateur a été atteint.
Attendez, je sais qu'il existe une multitude de solutions, mais elles ne fonctionnent pas toutes avec moi.
Je mets ReportDocument.Close (); ReportDocument.Dispose (); dans l’événement CrystalReportViewer_Unload et lève toujours l’exception.
Private Sub CrystalReportViewer1_Unload(ByVal sender As Object, ByVal e As System.EventArgs) Handles CrystalReportViewer1.Unload
reportFile.Close()
reportFile.Dispose()
GC.Collect()
End Sub
Je modifie le registre PrintJobLimit dans HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\InprocServer
et HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\Server
à -1 même à 9999, et lève toujours l'exception.
Voici l'extrait de code où j'appelle mon rapport:
Table_Infos = New TableLogOnInfos()
Table_Info = New TableLogOnInfo()
Con_Info = New ConnectionInfo()
With Con_Info
.ServerName = ConfigurationManager.AppSettings("server_name")
.DatabaseName = ConfigurationManager.AppSettings("DB")
.UserID = user_name
.Password = pass_Word
.Type = ConnectionInfoType.SQL
.IntegratedSecurity = False
End With
Table_Info.ConnectionInfo = Con_Info
If Session("recpt_lang") = "Arabic" Then
reportFile.Load(Server.MapPath("/Reports/") & "collectrecpt_new_ar.rpt")
ElseIf Session("recpt_lang") = "English" Then
reportFile.Load(Server.MapPath("/Reports/") & "collectrecpt_new.rpt")
End If
For Each mytable In reportFile.Database.Tables
mytable.ApplyLogOnInfo(Table_Info)
Next
CrystalReportViewer1.ReportSource = reportFile
CrystalReportViewer1.SelectionFormula = Session("SelectionForumla")
CrystalReportViewer1 = Nothing
Je recommanderais de déplacer votre code close/dispose/gc.collect en dehors de ce processus de déchargement. En d'autres termes:
À mon avis, le contrôle du visualiseur n'est pas complètement fermé lorsque le rapport est en cours de nettoyage.
Le cristal est un processus très gourmand en mémoire et très pointilleux.
Vous devez supprimer votre instance de rapport après tout. Si vous supprimez le rapport après l'avoir montré, le message d'erreur "La limite maximale de travaux de traitement de rapport configurée par votre administrateur système a été atteinte".
Dim report1 As rptBill = clsBill.GetReport(billNumber)
rpt.Print()
'Cleanup the report after that!
rpt.Close()
rpt.Dispose()
Le document Crystal Report implémente l'interface IDisposable
. Il suffit donc de joindre l'instance du rapport à l'instruction using
. Il sera automatiquement fermé et supprimé une fois que l'instruction using
sera complétée. Vous pouvez écrire quelque chose comme ça:
using(var report = GetInvoiceReport())
{
// your logic here
}
ou (dépend de votre contexte):
using(var report = new ReportDocument())
{
// your logic here
}
Salutations Je suis trop tard pour avoir une réponse,. Toutes les réponses fonctionnent et j’ai vu, mais si vous rencontrez le même problème, veuillez vous rendre une fois dans le dossier TEMP du répertoire "windows" et supprimer toutes les instances. of crystal report . Je le dis parce que toute l'option ci-dessus fonctionnera mais que vous êtes toujours dans la portée maximale, supprimez tout d'abord toutes les instances puis appliquez toutes les suggestions ci-dessus . merci
Dans mon cas, le rapport avait 4 sous-rapports ...
Ce qui a résolu pour moi a été de changer la valeur de "PrintJobLimit", de 75 à 500, dans les chemins de Regedit suivants:
\ HKEY_LOCAL_MACHINE\LOGICIEL\WOW6432Node\SAP BusinessObjects\Crystal Reports pour .NET Framework 4.0\Serveur d'applications de rapport\InprocServer
\ HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\SAP BusinessObjects\Crystal Reports pour .NET Framework 4.0\Serveur d'applications de rapport\Server
Assurez-vous que vous utilisez le modèle Push pour afficher vos rapports. Ensuite, vous devez apporter un changement dans le registre de votre serveur: suivez le chemin:
"HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\InprocServer"
et vous verrez un élément "PrintJobLimit" et vous verrez que sa valeur par défaut est 75. cela signifie que le serveur ne peut gérer que 75 rapports à la fois. Ne vous inquiétez pas à ce sujet et modifiez simplement la valeur en -1
Vous devez Dispose
votre instance de rapport après tout. Si vous Dispose
le rapport après l'avoir montré, vous ne verrez jamais l'erreur:
La limite maximale de travaux de traitement de rapport configurée par votre administrateur système a été atteinte.
Code:
Dim report1 As rptBill = clsBill.GetReport(billNumber)
rpt.Print()
'Cleanup the report after that!
rpt.Close()
rpt.Dispose()
Je travaillais sur le serveur de rapports local. J'ai hébergé mon application Web dans un autre ordinateur. Quand j'ai eu une telle erreur, je viens de faireIISRESETet je vais bien maintenant.
Essayez ceci, cela pourrait vous aider.
Assurez-vous que l'utilisateur IIS dispose des droits suffisants pour supprimer les fichiers présents dans le dossier "c:/windows/temp".
Je suis confronté au même problème une fois que j'ai fourni les droits en écriture à ce dossier, puis le problème a été résolu.
J'ai fini par utiliser GC.WaitForPendingFinalizers en plus du GC.Collect, fermer et disposer. Je crois que ma page Web était peut-être en train de décharger et d’arrêter prématurément le traitement du fil avant que les ordures ne soient correctement traitées (vraiment?)
C'est sur Server 2012, SQL 2012, CR 13.0.2000.0
Voici mon code:
#Region "Cleanup"
Private Sub crCleanup(Optional blnForce As Boolean = False)
Try
' Crystal(code Is Not managed, i.e.it) 's COM interop => you have to manually
' release any objects instantiated. Make sure you set the ref to nothing and
' also call the dispose method if it has one.
' under some conditions, we don't want to destroy the ReportDocument (e.g. report page-to-page navigation)
If blnForce OrElse Me.blnPageHasFatalError OrElse (Not Me.CrystalUseCache) Then ' do not release when using cache! (unless forced)
If Not crReportDocument Is Nothing Then Me.crReportDocument.Close()
If Not crReportDocument Is Nothing Then Me.crReportDocument.Dispose()
If Not thisWebAppUser Is Nothing Then Me.thisWebAppUser.Dispose()
Me.thisWebAppUser.ClearReportCache() ' we are using HttpContext.Current.Cache.Item instead of sessions to save CR document
End If
' the rest of the items, we'll always want to clean up
If Not crParameterFieldDefinitions Is Nothing Then crParameterFieldDefinitions.Dispose()
If Not crParameterFieldDefinition Is Nothing Then crParameterFieldDefinition.Dispose()
crParameterFields = Nothing
crParameterField = Nothing
crParameterFieldName = Nothing
crParameterValues = Nothing
crParameterDiscreteValue = Nothing
crParameterDefaultValue = Nothing
crParameterRangeValue = Nothing
'
If Not crSections Is Nothing Then crSections.Dispose()
If Not crSection Is Nothing Then crSection.Dispose()
If Not crReportObjects Is Nothing Then crReportObjects.Dispose()
If Not crReportObject Is Nothing Then crReportObject.Dispose()
If Not crSubreportObject Is Nothing Then crSubreportObject.Dispose()
If Not crDatabase Is Nothing Then crDatabase.Dispose()
If Not crTables Is Nothing Then crTables.Dispose()
If Not crTable Is Nothing Then crTable.Dispose()
crLogOnInfo = Nothing
crConnInfo = Nothing
crDiskFileDestinationOptions = Nothing
ConnParam = Nothing
If Not subRepDoc Is Nothing Then subRepDoc.Dispose()
Catch ex As Exception
Me.thisWebAppUser.SendSysAdminMessage("Failed CR cleanup", ex.ToString)
End Try
' yes, use of the GC.Collect (and even more the GC.WaitForPendingFinalizers) is highly controversial
'
' the reality is that rendering crystal reports is rather slow compared to most web operations
' so it is expected that waiting for GC will have relatively little performance impact
' and will in fact, help tremendously with memory management.
'
' try setting these values to 1 and confirm for yourself by instantiating multiple crDocuments in different browsers if you don't believe it:
'
' HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\InprocServer
' HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\Server
'
' or google this error: The maximum report processing jobs limit configured by your system administrator has been reached
'
' I believe the problem is that on very fast servers, the page unloads and stops processing code to properly cleanup the Crystal Report objects
'
' This is done in 3 places:
' Report Viewer (Page_Unload and CrystalReportViewer1_Unload) rendering a report will of course always using a processing job
' Report Parameter Selector (Page_Unload) loading a crDocument without rendering a report still counts towards CR processing job limit.
' Custom Control crReportParameterSelectionTable (Public Overrides Sub dispose())
GC.Collect()
GC.WaitForPendingFinalizers()
End Sub
'***********************************************************************************************************************************
'
'***********************************************************************************************************************************
Private Sub Page_Unload(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Unload
'If Me.IsCallback Then Exit Sub ' the menutree causes callbacks, but we are not interested
crCleanup()
' response object not available here, so cannot redirect (such as in the case of XLS opeing in a separate window)
' if for some crazy reason there is STILL a crReportDocument, set it to nothing
' If Not crReportDocument Is Nothing Then Me.crReportDocument = Nothing
' Me.CrystalReportViewer1 = Nothing
End Sub
Private Sub CrystalReportViewer1_Unload(ByVal sender As Object, ByVal e As System.EventArgs) Handles CrystalReportViewer1.Unload
'If Me.IsCallback Then Exit Sub ' the menutree causes callbacks, but we are not interested
crCleanup()
End Sub
Je sais que ce fil est ancien, mais si vous configurez le paramètre "Recyclage ..." du pool d'applications pour le recycler, par exemple, 180 minutes au lieu de 1740 minutes (valeur par défaut), vous risquez de libérer des ressources.