VB.NET

Ouvrir un fichier de rapport Crystal Reports en VB.NET

Crystal Reports est un outil puissant pour générer des rapports. Si vous utilisez VB.NET, il est possible d’intégrer Crystal Reports pour afficher, manipuler et exporter des rapports directement dans votre application.


Prérequis

  1. Visual Studio :
    • Installez une version compatible avec Crystal Reports.
  2. Crystal Reports Runtime :
    • Téléchargez et installez le runtime de Crystal Reports correspondant à votre architecture (32 ou 64 bits).
  3. Bibliothèque Crystal Reports :
    • Assurez-vous que le package CrystalDecisions.CrystalReports.Engine est ajouté à votre projet.

Étape 1 : Ajouter un fichier de rapport Crystal Reports

  1. Créer un rapport Crystal Reports :
    • Dans Visual Studio, ajoutez un nouveau fichier .rpt à votre projet.
    • Configurez la source de données (base de données, dataset, etc.).
    • Conceptionnez le rapport en ajoutant des champs, groupes, sections, etc.
  2. Ajouter une référence aux bibliothèques Crystal Reports :
    • Cliquez droit sur le projet > Ajouter une Référence > Parcourir.
    • Sélectionnez les DLL suivantes, généralement situées dans le dossier Crystal Reports :
      • CrystalDecisions.CrystalReports.Engine
      • CrystalDecisions.ReportSource
      • CrystalDecisions.Shared
      • CrystalDecisions.Web
      • CrystalDecisions.Windows.Forms

Étape 2 : Interface Utilisateur

Pour afficher le rapport dans une application Windows Forms, vous devez ajouter un CrystalReportViewer à votre formulaire.

  1. Ajoutez un contrôle CrystalReportViewer :
    • Depuis l’onglet Boîte à outils, recherchez CrystalReportViewer.
    • Faites glisser le contrôle sur votre formulaire (Form1).

Étape 3 : Charger et Afficher un Rapport

Ajoutez le code pour charger et afficher le rapport dans votre formulaire.

Exemple de Code Complet

Voici un exemple de code pour ouvrir et afficher un rapport Crystal Reports dans une application Windows Forms :

Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Try
            ' Créer une instance du rapport
            Dim reportDocument As New ReportDocument()

            ' Chemin du fichier Crystal Report (.rpt)
            Dim reportPath As String = "C:\Chemin\Vers\VotreRapport.rpt"
            reportDocument.Load(reportPath)

            ' Configuration de la source de données (si nécessaire)
            Dim connectionInfo As New ConnectionInfo()
            connectionInfo.ServerName = "NomServeur"   ' Nom du serveur ou chemin du fichier
            connectionInfo.DatabaseName = "NomBaseDeDonnees" ' Nom de la base de données
            connectionInfo.UserID = "VotreUtilisateur"       ' Identifiant utilisateur
            connectionInfo.Password = "VotreMotDePasse"      ' Mot de passe utilisateur

            ' Appliquer les informations de connexion à toutes les tables du rapport
            For Each table As Table In reportDocument.Database.Tables
                Dim logonInfo As TableLogOnInfo = table.LogOnInfo
                logonInfo.ConnectionInfo = connectionInfo
                table.ApplyLogOnInfo(logonInfo)
            Next

            ' Lier le rapport au CrystalReportViewer
            CrystalReportViewer1.ReportSource = reportDocument

            ' Rafraîchir le rapport pour s'assurer que les données sont à jour
            CrystalReportViewer1.Refresh()
        Catch ex As Exception
            MessageBox.Show($"Erreur lors du chargement du rapport : {ex.Message}", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
End Class

Étape 4 : Explications du Code

  1. Chargement du fichier rapport :
    • Le chemin du fichier rapport est spécifié dans reportDocument.Load(reportPath).
  2. Connexion à la base de données :
    • Si votre rapport dépend d’une base de données, configurez la connexion avec ConnectionInfo.
  3. Appliquer les informations de connexion :
    • Utilisez ApplyLogOnInfo pour chaque table du rapport pour garantir que les informations de connexion sont appliquées.
  4. Afficher le rapport :
    • Le contrôle CrystalReportViewer permet d’afficher le rapport directement dans le formulaire.

Étape 5 : Options Supplémentaires

Exporter un rapport au format PDF

Vous pouvez exporter un rapport directement au format PDF :

Dim exportPath As String = "C:\Chemin\Vers\RapportExporté.pdf"
reportDocument.ExportToDisk(ExportFormatType.PortableDocFormat, exportPath)
MessageBox.Show("Rapport exporté avec succès !")

Passer des paramètres au rapport

Si votre rapport accepte des paramètres, vous pouvez les passer ainsi :

Dim paramField As New ParameterField()
Dim paramValue As New ParameterDiscreteValue()

paramField.Name = "NomParametre"
paramValue.Value = "ValeurDuParametre"
paramField.CurrentValues.Add(paramValue)

Dim paramFields As New ParameterFields()
paramFields.Add(paramField)

CrystalReportViewer1.ParameterFieldInfo = paramFields

Rafraîchir les données

Pour s’assurer que le rapport utilise des données mises à jour, appelez :

CrystalReportViewer1.RefreshReport()

Étape 6 : Déploiement

Lors de la publication de votre application, assurez-vous que :

  • Le runtime de Crystal Reports est installé sur la machine de l’utilisateur final.
  • Tous les fichiers .rpt nécessaires sont inclus avec l’application.

Voici quelques cas particuliers auxquels vous pourriez être confronté lorsque vous travaillez avec Crystal Reports dans VB.NET, ainsi que leurs solutions.


1. Le chemin du fichier de rapport est dynamique

Problème

Vous ne voulez pas coder en dur le chemin du fichier .rpt dans votre application, car l’emplacement du fichier peut varier (par exemple, lors du déploiement).

Solution

Utilisez un chemin dynamique basé sur l’emplacement de l’application :

Dim reportPath As String = System.IO.Path.Combine(Application.StartupPath, "Rapports\VotreRapport.rpt")
Dim reportDocument As New ReportDocument()
reportDocument.Load(reportPath)
CrystalReportViewer1.ReportSource = reportDocument

2. Connexion à une base de données dynamique

Problème

Vous devez permettre à l’utilisateur de fournir les informations de connexion à la base de données (nom du serveur, base de données, etc.) à l’exécution.

Solution

Créez une interface utilisateur pour saisir les informations de connexion, puis appliquez-les au rapport.

Dim connectionInfo As New ConnectionInfo()
connectionInfo.ServerName = txtServerName.Text
connectionInfo.DatabaseName = txtDatabaseName.Text
connectionInfo.UserID = txtUserID.Text
connectionInfo.Password = txtPassword.Text

For Each table As Table In reportDocument.Database.Tables
    Dim logonInfo As TableLogOnInfo = table.LogOnInfo
    logonInfo.ConnectionInfo = connectionInfo
    table.ApplyLogOnInfo(logonInfo)
Next

3. Rapport avec des paramètres

Problème

Votre rapport utilise des paramètres pour filtrer les données (par exemple, une plage de dates ou un identifiant spécifique), et vous devez les passer dynamiquement à l’exécution.

Solution

Utilisez ParameterFields pour définir et passer les paramètres :

Dim paramFields As New ParameterFields()
Dim paramField As New ParameterField()
Dim paramValue As New ParameterDiscreteValue()

paramField.Name = "NomDuParametre"
paramValue.Value = "ValeurDuParametre"
paramField.CurrentValues.Add(paramValue)
paramFields.Add(paramField)

CrystalReportViewer1.ParameterFieldInfo = paramFields

4. Rapport avec sous-rapports

Problème

Votre rapport principal contient un ou plusieurs sous-rapports, et vous devez configurer les connexions ou passer des paramètres à ces sous-rapports.

Solution

Utilisez Subreports pour accéder et configurer les sous-rapports.

For Each subReport As ReportDocument In reportDocument.Subreports
    For Each table As Table In subReport.Database.Tables
        Dim logonInfo As TableLogOnInfo = table.LogOnInfo
        logonInfo.ConnectionInfo = connectionInfo
        table.ApplyLogOnInfo(logonInfo)
    Next
Next

5. Rapport avec une source de données différente à l’exécution

Problème

Vous voulez charger un dataset ou une table de données en tant que source de données pour votre rapport à l’exécution.

Solution

Utilisez SetDataSource pour assigner un dataset ou une table au rapport.

Dim ds As New DataSet()
' Remplir le dataset avec des données
' Exemple : Remplir une DataTable et l'ajouter au DataSet

Dim dataTable As New DataTable("NomDeLaTable")
' Ajouter des colonnes et des données à dataTable
ds.Tables.Add(dataTable)

Dim reportDocument As New ReportDocument()
reportDocument.Load("VotreRapport.rpt")
reportDocument.SetDataSource(ds)

CrystalReportViewer1.ReportSource = reportDocument

6. Exporter un rapport dans un format spécifique

Problème

Vous voulez exporter le rapport directement au format PDF, Excel ou Word.

Solution

Utilisez ExportToDisk pour exporter dans le format souhaité.

reportDocument.ExportToDisk(ExportFormatType.PortableDocFormat, "Rapport.pdf")
reportDocument.ExportToDisk(ExportFormatType.Excel, "Rapport.xls")
reportDocument.ExportToDisk(ExportFormatType.WordForWindows, "Rapport.doc")

7. Rapport très volumineux ou lent à charger

Problème

Le rapport contient beaucoup de données, ce qui entraîne une lenteur lors du chargement.

Solution

Optimisez le rapport en appliquant des filtres pour réduire la quantité de données chargées :

Dim paramField As New ParameterField()
Dim paramValue As New ParameterDiscreteValue()

' Ajouter un filtre pour limiter les données (par exemple, une plage de dates)
paramField.Name = "DateDebut"
paramValue.Value = "2024-01-01"
paramField.CurrentValues.Add(paramValue)

' Ajouter un deuxième filtre pour DateFin
Dim paramField2 As New ParameterField()
Dim paramValue2 As New ParameterDiscreteValue()
paramField2.Name = "DateFin"
paramValue2.Value = "2024-12-31"
paramField2.CurrentValues.Add(paramValue2)

Dim paramFields As New ParameterFields()
paramFields.Add(paramField)
paramFields.Add(paramField2)

CrystalReportViewer1.ParameterFieldInfo = paramFields

8. Erreur : “Impossible de trouver les informations de connexion”

Problème

Une erreur se produit car le rapport n’est pas correctement connecté à la source de données.

Solution

Assurez-vous d’appliquer les informations de connexion à toutes les tables du rapport.

Dim connectionInfo As New ConnectionInfo()
connectionInfo.ServerName = "NomServeur"
connectionInfo.DatabaseName = "NomBaseDeDonnees"
connectionInfo.UserID = "Utilisateur"
connectionInfo.Password = "MotDePasse"

For Each table As Table In reportDocument.Database.Tables
    Dim logonInfo As TableLogOnInfo = table.LogOnInfo
    logonInfo.ConnectionInfo = connectionInfo
    table.ApplyLogOnInfo(logonInfo)
Next

9. Utilisation dans une application Web (ASP.NET)

Problème

Vous souhaitez afficher des rapports Crystal Reports dans une application ASP.NET.

Solution

Ajoutez un contrôle CrystalReportViewer à votre page Web et configurez-le pour afficher le rapport.

Imports CrystalDecisions.CrystalReports.Engine

Public Class WebForm1
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        If Not IsPostBack Then
            Dim reportDocument As New ReportDocument()
            Dim reportPath As String = Server.MapPath("Rapports/VotreRapport.rpt")
            reportDocument.Load(reportPath)

            CrystalReportViewer1.ReportSource = reportDocument
            CrystalReportViewer1.RefreshReport()
        End If
    End Sub
End Class

Ces cas particuliers couvrent des scénarios courants que vous pourriez rencontrer lorsque vous travaillez avec Crystal Reports en VB.NET. Ils montrent comment personnaliser et optimiser vos rapports pour répondre aux besoins spécifiques de votre application.

Autres articles

Guide : Déclaration d’un objet en VB.NET...
VB.NET (Visual Basic .NET) est un langage orienté objet qui...
Read more
Guide : Comment ouvrir une base de...
Ce guide explique étape par étape comment ouvrir une base...
Read more
Guide : Afficher une miniature d’un fichier...
En VB.NET, il n’existe pas de méthode native pour afficher...
Read more

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *