Dataset et ListOf

Résolu
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 - 29 oct. 2016 à 11:36
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 - 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

6 réponses

cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
29 oct. 2016 à 12:47
 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
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
29 oct. 2016 à 13:34
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
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
29 oct. 2016 à 13:47
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
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
29 oct. 2016 à 13:58
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")

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
29 oct. 2016 à 20:16
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
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
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
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27 > Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024
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 !!!
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
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
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27 > Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024
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.
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
29 oct. 2016 à 21:32
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
0
Rejoignez-nous