IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Création et appel Crystal reports avec plusieurs tables basé sur l'EF [Débutant]


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2004
    Messages : 92
    Points : 79
    Points
    79
    Par défaut Création et appel Crystal reports avec plusieurs tables basé sur l'EF
    Bonjour,
    Sur un environnement vb2010, Crystal reports, .net framework 4, entity framework basé sur sql serveur.
    Je ne parviens pas à créer un rapport basé sur plusieurs tables.

    Dans la sélection des données sur CR je prends « Données du projet\.NET Objects ». Je vois autant de lignes que j’ai de tables dans mon modèle de données. Si je prends les tables dont j’ai besoin j’ai le message suivant qui apparaît :
    Une procédure stockée ou plusieurs sources de données ont été utilisées dans ce rapport.
    Ensuite, je dois créer les relations entre les tables manuellement, donc ce n’est pas basé sur le datamodel, donc je pense que ce n’est pas comme ça qu’il faut que je m’y prenne…

    Pour 1 seule table dans l’état, je fais l’appel suivant, ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim myContext As New GlobalEntities
    Dim myReport As CrystalReport1 = New CrystalReport1
    myReport.SetDataSource(myContext.table1)
    CrystalReportViewer1.ReportSource = myReport
    Pour un état basé sur plusieurs tables, je ne sais pas comment faire au niveau du SetDataSource. La ligne suivante ne passe pas. Mais je pense que je ne suis pas sur la bonne voie en faisant comme ça…
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myReport.SetDataSource(From c In myContext. table1 Select c, c.table1.table2)
    Quelqu’un peut-il m’aider.
    Merci beaucoup.

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2004
    Messages : 92
    Points : 79
    Points
    79
    Par défaut 1ères pistes
    Alors,

    Proposition 1 : report branché directement sur les tables de l'EF comme je l'ai pécisé plus haut. Il faut placer les données dans chaque table manuellement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim myContext As New GlobalEntities
    Dim myReport As CrystalReport1 = New CrystalReport1
     
    Dim t1 = From p In myContext.table1 Select p
    dt = EntityToDatatable(t1, myContext)
    MyReport.Database.Tables("context_table1").SetDataSource(dt)
     
    Dim t2 = From p In myContext.table2 Select p
    dt = EntityToDatatable(t2, myContext)
    MyReport.Database.Tables("context_table2").SetDataSource(dt)
     
    CrystalReportViewer1.ReportSource = myReport
    Pour cela il faut la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Imports System.Data.Objects
    Imports System.Data.SqlClient
    Imports System.Data.EntityClient
    Protected Function EntityToDatatable(ByVal Result As IQueryable, ByVal ctx As ObjectContext) As DataTable
            Try
                Dim conn As EntityConnection = CType(ctx.Connection, EntityConnection)
                Dim SQLCon As SqlConnection = New SqlConnection(conn.StoreConnection.ConnectionString)
                Dim query As ObjectQuery = CType(Result, ObjectQuery)
                Dim Cmd As SqlCommand = New SqlCommand(query.ToTraceString, SQLCon)
                For Each param In query.Parameters
                    Cmd.Parameters.AddWithValue(param.Name, param.Value)
                Next
                Dim da As SqlDataAdapter = New SqlDataAdapter(Cmd)
                Dim dt As DataTable = New DataTable
                da.Fill(dt)
                Return dt
            Catch ex As Exception
                Throw
            End Try
        End Function
    Proposition 2 : Je vais tester pour voir si elle fonctionne. Brancher le report sur un dataset créé dans le projet. Remplir le dataset avec les données extraites de l'EF via requêtes linq. Puis affecter le datasource du report avec le dataset ainsi créé :

    Dans l'attente d'une solution officielle venant d'un expert du domaine, je vais partir sur ces solutions, 1 ou 2 en fonction de mon besoin.
    Je conserve donc cette discussion ouverte car à mon sens, la solution que je propose n'est pas la plus performante.
    A suivre...

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2004
    Messages : 92
    Points : 79
    Points
    79
    Par défaut Réponse directe de chez SAP
    I would highly recommend not using more than one table like this in the report for a couple of reasons:

    - Due to security restrictions in the .NET framework the datasets have to be marshaled from your application's memory space to our report engine's memory space. This can effectively double the memory being used for the dataset, and the more tables you have the slower this process is.

    - For Crystal dataset based data is not indexed, which means that when you join two or more tables together we need to do a row-by-row comparison on the links to read this data. What this means is that if the first table has 100 rows and is connected to a second table by a single field and the second table has 1000 rows there will be 100,000 comparisons. Add a third table with 1000 rows and you know have 100,000,000 comparisons.

    Because of the two items above we highly recommend to use the power of .NET dataset objects to do the linking and create your result set yourself then pass that to Crystal.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Etat crystal report avec plusieurs tables
    Par cyrux dans le forum VB.NET
    Réponses: 60
    Dernier message: 29/07/2009, 15h03
  2. appeler etat(crystal report) avec jdeveloper
    Par osman.amine dans le forum Struts 1
    Réponses: 2
    Dernier message: 19/09/2007, 08h52
  3. Help! Etat Crystal Report avec plusieurs diagrammes
    Par anneso108 dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 23/03/2006, 15h44
  4. Modifier l'emplacement des table crystal report avec VB
    Par Job dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 08/09/2005, 17h56
  5. Création et déploiement d'états Crystal Reports avec VS .NET
    Par Marie-Hélène dans le forum Visual Studio
    Réponses: 0
    Dernier message: 15/07/2004, 12h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo