none
DLL ReportViewer RRS feed

  • 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

    jeudi 5 mai 2011 13:21

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.


    lundi 9 mai 2011 13:31
  • 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 !!!

     

    lundi 9 mai 2011 14:48

Toutes les réponses

  • Je ne me suis pas battu depuis longtemps avec ces reports mais essaie
    déjà cela :
     
    --
    Fred
    foleide@free.fr
     
     
    jeudi 5 mai 2011 14:06
  • 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

    jeudi 5 mai 2011 14:24
  • Je me suis trompé de lien je pense
     
    Sinon tu ne vois pas les différents ReportViewer lorsque tu ajoutes des
    composants dans la boîte à outils de Visual Studio ?
     
    Comme je te le disais, j'avais renoncé à utiliser ce composant devant
    les difficultés à concilier la version de MS SQL, ma version de VS, la
    version du concepteur de rapport et la nécessité (moindre maintenant) de
    pouvoir faire tourner mon appli en Framework 2.0 (pour les postes en
    windows 2000).
    Mais je vais peut-être ré-envisager la question ...
     --
    Fred
    foleide@free.fr
     
     
    jeudi 5 mai 2011 15:05
  • 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

    jeudi 5 mai 2011 15:08
  • 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

     

    vendredi 6 mai 2011 10:14
  • 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

    vendredi 6 mai 2011 13:12
  • 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

    dimanche 8 mai 2011 12:55
  • 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.

    lundi 9 mai 2011 09:18
  • 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

    lundi 9 mai 2011 12:08
  • 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.


    lundi 9 mai 2011 13:31
  • 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 !!!

     

    lundi 9 mai 2011 14:48