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

Résolu
TrafMaxime Messages postés 288 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 26 janvier 2012 - 30 mai 2008 à 15:28
TrafMaxime Messages postés 288 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 26 janvier 2012 - 4 juin 2008 à 14:14
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

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
30 mai 2008 à 15:38
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
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
30 mai 2008 à 18:59
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
3
TrafMaxime Messages postés 288 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 26 janvier 2012 1
30 mai 2008 à 16:13
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.
0
TrafMaxime Messages postés 288 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 26 janvier 2012 1
30 mai 2008 à 16:14
ah ça pique les yeux... au secours je peux pas éditer... TA requête, pardon aux familles tout ça

.Maytheforcebewithyou.Maxime.
0

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

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
30 mai 2008 à 16:18
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
0
TrafMaxime Messages postés 288 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 26 janvier 2012 1
30 mai 2008 à 16:26
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.
0
TrafMaxime Messages postés 288 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 26 janvier 2012 1
4 juin 2008 à 14:14
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.
0
Rejoignez-nous