Base de donnée : regroupement de champs (en ado.net)

[Résolu]
Signaler
Messages postés
288
Date d'inscription
mercredi 4 mai 2005
Statut
Membre
Dernière intervention
26 janvier 2012
-
Messages postés
288
Date d'inscription
mercredi 4 mai 2005
Statut
Membre
Dernière intervention
26 janvier 2012
-
Bon salut les gars..

Je suis entrain de faire en bricolage assez couteux en temps, mais je suis sur que quelqu'un peu faire parler sa classe, et me donner une meilleur méthode.

Voilà le topo : je veux regrouper les champs d'une table ayant la même valeur dans une certaine colonne, schématiquement passer de :

x1 | y1 | z1
x1 | y2 | z2
x3 | y3 | z3

à :

x1 | y1 + y2 | z1 + z2
x3 |     y3     |      z3

Ne fuyez pas c'est un exercice de base, le problème c'est que j'ai pas l'impression d'employer la méthode la plus judicieuse, je fais :

1-écriture de toutes les données
2-"select distinct valeur from matable"
3-pour chaque valeur : "select matable.* where valeur like '"+ _ +"'"
4- Somme des éléments et destruction des lignes inutiles

Quelqu'un voit-il une meilleure solution ?

.Maytheforcebewithyou.Maxime.

7 réponses

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Tu peux peut-etre essayer une requette du type :

Select X, SUM(Y), SUM(Z) Form TaTable Group By X

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Et non !
Agregation est plus ou moins synonyme de groupement.

Bref, dans le cas présent, lorsque tu utilise Group By, il doit porter sur tous les paramètres simples que tu  as en résultat de ta requette.
En plus clair, ID et artikelnr sont des paramètres simples, ce sont des champs de ta table.
A contrario, sum(menge) est un champ complexe, en fait le résultat d'une formule de calcul.
Donc Group By doit porter sur ID et artikelnr :

 Dim str As String = "Select ID, artikelnr, sum(menge) from sigma Group By artikelnr,ID"

Sauf que, comme je le pressent, si ID est un identifiant unique, ta somme ne vas plus se faire.
Ou plus exactement, elle va se faire sur chacne des lignes de la table, au lieu d'un groupe de requette.
Le but de Group By est de regrouper les lignes de ta table de sorte à éliminer les doublons sur la combinaison des paramètres qui lui sont passés.
Si ID est effectivement un identifiant unique, il n'y aura, normalement pas de doublons dessus, donc pas de regroupement.

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
288
Date d'inscription
mercredi 4 mai 2005
Statut
Membre
Dernière intervention
26 janvier 2012
1
Merci tu m'as donné une piste..

En fait t'as requête ne plait pas à mon ado.net, par contre on peut utiliser la fonction 'sum', via la méthode 'compute' d'un datatable..

J'ai pas pondu le code exact, si ça intéresse quelqu'un je le colle ici quand ça marchera :)

.Maytheforcebewithyou.Maxime.
Messages postés
288
Date d'inscription
mercredi 4 mai 2005
Statut
Membre
Dernière intervention
26 janvier 2012
1
ah ça pique les yeux... au secours je peux pas éditer... TA requête, pardon aux familles tout ça

.Maytheforcebewithyou.Maxime.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
t'inquiète, on est blindé, on en voit de pire

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
288
Date d'inscription
mercredi 4 mai 2005
Statut
Membre
Dernière intervention
26 janvier 2012
1
En fait je suis peut allé un peu vite.

Apparemment il m'accepte ta requete, casy.. le problème, c'est qu'il me prend ça :

Dim str As String = "Select artikelnr, sum(menge) from sigma Group By artikelnr"

et pas :

Dim str As String = "Select ID, artikelnr, sum(menge) from sigma Group By artikelnr"

et que sans l'ID, je peux pas updater ma base... :(

-a comprend pas-
il me dit (traduction maison, j'ai le vb allemand) : "vous essayer de faire une requête avec l'expression 'ID' qui ne fait pas partit de la fonction d'aggrégation" <- il entend par là la fonction 'SUM' a mon avis..

Casy, si tu repasses par ici.. :)

.Maytheforcebewithyou.Maxime.
Messages postés
288
Date d'inscription
mercredi 4 mai 2005
Statut
Membre
Dernière intervention
26 janvier 2012
1
T'as tout bon casy..

Donc pour résumer, les mots clés sum(x) et group by ne font pas tout, mais mache une partie du travail..

Procédure utilisée qui marche pour ceux qui repasserait par là :

-écriture des données dans la base
-requete utilisant 'sum et group by' dans un dataset
-vider la base
-ecriture de chaque ligne du dataset 'groupé' avec affectation de l'id

ctrl + v (attention y'a des mots allemands qui peuvent piquer les yeux mais l'idée est là) :

Dim str As String = "Select artikelnr, parttype, footprint, bez, bez2, bez3, abmess, matspez, sum(menge) from sigma Group By artikelnr, parttype, footprint, bez, bez2, bez3, abmess, matspez"
            Dim dastr As New OleDbDataAdapter(str, OleDbConnection4)
            Dim dst As New DataSet()
            Dim ff, gg As Integer
            gg = dastr.Fill(dst)
            Dim dsk As String = "select sigma.* from sigma"
            Dim dak As New OleDbDataAdapter(dsk, OleDbConnection4)
            Dim dk As New DataSet()
            dak.Fill(dk)
            dk.Clear()
            Dim ock As OleDbCommandBuilder = New OleDbCommandBuilder(dak)
            dak.UpdateCommand = ock.GetUpdateCommand
            dak.Update(dk)
            For ff = 0 To gg - 1
                Dim dr As DataRow = dk.Tables(0).NewRow
                dr("id") = ff + 1
                dr("artikelnr") = dst.Tables(0).Rows(ff)("artikelnr")
                dr("parttype") = dst.Tables(0).Rows(ff)("parttype")
                dr("footprint") = dst.Tables(0).Rows(ff)("footprint")
                dr("bez") = dst.Tables(0).Rows(ff)("bez")
                dr("bez2") = dst.Tables(0).Rows(ff)("bez2")
                dr("bez3") = dst.Tables(0).Rows(ff)("bez3")
                dr("menge") = dst.Tables(0).Rows(ff)("expr1008")
                dr("abmess") = dst.Tables(0).Rows(ff)("abmess")
                dr("matspez") = dst.Tables(0).Rows(ff)("matspez")
                dk.Tables(0).Rows.Add(dr)
            Next
            Dim ocxi As OleDbCommandBuilder = New OleDbCommandBuilder(dak)
            dak.InsertCommand = ocxi.GetInsertCommand
            dak.Update(dk)

.Maytheforcebewithyou.Maxime.