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 :

3 datatables vers 1 mais en ne prenant que certaines colonnes.


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2006
    Messages : 130
    Par défaut 3 datatables vers 1 mais en ne prenant que certaines colonnes.
    Bonjour,

    Je tente de faire quelque chose de tout bête, mais je ne trouve pas de solution.

    Voilà, j'ai 3 datatables resultant de calculs ayant des bases différentes, ainsi suite à ces 3 "cas" on veut pouvoir calculer l'origine des écarts issu de ses 3 bases, est ainsi voir l'influence des différent paramètres.

    Je me suis donc fait un exemple de test, pour me développer une fonction qui va me combiner les résultats de certaines colonnes issu de ces 3 datatables.

    Voici mon exemple "source" représentant mes 3 datatables limité en nombre de colonnes afin de me concentrer sur la fonction de copie.

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
      Dim Dt1 As New DataTable
            Dim Dt2 As New DataTable
            Dim Dt3 As New DataTable
            Dim r As DataRow
     
            With Dt1
                .Columns.Add("id", GetType(Long))
                .Columns.Add("Nomid", GetType(String))
                .Columns.Add("val", GetType(Integer))
     
                r = .NewRow
                r("id") = 1
                r("Nomid") = "item1"
                r("val") = 1
                .Rows.Add(r)
     
                r = .NewRow
                r("id") = 2
                r("Nomid") = "item2"
                r("val") = 10
                .Rows.Add(r)
     
                r = .NewRow
                r("id") = 3
                r("Nomid") = "item3"
                r("val") = 15
                .Rows.Add(r)
            End With
            '---
     
            With Dt2
                .Columns.Add("id", GetType(Long))
                .Columns.Add("Nomid", GetType(String))
                .Columns.Add("valeur", GetType(Integer))
     
                r = .NewRow
                r("id") = 1
                r("Nomid") = "item1"
                r("valeur") = 100
                .Rows.Add(r)
     
                r = .NewRow
                r("id") = 2
                r("Nomid") = "item2"
                r("valeur") = 1000
                .Rows.Add(r)
     
                r = .NewRow
                r("id") = 3
                r("Nomid") = "item3"
                r("valeur") = 105
                .Rows.Add(r)
            End With
     
            With Dt3
                .Columns.Add("id", GetType(Long))
                .Columns.Add("Nomid", GetType(String))
                .Columns.Add("sansnom", GetType(Integer))
     
                r = .NewRow
                r("id") = 1
                r("Nomid") = "item1"
                r("sansnom") = -58
                .Rows.Add(r)
     
                r = .NewRow
                r("id") = 2
                r("Nomid") = "item2"
                r("sansnom") = 5612
                .Rows.Add(r)
     
                r = .NewRow
                r("id") = 3
                r("Nomid") = "item3"
                r("sansnom") = 0
                .Rows.Add(r)
            End With
     
     
            Dim lst1 As New List(Of String)
            lst1.Add("id")
            lst1.Add("Nomid")
            lst1.Add("val")
     
            Dim lst2 As New List(Of String)
            lst2.Add("valeur")
     
            Dim lst3 As New List(Of String)
            lst3.Add("sansnom")
     
     
            CombineDatatable(Dt1, lst1, Dt2, lst2, Dt3, lst3, "id")
    Je travaille donc sur ma fonction Combine datatable, qui va avoir pour but de dupliquer les 3 colonnes (id,Nomid,val) du 1er datatable, la colone valeur du 2ème datatable, la colone sansnom du 3eme datatable dans le nouveau datatable à partir d'un identifiant commun au 3 datatable : id
    Le résultat final devant me donner :

    id / Nomid / Val / valeur / sansnom
    1 / item1 / 1 / 100 / -58
    2 / item2 / 2 / 1000 / 5612
    3 / item3 / 3 / 105 / 0

    Voici donc ce que j'ai commencer à faire et ou mon problème ce pose :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
     Private Function CombineDatatable(ByRef dtSrcBoucle As DataTable, ByVal lstNomColBoucleToCopy As List(Of String), _
                                    ByRef dt2 As DataTable, ByVal lstNomColDt2ToCopy As List(Of String), _
                                    ByRef dt3 As DataTable, ByVal lstNomColDt3ToCopy As List(Of String), _
                                    ByVal strNomColCommunRelation As String) As DataTable
     
            Dim dtFinal As DataTable = New DataTable
     
            'dtFinal = dtSrcBoucle.Clone()
     
     
            Dim arrayCol(dt2.Columns.Count - 1) As DataColumn
            dt2.Clone.Columns.CopyTo(arrayCol, 0)
            For Each col As DataColumn In arrayCol
                If lstNomColBoucleToCopy.Contains(col.ColumnName) Then dtFinal.Columns.Add(col)
            Next
     
     
            Dim rowsTrouver As DataRow() = Nothing
            For i As Integer = 0 To dtSrcBoucle.Rows.Count - 1
     
                rowsTrouver = dt2.Select(strNomColCommunRelation & "=" & dtSrcBoucle.Rows(i)(strNomColCommunRelation))
     
                If rowsTrouver.Length > 0 Then
     
                End If
            Next
     
        End Function
    Mon soucis est que je ne peux pas effectuer de copie specifique à une colonne et l'intégré dans un autre datatable, j'ai donc tenté de recréer la structure des colonnes que je veux recopier pour ensuite remplir par les données, mais voilà dès que je veux copier la structure d'une colonne pour la mettre dans mon datatable final, je ne peux pas car celle-ci est toujours lié au datatable d'origine (d'ou mon clone pour voir si je pouvais m'en détacher). je ne trouve pas de moyen à par recopier une à une les différentes propriétés.

    Merci d'avance pour votre précieuse aide !

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2006
    Messages : 130
    Par défaut
    Voici ce que j'ai fais, mais je ne suis pas pleinement satisfait, ça fait plein de code... il doit y avoir moyen de faire mieux.

    Inititialisation des datatables et préparatifs avant l'appel au traitement + appel au traitement.

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
     
    Private Structure DatatableADupliquer
            Dim dtable As DataTable
            Dim lstColName As List(Of String)
        End Structure
     
    Private sub SourceTest
     Dim Dt1 As New DataTable
            Dim Dt2 As New DataTable
            Dim Dt3 As New DataTable
            Dim r As DataRow
     
            With Dt1
                .Columns.Add("id", GetType(Long))
                .Columns.Add("Nomid", GetType(String))
                .Columns.Add("val", GetType(Integer))
     
                r = .NewRow
                r("id") = 1
                r("Nomid") = "item1"
                r("val") = 1
                .Rows.Add(r)
     
                r = .NewRow
                r("id") = 2
                r("Nomid") = "item2"
                r("val") = 10
                .Rows.Add(r)
     
                r = .NewRow
                r("id") = 3
                r("Nomid") = "item3"
                r("val") = 15
                .Rows.Add(r)
            End With
            '---
     
            With Dt2
                .Columns.Add("id", GetType(Long))
                .Columns.Add("Nomid", GetType(String))
                .Columns.Add("valeur", GetType(Integer))
     
                r = .NewRow
                r("id") = 1
                r("Nomid") = "item1"
                r("valeur") = 100
                .Rows.Add(r)
     
                r = .NewRow
                r("id") = 2
                r("Nomid") = "item2"
                r("valeur") = 1000
                .Rows.Add(r)
     
                r = .NewRow
                r("id") = 3
                r("Nomid") = "item3"
                r("valeur") = 105
                .Rows.Add(r)
            End With
     
            With Dt3
                .Columns.Add("id", GetType(Long))
                .Columns.Add("Nomid", GetType(String))
                .Columns.Add("sansnom", GetType(Integer))
     
                r = .NewRow
                r("id") = 1
                r("Nomid") = "item1"
                r("sansnom") = -58
                .Rows.Add(r)
     
                r = .NewRow
                r("id") = 2
                r("Nomid") = "item2"
                r("sansnom") = 5612
                .Rows.Add(r)
     
                r = .NewRow
                r("id") = 3
                r("Nomid") = "item3"
                r("sansnom") = 0
                .Rows.Add(r)
            End With
     
     
            Dim lst1 As New List(Of String)
            lst1.Add("id")
            lst1.Add("Nomid")
            lst1.Add("val")
     
            Dim lst2 As New List(Of String)
            lst2.Add("valeur")
     
            Dim lst3 As New List(Of String)
            lst3.Add("sansnom")
     
     
            Dim el1 As DatatableADupliquer
            el1.dtable = Dt2
            el1.lstColName = lst2
     
            Dim el2 As DatatableADupliquer
            el2.dtable = Dt3
            el2.lstColName = lst3
     
     
            Dim lstDatatableADupliquer As List(Of DatatableADupliquer) = New List(Of DatatableADupliquer)
            lstDatatableADupliquer.Add(el1)
            lstDatatableADupliquer.Add(el2)
     
            CombineDatatable(Dt1, lst1, lstDatatableADupliquer, "id")
    End sub
    Partie Traitement + 2 sous sub

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
     Private Sub DupliqueStructureColonnes(ByRef dtableDest As DataTable, ByRef dtableSrc As DataTable, ByRef lstColName As List(Of String))
     
            Dim col As DataColumn
            For Each colName As String In lstColName
                col = New DataColumn
                With dtableSrc.Columns(colName)
                    col.AllowDBNull = .AllowDBNull
                    col.ColumnName = .ColumnName
                    col.DataType = .DataType
                End With
                dtableDest.Columns.Add(col)
            Next
     
        End Sub
     
     Private Sub DuppliqueContenuLigne(ByRef row As DataRow, ByRef dtableRecherche As DataTable, ByVal strSelectRech As Object, ByVal lstColName As List(Of String))
     
            Dim rowsTrouver As DataRow() = dtableRecherche.Select(strSelectRech)
            If rowsTrouver.Length > 0 Then
                For Each colName As String In lstColName
                    row(colName) = rowsTrouver(0)(colName)
                Next
            End If
     
        End Sub
     
        Private Function CombineDatatable(ByRef dtSrcBoucle As DataTable, ByVal lstNomColBoucleToCopy As List(Of String), _
                                          ByRef lstDatatableADupliquer As List(Of DatatableADupliquer), _
                                          ByVal strNomColCommunRelation As String) As DataTable
     
            Dim dtFinal As DataTable = New DataTable
     
            ' --- Duplication de la structure
            '1) depuis la source
            DupliqueStructureColonnes(dtFinal, dtSrcBoucle, lstNomColBoucleToCopy)
     
            '2) depuis les autres datatables
            For Each element As DatatableADupliquer In lstDatatableADupliquer
                DupliqueStructureColonnes(dtFinal, element.dtable, element.lstColName)
            Next
            '----
     
            Dim r As DataRow
            For i As Integer = 0 To dtSrcBoucle.Rows.Count - 1
                r = dtFinal.NewRow
     
                'Copie depuis la source
                For Each colName As String In lstNomColBoucleToCopy
                    r(colName) = dtSrcBoucle.Rows(i)(colName)
                Next
     
                'Copie depuis les autres datatable
                For Each element As DatatableADupliquer In lstDatatableADupliquer
                    DuppliqueContenuLigne(r, element.dtable, strNomColCommunRelation & "=" & dtSrcBoucle.Rows(i)(strNomColCommunRelation), element.lstColName)
                Next
     
                dtFinal.Rows.Add(r)
            Next
     
            Return dtFinal
     
        End Function

Discussions similaires

  1. Exporter Datatable vers Excel
    Par Chris@Xerox dans le forum Windows Forms
    Réponses: 16
    Dernier message: 11/06/2019, 13h14
  2. Imprimer que certaines colonnes (Datatable)
    Par ciolvic dans le forum jQuery
    Réponses: 2
    Dernier message: 12/05/2015, 11h53
  3. Export de table/datatable vers csv, xls, etc.
    Par goulmak dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 10/11/2009, 14h37
  4. Lien HTML vers Swf mais lire à partir d'une certaine image
    Par regulaetmarcetienne dans le forum Intégration
    Réponses: 0
    Dernier message: 16/12/2008, 16h09
  5. Export access vers excel mais pb quote
    Par ancylia dans le forum VBA Access
    Réponses: 2
    Dernier message: 24/06/2008, 09h50

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