2010-02-03 5 views
1

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.

Répondre

0

Il semble que le rapport ne soit pas publié, bien qu'en regardant votre code, vous pensiez que vous faites exactement cela.

Vous pouvez essayer Close() ing et Dispose() de votre objet de rapport sur l'événement Page_Unload de votre page ASP.NET. This forum post sur les forums Microsoft ASP.NET parle d'un problème où le nombre maximal de tâches de traitement de rapports est atteint, mais j'imagine que le problème pourrait être lié.

+0

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. –

+0

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. –

+0

C'est juste utile d'avoir une autre paire d'yeux dessus - merci. –