En essayant de garder cela court: notre personnel d'expédition utilise un scanner de codes à barres Windows Mobile pour scanner les numéros de série des articles expédiés sur les commandes des clients. Ces données sont envoyées via le service Web asmx et un rapport est automatiquement imprimé sur une imprimante en réseau affichant les informations client et les détails des articles expédiés. Tout cela se passe dans un environnement intranet. Jusqu'à récemment, j'utilisais le moteur de rapport Microsoft intégré dans Visual Studio (fichiers .rdlc) pour générer les rapports et le code here pour imprimer sans intervention de l'utilisateur. Cela a bien fonctionné pendant plusieurs années.Astuces pour le débogage probable Crystal Reports se bloque dans ASP.NET
Récemment, j'ai rencontré certaines limitations de mise en forme de rapports dans MS Reports et implémenté les rapports dans Crystal Reports (10.5.3700) à la place. Le code fonctionne correctement, mais après l'exécution en production pendant quelques heures à un jour ou plus, le processus de travail asp.net est suspendu (pas sûr si c'est le terme approprié). Le processus de génération/impression de rapports s'exécute pour toujours sans émettre d'exception. Le recyclage de l'AppPool fait que tout fonctionne à nouveau pendant un moment.
Les rapports utilisent le mode «push» où le rapport reçoit un jeu de données typé plutôt que d'accéder à la base de données elle-même. Pour extraire la méthode CR ReportDocument.PrintToPrinter() de l'équation, j'ai envisagé d'exporter les rapports générés vers PDF ou similaire, puis d'imprimer le fichier résultant de manière indépendante. Mais je n'ai pas encore trouvé un excellent moyen de le faire.
En étudiant le problème, j'ai lu toutes sortes de plaintes à propos du buggy-ness de Crystal, mais j'espère qu'il y aura un bug dans mon code concernant le nettoyage après l'impression du rapport.
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.ReportAppServer
Imports CrystalDecisions.Shared
Public Class CrystalReport
Private _report As ReportDocument
Public Sub New(ByVal Path As String)
_report = New ReportDocument()
_report.Load(Path)
End Sub
Public Sub SetDatasource(ByVal DataSet As DataSet)
_report.SetDataSource(DataSet)
End Sub
Public Sub AddParameter(ByVal Name As String, ByVal Value As Object)
Dim crParameterFieldDefinitions As ParameterFieldDefinitions = _report.DataDefinition.ParameterFields
Dim crParameter1 As ParameterFieldDefinition = crParameterFieldDefinitions.Item(Name)
Dim parameterValue As CrystalDecisions.Shared.ParameterDiscreteValue = New CrystalDecisions.Shared.ParameterDiscreteValue()
parameterValue.Value = Value
crParameter1.CurrentValues.Add(parameterValue)
crParameter1.ApplyCurrentValues(crParameter1.CurrentValues)
End Sub
Public Sub Print(ByVal PrinterPath As String)
_report.PrintOptions.PrinterName = PrinterPath
_report.PrintToPrinter(1, True, 0, 0)
Close()
End Sub
Private Sub Close()
_report.Close()
_report.Dispose()
_report = Nothing
End Sub
End Class
Des idées pour le débogage plus loin? Je n'ai jamais eu à recourir au vrai débogage de Windows (WinDbg, Process Explorer, etc.), donc toute recommandation sur l'outil de débogage à essayer en premier serait géniale.
Merci.
Ce code est appelé à partir d'un service Web asmx plutôt que d'une page ASP.NET, de sorte que la suggestion Page_Unload n'est pas directement applicable dans ce cas. Pour se rapprocher de l'idée Page_Unload, je suppose que je pourrais exposer l'objet _report au code appelant et appeler Close() et Dispose() à partir de là, mais je ne vois pas pourquoi cela devrait fonctionner. Je vais jouer avec la clé de registre PrintJobLimit pour essayer de voir si c'est la bonne zone générale. Merci. –
Je ne pense pas que l'exposition de l'objet dans ce cas fonctionnerait - comme vous l'avez dit. J'ai dû résoudre quelques problèmes de CR méchants avant (DLL-enfer, nombres mystérieux de message d'erreur qui ne sont pas documentés). Désolé, je ne pourrais pas être plus utile. J'espère que vous l'avez compris. –
C'est juste utile d'avoir une autre paire d'yeux dessus - merci. –