Meilleur auteur de réponses
DLL ReportViewer

Question
-
Bonjour,
J'ai créé 1 report qui fonctionne parfaitement dans Reporting Services via SQL Server 2008 R2 Express.
Je cherche donc à afficher ce fichier .rdl dans VB .Net 2008 Express, mais l'erreur suivante se produit :
The report definition is not valid.
Details: The report definition has an invalid target namespace
'http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition' which cannot be upgraded.
En effet, en cherchant, je trouve 1 information qui signale que les DLL (version 9) ne sont pas compatibles.
Je cherche donc à récupérer ces DLL en version 10 qui sembleraient être compatibles, mais je ne les trouve ni dans VB .Net 2010 Express (qui m'affiche la même erreur car j'ai référencé les DLL version 9), ni après avoir téléchargé et installé Report Viewer 3.
Pouvez-vous me signaler comment obtenir (légalement) ces DLL :
Microsoft.ReportViewer.WinForms.dll (j'utilise le contrôle de cette DLL)
et pendant qu'on y est, on ne sait jamais :
Microsoft.ReportViewer.WebForms.dll
et
Microsoft.ReportViewer.Common.dll
Je vous remercie d'avance.
Cordialement,
Stéphane
PS : voici le code (légèrement modifié) que j'exécute pour afficher le rapport
Dim report_file As String
Dim req As String
Dim connexion As SqlClient.SqlConnection
Dim sc As New SqlClient.SqlCommand
Dim rds As New ReportDataSource
Dim ds As Data.DataSet
Dim sda As Data.SqlClient.SqlDataAdapter
report_file = "C:\Mon répertoire\Report.rdl"
req = "SELECT * FROM ma_table"
ds = New Data.DataSet
connexion = New SqlClient.SqlConnection("Data Source=.\SQL2008R2EXPRESS;Initial Catalog=MA_BDD;Integrated Security=true;")
sc.Connection = connexion
sc.CommandText = req
sda = New Data.SqlClient.SqlDataAdapter(sc)
sda.Fill(ds)
sda.Dispose()
With Me.ReportViewer1
.ProcessingMode = ProcessingMode.Local
.LocalReport.ReportPath = report_file
.LocalReport.DataSources.Clear()
For Each dt As Data.DataTable In ds.Tables
rds.Name = ds.DataSetName & "_" & dt.TableName
rds.Value = dt
.LocalReport.DataSources.Add(rds)
Next
.LocalReport.Refresh()
.RefreshReport()
End With
Réponses
-
Bon, je confirme, je n'arrive pas à convertir le rapport RDL en RDLC.
En effet, sur la MSDN de Microsoft :
http://msdn.microsoft.com/fr-fr/library/ms252109%28v=vs.90%29.aspx
Le paragraphe concernant :
Conversion RDL-RDLC
est pour du Visual Studio en version non express.
En effet, dans la version Express, le contrôle apparait dans le form sans son effet visuel, et sans ses balises actives.
Pourtant, dans ce paragraphe, on comprend que la conversion consiste seulement à signaler quelle est la source données.
Car dans le RDL, la source de données est liée à 1 dataset elle-même liée à 1 source de données SQL.
Et dans le RDLC, on doit changer cette source de données en utilisant 1 DataSet que l'on remplit en utilisant 1 Adapter et 1 Connexion à 1 base de données.
Pourtant, je la change bien dans le code que je remets ici (j'utilise ma connexion SQL CE pour remplir 1 SQLCeAdapter, ne plus tenir compte de l'ancien code au début de ce post qui se connectait à la base SQL qui a servi uniquement à créer le rapport avec Reporting Services)
Dim report_file As String
Dim req As String
Dim rds As New ReportDataSource
Dim ds As New Data.DataSet("DataSet_Liste_MP")
Dim sc As New SqlCeCommand
Dim sda As SqlCeDataAdapter
report_file = variables.strings.CurrentUserApplicationData & "\Système\Report_Liste des MP.rdlc"
req = "SELECT matiere_premiere.*, etat_physique.etat, detail_etat_physique.detail_etat FROM matiere_premiere LEFT OUTER JOIN detail_etat_physique ON matiere_premiere.numero_detail_ep = detail_etat_physique.numero_auto LEFT OUTER JOIN etat_physique ON matiere_premiere.numero_ep = etat_physique.numero_auto"
sc.Connection = connection_bdd_appli
sc.CommandText = req
sda = New SqlCeDataAdapter(sc)
sda.Fill(ds, "DataTable_Liste_MP")
sda.Dispose()
Me.ReportViewer_Liste_MP = New ReportViewer
With Me.ReportViewer_Liste_MP
.LocalReport.DataSources.Clear()
.Reset()
.Dock = System.Windows.Forms.DockStyle.Fill
.ProcessingMode = ProcessingMode.Local
.LocalReport.ReportPath = report_file
.LocalReport.DataSources.Add(New ReportDataSource("ReportDataSource_Liste_MP", ds.Tables("DataTable_Liste_MP")))
.RefreshReport()
End With
Me.TableLayoutPanel1.Controls.Add(ReportViewer_Liste_MP, 0, 0)Je dois donc toujours louper quelque chose, mais je ne sais pas quoi, car il m'indique toujours la même erreur:
A data source instance has not been supplied for the data source 'DataSet_SQL_Liste_MP'.
Pour info, DataSet_SQL_Liste_MP est le nom du DataSet qui a été créé dans Reporting Services. Mais normalement, dans le code, le dataset derait être écrasé, mais apparemment, il n'est pas écrasé et conserve quelque part l'ancien dataset.
Peut-être est-ce du côté du databinding (que je ne connais pas) ? Ou faut-il que le 1er rapport au format RDL soit construit d'une certaine façon, étant donné que l'on peut soit "lier" soit "incorporer" les datasource et dataset. Ca se trouve, il n'y a qu'1 seule façon de faire qui est correcte pour 1 utilisation dans Express ?
Merci d'avance pour tous vos éclaircissements.
Stéphane
Edit : On a posté en même temps... Pour répondre à la question, tester en mode distant ne me servira à rien, car et en plus de l'installation de l'application chez les clients, il faudrait que je leur installe SQL Server Express (ce qui est plus lourd à gérer que l'installation de SQL Server CE) et il faudrait que j'installe les bases SQL (avec je le vois gros comme 1 maison, des problèmes de droits), alors qu'avec des bases SQL CE cryptées avec 1 mot de passe bien choisi, il n'y aura pas tous ces inconvénients.
- Marqué comme réponse Ciprian Duduiala mardi 10 mai 2011 10:09
-
Problème réglé.
Le dernier problème qui me restait le nom du RDS qui devait être le même nom que le DataSet dans Reporting Services.
Un grand merci à Fred & Nikho !!!
- Marqué comme réponse Ciprian Duduiala mardi 10 mai 2011 10:09
Toutes les réponses
-
Je ne me suis pas battu depuis longtemps avec ces reports mais essaiedéjà cela :--Fredfoleide@free.fr
-
Merci Fred, mais hélas, pas mieux :/...
Ni en installant celui-ci, ni le report viewer 3...
Ou alors, c'est que je trouve pas où est-ce qu'il est... Et la fonction Rechercher dans Windows 7 ne me trouve que la DLL en version 8.
Pour info :
Je viens de trouver que ces DLL sont censées bien être quelque part sur mon PC.
En effet, si je vais dans C:\Windows\assembly, je trouve les DLL dans plusieurs versions (8, 9 et 10), y compris dans celle que je recherche (la 10) !!!
Une idée ?
Stéphane
-
Je me suis trompé de lien je penseSinon tu ne vois pas les différents ReportViewer lorsque tu ajoutes descomposants dans la boîte à outils de Visual Studio ?Comme je te le disais, j'avais renoncé à utiliser ce composant devantles difficultés à concilier la version de MS SQL, ma version de VS, laversion du concepteur de rapport et la nécessité (moindre maintenant) depouvoir faire tourner mon appli en Framework 2.0 (pour les postes enwindows 2000).Mais je vais peut-être ré-envisager la question ...--Fredfoleide@free.fr
-
Suite des aventures :
J'ai réussi à récupérer la DLL.
En lançant 1 commande CMD, puis CD \Windows\Assembly, puis DIR /S Microsoft.ReportViewer.WinForms.dll, puis CD GAC puis tous les sous répertoires à rallonge pour arriver à la DLL en version 10 !
1 petit copy . d:, et j'ai pu enfin récupérer la DLL dans la "bonne version"
La bonne nouvelle !
Il n'y a plus l'erreur !!!
Les mauvaises nouvelles !
Le nouveau contrôle ne s'affiche plus dans le concepteur, mais en bas de la form, comme pour 1 contrôle Timer par exemple.
Ensuite, dans le code, je n'arrive pas à le faire afficher dans mon form....
Et enfin, juste au cas où, si je laisse l'ancien contrôle sans en mettre 1 nouveau basé sur la nouvelle DLL, sachant que l'ancien contrôle n'a que le référencement de la DLL en version 10, alors le report s'affiche dans le concepteur, mais je n'ai toujours pas le résultat escompté en exécutant le programme... Mais dans ce cas, le report affiche l'erreur (directement dans le contrôle affiché) "A data source instance has not been supplied for the data source 'DataSet1'. "
A demain pour la suite des aventures... n'hésitez pas à m'aider si vous connaissez ce problème !
Merci d'avance.
Stéphane
-
Bonjour,
une remarque sur les types de fichiers reporting services. En général :
- les fichiers .rdl sont utilisés pour mettre à disposition un rapport sur reporting services
- les fichiers .rdlc en sont une version cliente ( ce sont ceux que l'on crée depuis visual studio )
Dans votre cas puisque vous souhaitez utiliser le rapport dans un client winform, le plus simple est
- soit de convertir votre rdl en rdlc et de l'utiliser en mode local depuis le composant report viewer
- soit d'appeler le rapport en mode distant. Dans ce cas le rapport reste hébergé sur reporting services
Vous trouverez beaucoup d'informations utiles sur ce site : gotreportviewer
notamment :
- que les version de definitions des rdls sont différents entre des versions "identiques" de sql server et visual studio ce que vous avez constaté ...
- que l'on doit pouvoir utiliser directement des rdl dans le report viewer (avec comme vous le constatez des restrictions en mode design ) mais je n'ai jamais essayé pour ma part.
RDL files are fully compatible with the ReportViewer control runtime. However, RDL files do not contain some information that the design-time of the ReportViewer control depends on for automatically generating data-binding code. By manually binding data, RDL files can be used in the ReportViewer control.
Cordialement
-
Merci Nicko,
Je n'y arrive toujours pas...
En fait, avec le site que tu as indiqué, je viens de voir ceci :
Q: What editions of Visual Studio 2008 include ReportViewer?
A: ReportViewer is included in Standard and up. (i.e., all editions except Express.) An add-in is available for Visual Web Developer Express.
Etant donné que j'utilise VB .Net 2008 Express, est-ce que c'est à cause de ça que ca ne fonctionne pas ?
Il y a bien le fichier ReportViewer à télécharger, mais ca ne change rien pour moi apparemment...
Il faut que je passe obligatoirement à 1 licence non express (non gratuite ?) ( :/ ) ?
Merci d'avance pour vos éclaircissements,
Stéphane
-
Bonjour,
si il n'existe pas d'add in pour votre version express, ce doit être limitant pour la création, modification d'un rapport mais pas pour afficher un rapport que vous avez créez par un autre outil.
Reste qu'en dehors de problème de design des rapports, avez vous converti votre rdl en rdlc ou choisi un d'accéder au rapport sur SSRS ?
Cordialement
-
Merci Nicko,
Ok, donc ca veut dire que en théorie, je devrais tout à fait pouvoir afficher 1 rapport dans 1 projet VB .Net 2008 Express.
C'est donc 1 bonne nouvelle !
Ensuite, comme j'ai également compris que le rapport affiché dans le projet ne se connectera à la base de données SQL dans le cas d'un rapport local, ca a pour moi plusieurs avantages, donc je vais choisir le mode local.
Il faut donc que je convertisse mes rapport RDL en RDLC. J'ai tenté vendredi de comprendre comment faire, mais je n'ai pas réussi... Apparemment, la manipulation de conversion que j'ai vu se faisait avec 1 version studio qui inclue rapportviewer, donc 1 version non express.
Je continue de chercher comment convertir 1 rapport RDL en RDLC.
Stéphane.
-
Bonjour,
Le problème je pense c'est que pour convertir le rdl en rdlc, le report viewer vous serait utile je pense...
L'avantage du mode distant c'est que toute la génération à lieu sur le serveur SSRS, ce qui soulage notablement l'application hote.
Pour ma part, j'essaierai d'appeler le rapport hébergé sur SSRS dans un premier temps afin de valider au moins cet appel.
Ensuite seulement si vous ne souhaitez pas utiliser SSRS, je chercherai à migrer vers un rdlc.
Cordialement
-
Bon, je confirme, je n'arrive pas à convertir le rapport RDL en RDLC.
En effet, sur la MSDN de Microsoft :
http://msdn.microsoft.com/fr-fr/library/ms252109%28v=vs.90%29.aspx
Le paragraphe concernant :
Conversion RDL-RDLC
est pour du Visual Studio en version non express.
En effet, dans la version Express, le contrôle apparait dans le form sans son effet visuel, et sans ses balises actives.
Pourtant, dans ce paragraphe, on comprend que la conversion consiste seulement à signaler quelle est la source données.
Car dans le RDL, la source de données est liée à 1 dataset elle-même liée à 1 source de données SQL.
Et dans le RDLC, on doit changer cette source de données en utilisant 1 DataSet que l'on remplit en utilisant 1 Adapter et 1 Connexion à 1 base de données.
Pourtant, je la change bien dans le code que je remets ici (j'utilise ma connexion SQL CE pour remplir 1 SQLCeAdapter, ne plus tenir compte de l'ancien code au début de ce post qui se connectait à la base SQL qui a servi uniquement à créer le rapport avec Reporting Services)
Dim report_file As String
Dim req As String
Dim rds As New ReportDataSource
Dim ds As New Data.DataSet("DataSet_Liste_MP")
Dim sc As New SqlCeCommand
Dim sda As SqlCeDataAdapter
report_file = variables.strings.CurrentUserApplicationData & "\Système\Report_Liste des MP.rdlc"
req = "SELECT matiere_premiere.*, etat_physique.etat, detail_etat_physique.detail_etat FROM matiere_premiere LEFT OUTER JOIN detail_etat_physique ON matiere_premiere.numero_detail_ep = detail_etat_physique.numero_auto LEFT OUTER JOIN etat_physique ON matiere_premiere.numero_ep = etat_physique.numero_auto"
sc.Connection = connection_bdd_appli
sc.CommandText = req
sda = New SqlCeDataAdapter(sc)
sda.Fill(ds, "DataTable_Liste_MP")
sda.Dispose()
Me.ReportViewer_Liste_MP = New ReportViewer
With Me.ReportViewer_Liste_MP
.LocalReport.DataSources.Clear()
.Reset()
.Dock = System.Windows.Forms.DockStyle.Fill
.ProcessingMode = ProcessingMode.Local
.LocalReport.ReportPath = report_file
.LocalReport.DataSources.Add(New ReportDataSource("ReportDataSource_Liste_MP", ds.Tables("DataTable_Liste_MP")))
.RefreshReport()
End With
Me.TableLayoutPanel1.Controls.Add(ReportViewer_Liste_MP, 0, 0)Je dois donc toujours louper quelque chose, mais je ne sais pas quoi, car il m'indique toujours la même erreur:
A data source instance has not been supplied for the data source 'DataSet_SQL_Liste_MP'.
Pour info, DataSet_SQL_Liste_MP est le nom du DataSet qui a été créé dans Reporting Services. Mais normalement, dans le code, le dataset derait être écrasé, mais apparemment, il n'est pas écrasé et conserve quelque part l'ancien dataset.
Peut-être est-ce du côté du databinding (que je ne connais pas) ? Ou faut-il que le 1er rapport au format RDL soit construit d'une certaine façon, étant donné que l'on peut soit "lier" soit "incorporer" les datasource et dataset. Ca se trouve, il n'y a qu'1 seule façon de faire qui est correcte pour 1 utilisation dans Express ?
Merci d'avance pour tous vos éclaircissements.
Stéphane
Edit : On a posté en même temps... Pour répondre à la question, tester en mode distant ne me servira à rien, car et en plus de l'installation de l'application chez les clients, il faudrait que je leur installe SQL Server Express (ce qui est plus lourd à gérer que l'installation de SQL Server CE) et il faudrait que j'installe les bases SQL (avec je le vois gros comme 1 maison, des problèmes de droits), alors qu'avec des bases SQL CE cryptées avec 1 mot de passe bien choisi, il n'y aura pas tous ces inconvénients.
- Marqué comme réponse Ciprian Duduiala mardi 10 mai 2011 10:09
-
Problème réglé.
Le dernier problème qui me restait le nom du RDS qui devait être le même nom que le DataSet dans Reporting Services.
Un grand merci à Fred & Nikho !!!
- Marqué comme réponse Ciprian Duduiala mardi 10 mai 2011 10:09