Dataset et ListOf [Résolu]

cs_JMO 1850 Messages postés jeudi 23 mai 2002Date d'inscription 11 mai 2018 Dernière intervention - 29 oct. 2016 à 11:36 - Dernière réponse : cs_JMO 1850 Messages postés jeudi 23 mai 2002Date d'inscription 11 mai 2018 Dernière intervention
- 29 oct. 2016 à 22:02
Bonjour le Forum,

Je dispose de x fichiers xlsx ayant tous la même structure.

Onglet "HOSTS", je récupère dans une table les champs Trigramme, Client, Host et Planning.
Onglet "SERVICE", je récupère dans une autre table les champs Host, Service et Planning.
        Dim da As OleDb.OleDbDataAdapter
        Dim datasetIDMON As DataSet = New DataSet
        For Each file As String In IO.Directory.GetFileSystemEntries(pathroot)
            Dim cn As OleDbConnection = New OleDbConnection(ConnectionExcel(file.ToString))
            'MessageBox.Show(file.ToString)
            Dim queryHOSTS As String = "SELECT [TRIGRAMME],[Client],[Host],[PLANNING] FROM [HOSTS$] WHERE NOT([Host]='')"
            cn.Open()
            da = New OleDb.OleDbDataAdapter(queryHOSTS, cn)
            da.Fill(datasetIDMON, "HOSTS")

            Dim querySERVICES As String = "SELECT [Host],[Nom du service],[PLANNING] FROM [SERVICES$] WHERE NOT([PLANNING]='')"
            da = New OleDb.OleDbDataAdapter(querySERVICES, cn)
            da.Fill(datasetIDMON, "SERVICES")
            cn.Close()
            da.Dispose()
            cn.Dispose()
        Next

Je souhaite regrouper dans un datagridview, par un datasource, certains
 champs des deux onglets.

DataGridView1.ColumnCount = 6
DataGridView1.Columns(0).Name = "TRIG" ' issu de l'onglet HOSTS
DataGridView1.Columns(1).Name = "Client" ' issu de l'onglet HOSTS
DataGridView1.Columns(2).Name = "Equipement" ' issu de l'onglet SERVICES
DataGridView1.Columns(3).Name = "Planning Global" ' issu de l'onglet HOSTS
DataGridView1.Columns(4).Name = "Service" ' issu de l'onglet SERVICES
DataGridView1.Columns(5).Name = "Planning du service" ' issu de l'onglet SERVICES

J'ai créé deux classes
Public Class Host
    Public Property TRIGRAMME() As String
    Public Property Client() As String
    Public Property Host() As String
    Public Property Planning() As String
End Class

Public Class Service
    Public Property Host() As String
    Public Property Service() As String
    Public Property Planning() As String
End Class


En chargeant listofhost avec
        Dim listofhost As List(Of Host) = (From d In datasetIDMON.Tables("HOSTS").Rows
                                           Select New Host With {
                                               .TRIGRAMME = d.TRIGRAMME,
                                               .Client = d.Client,
                                               .Host = d.Host,
                                               .Planning = d.Planning
                                           }).ToList()

j'ai l'erreur
Une exception non gérée du type 'System.MissingMemberException' s'est produite dans Microsoft.VisualBasic.dll

Informations supplémentaires : Le membre public 'TRIGRAMME' du type 'DataRow' est introuvable.
Les deux datasets contiennent bien les enregistrements souhaités.
        For Each row As DataRow In datasetIDMON.Tables("HOSTS").Rows
            MessageBox.Show(row(0).ToString & Convert.ToChar(Keys.Tab) & row(1).ToString & Convert.ToChar(Keys.Tab) & row(2).ToString, "Onglet HOSTS")
        Next

        For Each row As DataRow In datasetIDMON.Tables("SERVICES").Rows
            MessageBox.Show(row(0).ToString & Convert.ToChar(Keys.Tab) & row(1).ToString & Convert.ToChar(Keys.Tab) & row(2).ToString, "Onglet SERVICES")
        Next

Pouvez-vous m'aider à corriger mes erreurs
Merci,
jean-marc
Afficher la suite 

Votre réponse

10 réponses

cs_JMO 1850 Messages postés jeudi 23 mai 2002Date d'inscription 11 mai 2018 Dernière intervention - 29 oct. 2016 à 12:47
0
Merci
 Bonjour à tous,

