Crystal Report et .Net
|
Un tutorial simplifié au maximum, pour rapidement faire un etat avec Crystal Report pour .Net
|
|
Vu
40310
fois
|
Ce How-To a pour but de vous expliquer rapidement comment faire facilement un rapport Crystal Report avec .Net. J’exposerai les 2 méthodes, et détaillerai la meilleure des 2.
Crystal Report (CR) est intégré à .Net, il faut bien évidemment l’avoir sélectionné dans la liste des composants lors de l’installation de Visual Studio.Net. Ensuite il sera accessible dans un projet en ajoutant un “Etat Crystal Report”.

Les 2 méthodes concernent les données du Crystal Report. Soit on remplie les données directement à partir d’une connexion à une base de données, soit on remplie via un DataSet fortement typé. La première solution est à bannir car c’est une calamité pour la simple raison qu’il faudra se balader avec les paramètres de connexion à chaque fois. Je vais donc expliquer la deuxième solution.
- Qu’est ce qu’un DataSet Fortement Typé ?
c’est juste la définition de Tables sur lesquelles le rapport CR se basera pour afficher les données. Le DataSet est en fait un fichier XML qui définit les différentes tables qui composeront le rapport.
- Pourquoi utiliser cette technique ?
Cela permet d’éviter de baser le rapport sur une connexion base de données. En fait le rapport se basera sur le DataSet fortement typé qu’on aura définit. Il fera le lien entre sa Source et le DataSet. Ce qui évite toute connexion à la base de données par CR.
Pour ajouter un DataSet au projet il faut ajouter l’élément “DataSet” (format XSD).

Ensuite il faut définir les différentes tables (Éléments). Prenons comme exemple une liste d’élèves. Pour cela ajoutons un élement. Clic droit sur le XSD (onglet DataSet) puis ajouter un élément.
Définir le nom de l’élément à ELEVES puis 2 champs (nom et prénom) en string.

Vous pouvez visualiser le XML généré par cette action en cliquant sur l’onglet XML. Maintenant que le DataSet est fait, on peut passer à la création de notre rapport. Le moyen le plus simple et le plus rapide est d’utiliser l’assistant de création. Ouvrez ou Ajoutez l’etat crystal report en mode Design. Puis Faites un bouton droit Etat/Expert Etat. Il passera en mode Wizard. Lors de l’ajout d’un nouvel état il passera automatiquement en mode Wizard.
Attention, passer en mode Wizard implique de supprimer toute la mise en page des données sur l’état courant.
Le Wizard se présente ainsi :

La première chose à faire est de sélectionner la source de données, en l’occurrence le DataSet fortement typé que nous avons préalablement créé (voir l’image ci-dessus). Puis d’insérer toutes les tables dont on a besoin (ELEVES pour les lecteurs qui ne suivent pas). Ensuite, il faut sélectionner les champs de la table que l'on souhaite afficher :

Puis cliquez sur terminer. Le Wizard génèrera alors un État pré rempli avec toutes les données. A votre guise bien évidemment de modifier l’interface. Maintenant il nous reste à tester l’état avec des données. Pour cela ajoutez au projet une page web et mettez un composant CrystalReportViewer.
Puis en code behind mettez le code suivant :
DataTable dt = new DataTable("ELEVES"); dt.Columns.Add(new DataColumn("nom",typeof(string))); dt.Columns.Add(new DataColumn("prenom",typeof(string)));
DataRow dr = dt.NewRow(); dr["nom"] = "toto"; dr["prenom"] = "ducheo"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["nom"] = "titi"; dr["prenom"] = "mize"; dt.Rows.Add(dr);
cr_test crt = new cr_test(); crt.SetDataSource(dt);
CrystalReportViewer1.ReportSource = crt; CrystalReportViewer1.DataBind();
|
Lancez la page et vous pourrez constater le remarquable rapport que vous venez de créer. C’est bien beau et bien gentil tout ça mais comment faire quand on a des données un peu plus compliqué à manipuler ?
Modifions le DataSet en rajoutant une table (élément). Appelez la table CLASSE avec un Code et un libellé. Puis rajoutez comme champ le code de la table CLASSE dans la table ELEVES.