Continuant mes recherches, apparemment la solution se trouverait dans https://msdn.microsoft.com/fr-fr/library/bb386921(v=vs.110).aspx
Il faut effectuer une jointure entre les deux tables.

jean-marc
Commenter la réponse de cs_JMO
Whismeril 11624 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 juin 2018 Dernière intervention - 29 oct. 2016 à 13:34
0
Merci
Bonjour Jean-Marc

comme tu le sais, les bases de données ne sont pas mon fort, mais dans

Dim listofhost As List(Of Host) = (From d In datasetIDMON.Tables("HOSTS").Rows
                                           Select New Host With {
                                               .TRIGRAMME = d.TRIGRAMME,
                                               .Client = d.Client,
                                               .Host = d.Host,
                                               .Planning = d.Planning
                                           }).ToList() 
 

l'accès direct dans une ligne au champ d.Trigramme comme s'il s'agissait d'une propriété, ne me semble pas correct,
ne faut il pas faire
d("TRIGRAMME") comme dans cet exemple
https://msdn.microsoft.com/fr-fr/library/system.data.datatable.rows(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2
Commenter la réponse de Whismeril
cs_JMO 1850 Messages postés jeudi 23 mai 2002Date d'inscription 11 mai 2018 Dernière intervention - 29 oct. 2016 à 13:47
0
Merci
Bonjour Whismeril,

J'étais sûr que tu t'intéresserais à ce sujet !!!

Comme dit sur le précédent thread, j'avance avec

        Dim hosts As DataTable = datasetIDMON.Tables("HOSTS")
        Dim services As DataTable = datasetIDMON.Tables("SERVICES")

        Dim query = _
            From host In hosts.AsEnumerable() _
            Join service In services.AsEnumerable() _
            On host.Field(Of String)("Host") Equals _
            service.Field(Of String)("Host") _
            Select New With _
                   { _
                       .Trigramme = host.Field(Of String)("TRIGRAMME"), _
                       .Client = host.Field(Of String)("Client"), _
                       .NameService = service.Field(Of String)("Nom du service"), _
                       .PlanningGlobal = host.Field(Of String)("PLANNING"), _
                       .PlanningService = service.Field(Of String)("PLANNING") _
                   }

        ' Test pour contrôle
        MessageBox.Show(CStr(query.Count))
        For Each line In query

            MessageBox.Show(line.Trigramme & Environment.NewLine & _
                            line.Client & Environment.NewLine & _
                            line.NameService & Environment.NewLine & _
                            line.PlanningGlobal & Environment.NewLine & _
                            line.PlanningService)

        Next


Ce n'est pas au point mais je continuerai après le déjeuner.

Bonne journée,
@+
jean-marc
Commenter la réponse de cs_JMO
Whismeril 11624 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 juin 2018 Dernière intervention - 29 oct. 2016 à 13:58
0
Merci
La jointure est une solution puisque tu prends des données de 2 collections pour en faire une 3eme, 2 clauses from en est une autre.

Mais ta question était d'abord
j'ai l'erreur
Une exception non gérée du type 'System.MissingMemberException' s'est produite dans Microsoft.VisualBasic.dll

Informations supplémentaires : Le membre public 'TRIGRAMME' du type 'DataRow' est introuvable.

Donc avant d'aller voir la jointure, il fallait trouver comment accéder à TRIGRAMME, et aux autres champs tant qu'à faire.

Manifestement tu as trouvé
host.Field(Of String)("TRIGRAMME")

Commenter la réponse de Whismeril
cs_JMO 1850 Messages postés jeudi 23 mai 2002Date d'inscription 11 mai 2018 Dernière intervention - 29 oct. 2016 à 20:16
0
Merci
Bonsoir le Forum,

Problème résolu en utilisant la jointure de tables.
        ' Jointure des deux tables
        Dim hosts As DataTable = datasetIDMON.Tables("HOSTS")
        Dim services As DataTable = datasetIDMON.Tables("SERVICES")

        Dim query = _
            From host In hosts.AsEnumerable() _
            Join service In services.AsEnumerable() _
            On host.Field(Of String)("Host") Equals service.Field(Of String)("Host") _
            Where checkPlanning(host.Field(Of String)("PLANNING"), service.Field(Of String)("PLANNING")) = True _
            Select New With _
                   {.Client = host.Field(Of String)("TRIGRAMME") & " - " & host.Field(Of String)("Client"), _
                    .Serveur = host.Field(Of String)("Host"), _
                    .Service = service.Field(Of String)("Nom du service"), _
                    .PlanningGlobal = host.Field(Of String)("PLANNING"), _
                    .PlanningService = service.Field(Of String)("PLANNING") _
                   }
        ' Remplissage du DataGridView
        For Each row In query
            With DataGridView1.Rows
                .Add(row.Client, row.Serveur, row.Service, row.PlanningGlobal, row.PlanningService)
            End With
        Next


Pour Whismeril !!!
Merci de tes précédents conseils.
J'ouvrirai prochainement une nouvelle discussion sur l'utilisation de RegEx (tu en es un expert !) suite à la fonction checkPlanning utilisée dans ma quéry.

Bonne soirée,

jean-marc
Whismeril 11624 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 juin 2018 Dernière intervention - 29 oct. 2016 à 21:11
Pour remplir le datagridview
Datagridview1.Datasource = Queralh

Devrait suffire.


Pour les regex, je me débrouille, de là à être expert, il y a de la marge.
J'ai trouvé un site qui intègre les spécificités de .net pour tester les regex

http://regexstorm.net
cs_JMO 1850 Messages postés jeudi 23 mai 2002Date d'inscription 11 mai 2018 Dernière intervention > Whismeril 11624 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 juin 2018 Dernière intervention - 29 oct. 2016 à 21:21
Bonsoir Whismeril,

En utilisant
        Dim query = _
            From host In hosts.AsEnumerable() _
            Join service In services.AsEnumerable() _
            On host.Field(Of String)("Host") Equals service.Field(Of String)("Host") _
            Where checkPlanning(host.Field(Of String)("PLANNING"), service.Field(Of String)("PLANNING")) = True _
            Select New With _
                   {.Client = host.Field(Of String)("TRIGRAMME") & " - " & host.Field(Of String)("Client"), _
                    .Serveur = host.Field(Of String)("Host"), _
                    .Service = service.Field(Of String)("Nom du service"), _
                    .PlanningGlobal = host.Field(Of String)("PLANNING"), _
                    .PlanningService = service.Field(Of String)("PLANNING") _
                   }

        ' Initialisation du controle DataGridView
        With DataGridView1
            .ColumnCount = 5
            .Columns(0).Name = "Client"
            .Columns(1).Name = "Equipement"
            .Columns(2).Name = "Nom du service"
            .Columns(3).Name = "Planning Global de la fiche ID-Mon"
            .Columns(4).Name = "Planning du service"
            .Columns(1).Width = 200
            .Columns(2).Width = 200
            .Columns(3).Width = 200
            .Columns(4).Width = 200
        End With

        ' Remplissage du DataGridView
        DataGridView1.DataSource = query

Seul le header du datagridview s'affiche, j'ai du zappé une étape !!!
Whismeril 11624 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 juin 2018 Dernière intervention - 29 oct. 2016 à 21:42
ha au temps pour moi, tu as fait une header personnalisé, ça n'est pas compatible du binding direct.

Une option est d'utiliser un bindingsource, voir ici http://codes-sources.commentcamarche.net/faq/1291-utilisation-du-binding-au-travers-de-l-objet-databindingsource
cs_JMO 1850 Messages postés jeudi 23 mai 2002Date d'inscription 11 mai 2018 Dernière intervention > Whismeril 11624 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 juin 2018 Dernière intervention - 29 oct. 2016 à 22:02
Merci pour ce lien,
Jadis, je consultai régulièrement les tutoriels de Codes-Sources.
Avec ce site, je n'y pense pas. C'est une erreur de ma part.
J'ai survolé ton tutoriel et m'y remettrai demain.

Merci Whismeril.
Commenter la réponse de cs_JMO
cs_JMO 1850 Messages postés jeudi 23 mai 2002Date d'inscription 11 mai 2018 Dernière intervention - 29 oct. 2016 à 21:32
0
Merci
Whismeril,
Merci pour le lien que tu m'as déjà donné moult fois et que j'utilise !
Je suis en train d'écrire une littérature pour ma prochaine question.
D'ailleurs, avant de poser celle-ci, je vais évidemment tester avec Regex Storm.

@+
jean-marc
Commenter la réponse de cs_JMO

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.