Vous comprendrez avec un tel DataSet qu’on veut chaque élève groupé par sa Classe. Ceci paraît presque simple mais il y a quelques choses à savoir. Si on modifie un DataSet, le lien dans le rapport de CR ne sera pas automatiquement rafraîchi. Le seul moyen que j’ai trouvé est le suivant :
1 – Bouton Droit : Base de données puis connexion/déconnexion du serveur. Déconnecter la “connexion actuelle” qui fait référence à votre DataSet.
2 – Bouton Droit : Base de données puis Ajouter/supprimer une base de données. Enlevez la table ELEVES de la liste des tables sélectionnées puis rafraîchir les tables de la liste de gauche. Pour cela il faut rétrécir la racine de ADO DataSet et rouvrir la racine. Ajoutez bien évidemment les 2 tables.
Maintenant que les 2 tables ont été rajoutées, un nouvel onglet fait son apparition ; Liaison. C’est dans cet onglet, qu’on définit les liaisons entre les tables. Supprimer toutes les liaisons et faites le lien entre le CODE de ELEVES et le CODE de CLASSE. Vous pourrez revenir à tout moment dans les liaisons en faisant bouton droit/base de données/expert liaisons virtuelles.
Ensuite relancez le Wizard afin de redéfinir notre affichage. Procédez comme précédemment. Mais cette fois-ci allez jusqu'à l’étape des GROUPES. Définissez comme champs de groupe le CODE de la table CLASSE. Faites Terminer puis repassons dans le code pour modifier la source de données comme cela :
DataSet ds = new DataSet("DataSet_ftype");
DataTable dt = new DataTable("CLASSE"); dt.Columns.Add(new DataColumn("code",typeof(int))); dt.Columns.Add(new DataColumn("libelle",typeof(string)));
DataRow dr = dt.NewRow(); dr["code"] = "1"; dr["libelle"] = "CLASSE 1"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["code"] = "2"; dr["libelle"] = "CLASSE 2"; dt.Rows.Add(dr);
ds.Tables.Add(dt);
dt = new DataTable("ELEVES"); dt.Columns.Add(new DataColumn("nom",typeof(string))); dt.Columns.Add(new DataColumn("prenom",typeof(string))); dt.Columns.Add(new DataColumn("code",typeof(int)));
dr = dt.NewRow(); dr["nom"] = "toto"; dr["prenom"] = "ducheo"; dr["code"] = 1; dt.Rows.Add(dr); dr = dt.NewRow(); dr["nom"] = "titi"; dr["prenom"] = "mize"; dr["code"] = 2; dt.Rows.Add(dr);
ds.Tables.Add(dt); cr_test crt = new cr_test(); crt.SetDataSource(ds);
CrystalReportViewer1.ReportSource = crt; CrystalReportViewer1.DataBind();
|
Faites bien attention à ce que les Tables créées dans le DataSet du CodeBehind portent le même nom que celles du DataSet fortement typé.
Ensuite testez et admirez votre œuvre. Comme vous avez pu le constater, Crystal Report génère une page aspx avec une gestion des pages suivantes et précédentes etc. Mais il y a d’autres moyens d’afficher beaucoup plus sympathiques.
Avec Crystal Report on peut exporter sous différents formats de données ; Word, Excel, RTF, et surtout PDF !
Regardez attentivement le Code ci-dessous à placer après le code ci-dessus.
MemoryStream oStream; CrystalDecisions.Shared.ExportFormatType t = CrystalDecisions.Shared.ExportFormatType.WordForWindows; string content_type = "application/doc"; int export_voulu = 2; /****************************** * 1 - application/vnd.ms-excel" * 2 - application/pdf * 3 - application/word * 4 - application/rtf (il faut WordForWindows et non RichText) * *****************************/ switch (export_voulu) { case 1: t = CrystalDecisions.Shared.ExportFormatType.Excel ; content_type="application/vnd.ms-excel"; break; case 2: t = CrystalDecisions.Shared.ExportFormatType.PortableDocFormat ; content_type = "application/pdf"; break; case 3: t = CrystalDecisions.Shared.ExportFormatType.WordForWindows ; content_type = "application/msword"; break; case 4: t = CrystalDecisions.Shared.ExportFormatType.RichText; content_type = "application/rtf"; break;
} oStream = (MemoryStream)crt.ExportToStream(t); Response.Clear(); Response.Buffer= true; Response.ContentType = content_type; Response.BinaryWrite(oStream.ToArray());
|
Voila le code que j’utilise afin d’exporter sous le format dont j’ai besoin. Le code est assez explicite. En fait je modifie le flux de sortie HTML via un MemoryStream généré par la fonction ExportToStream du rapport. Modifiez export_voulu par la valeur souhaitée afin de tester les différents formats.
Le format PDF est mon préféré puisqu’il intègre toutes les fonctions de mise en page et d’impression sans rien coder J
Crystal Report pour .Net est très bien quand on arrive à s’en servir correctement. Au début, il peut s’avérer très lourdingue mais à force on s’y habitue et limite on apprécie la facilité d’utilisation. Je n’ai pas exposé toutes les options comme les totaux ou les sauts de pages mais il n’est pas difficile de trouver par soi-même.
Bonne chance à tous. Et n’hésitez pas à demander de l’aide :)
|