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 :

Classement 1ER,2ème,3ème selon la moyenne dans un datagrid


Sujet :

VB.NET

  1. #1
    Membre du Club
    Inscrit en
    Mars 2013
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 70
    Points : 40
    Points
    40
    Par défaut Classement 1ER,2ème,3ème selon la moyenne dans un datagrid
    bonjour
    je voudrais vous solliciter pour savoir comment je puis faire un classement selon la moyenne de chacun.
    et comment afficher le résultat dans un datagrid ou une listview,etc/
    j'ai essayé ceci mais je ne sais pas comment ajouter le rang de chacun.
    je voudrais que celui qui a la plus forte moyenne se voit afficher en face 1ER et ainsi de suite.
    Voici mon code :
    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
      Try
     
     
                Using conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\KEUNENE-PC\ecole\ecole.mdb;")
                    conn.Open()
                    Dim command As New OleDbCommand("SELECT nom, année_scolaire,AVG(note) from moyenne  where  année_scolaire = '" & annee.Text & "'  GROUP BY inom,année_scolaire order by AVG(note) desc", conn)
                    Dim adapter As New OleDbDataAdapter
                    Dim dt As New DataTable
                    adapter.SelectCommand = command
                    adapter.Fill(dt)
                    DataGridView1.DataSource = dt
     
                    adapter.Dispose()
                    command.Dispose()
                    conn.Close()
     
                End Using
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
    merci infiniment pour vos aides!

  2. #2
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Bonjour,

    Tu as les solutions SQL, qui sont parfois un peu compliqué :

    - table temporaire :
    http://www.developpez.net/forums/d16...equete-select/
    - Il paraitrait aussi qu'il y a une fonction ROW_NUMBER:
    http://www.brainstormsolutions.ca/bl...e-requete-sql/

    Mais en l'occurence, toi, su le veux juste dans ton DGV.

    Donc tu as aussi la solution de te créer un DGV avec une colonne en plus, et avec une petite boucle, venir remplir cette colonne à la fin du remplissage. (Pour moi la solution la plus simple).
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par mactwist69 Voir le message
    Donc tu as aussi la solution de te créer un DGV avec une colonne en plus, et avec une petite boucle, venir remplir cette colonne à la fin du remplissage. (Pour moi la solution la plus simple).
    Cela dépend la matière que l'on maîtrise le mieux.

    Personnellement, je trouve l'ajout de cette colonne directement dans la requête SQL plus pratique. Mais c'est une question de point de vue.

    Pour info, la requête donnerait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT    
        NOM AS 'NOM',    
        ANNEE_SCOLAIRE AS 'ANNEE SCOLAIRE',
        AVG(NOTE) AS 'MOYENNE',
        ROW_NUMBER() OVER(PARTITION BY AVG(NOTE), ORDER BY AVG(NOTE) DESC)
    FROM
        MOYENNE
    WHERE
        ANNEE_SCOLAIRE = @ANNEE
    GROUP BY
        NOM,
        ANNEE_SCOLAIRE
    ORDER BY
        AVG(NOTE) DESC
    où @ANNEE est un paramètre contenant la valeur de filtrage.

    Concernant le code du message de départ, j'aurai plusieurs remarques :
    1. Il est fortement conseillé d'utiliser les requêtes paramétrées. Cela vous évitera des problèmes de typage et de sécurité. On voit dans votre requête que vous passez l'année comme étant une chaîne de caractères alors que cela devrait être un entier (ou un short éventuellement). Cela indique de possibles erreurs dans votre schéma de données.
    2. N'utilisez pas de caractères accentués dans les noms des colonnes de vos tables. En fait, dans les noms d'aucun objet (DB, table, colonne, variable, etc.) ! C'est une bonne habitude à prendre.
    3. La ligne conn.Close() est inutile du fait de l'utilisation d'un bloc Using.
    4. Pensez à renommer vos contrôles graphiques de manières appropriées. C'est également une bonne habitude à prendre. Le nom DataGridView1 est équivoque. Vous vous y retrouverez tant que vous n'aurez qu'un ou deux contrôles de ce type sur un formulaire mais après, cela peut vite provoquer des erreurs. De plus, si vous revenez dans quelques mois sur votre code, vous serez bien content de l'avoir nommé correctement pour savoir à quoi sert ce contrôle rien qu'en regardant le code sans devoir aller regarder l'interface graphique (gain de temps énorme).
    Kropernic

  4. #4
    Membre du Club
    Inscrit en
    Mars 2013
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 70
    Points : 40
    Points
    40
    Par défaut
    merci bien pour vos attentions.cependant j'ai l'impression que row number() ne fonctionne pas avec access 2007 et 2010.Est_ce qu'il n'y a pas d'autres solutions à ce problème?
    je suis allé sur le site de microsoft et ils disent que cette fonction marche avec sql server ET WINDOWS AZUR 2008 et plus
    j'arrive à faire le rang dans un combobox ou dans un checklistbox mais pas dans un datagrid avecc ce code.
    Mais comment le mettre dans un datagrid:
    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
     Try
     
     
                Dim Mycommand As OleDbCommand = MyConnexion.CreateCommand()
     
                Mycommand.CommandText = " SELECT DISTINCT  count (idno) AS NOMBRE_NOTES,nom,AVG(note) as Moyenne_trimestrielle FROM notio  where classe = '" & classe.Text & "' and trimestre = '" & trimestre.Text & "' and année_scolaire = '" & annee.Text & "' and matière = '" & statut.Text & "' group by idno,noms order by AVG(note) desc "
                MyConnexion.Open()
     
                Dim myReader As OleDbDataReader = Mycommand.ExecuteReader()
     
                Do While myReader.Read()
     
                    Label11.Text = myReader(0)
     
                    ComboBox2.Text = Label11.Text
     
                    Dim MonTableau(CInt(ComboBox2.Text) - 1) As Integer
     
                    For i As Integer = 0 To CInt(ComboBox2.Text) - 1
                        MonTableau(i) = i + 1
                    Next
                    Me.ComboBox2.DataSource = MonTableau
     
     
                    Me.Box1.DataSource = MonTableau
     
     
     
                Loop
     
                myReader.Close()
     
                MyConnexion.Close()
     
     
            Catch ex As Exception
     
                MsgBox(ex.ToString)
            End Try

  5. #5
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Effectivement, ROW_NUMBER, c'est pour SQL SERVER. Vu qu'on en parlait, j'ai donné la requête. J'ai pas cherché à savoir quelle était ta base de données (en même temps, tu ne le signales et je ne lis pas toujours les codes sources).

    Pour trouvé l'équivalent en access, il y a ceci.
    Kropernic

  6. #6
    Membre du Club
    Inscrit en
    Mars 2013
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 70
    Points : 40
    Points
    40
    Par défaut
    j'ai fait ce que vous m'avez dit et ça marche.Mais ça fait le rang selon l'identifiant,mais pas selon la moyenne.
    J'ai tourné le code dans tous les sens possibles et j'ai compris qu'il ne peut pas faire le rang selon la moyenne parceque tout simplement les moyennes générées ne sont pas dans la table mais sont générées temporairement.Je suis convaincu pourtant qu'il y a une solution car j'ai déjà vu des logiciels classés selon la moyenne.Merci encore

  7. #7
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Montre-nous la requête qui te donne le rang suivant l'identifiant. ;-)
    Kropernic

  8. #8
    Membre du Club
    Inscrit en
    Mars 2013
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 70
    Points : 40
    Points
    40
    Par défaut
    voici mon code:
    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
      Private Sub classement_Click(sender As Object, e As EventArgs) Handles classement.Click
            Try
     
     
                Using conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\KEUNENE-PC\ecole\ecole.mdb;")
                    conn.Open()
                    Dim command As New OleDbCommand("SELECT id,nom,prenoms,annee_scolaire,trimestre,classe,count(id) AS NOMBRE_NOTES,AVG(notra) as moyenne_trimestrielle,(SELECT COUNT(*) FROM (SELECT DISTINCT id FROM notio) AS T2 WHERE T2.id >= T1.id) AS CLASSEMENT FROM notio AS T1  where classe = '" & classe.Text & "' and trimestre = '" & trimestre.Text & "' and année_scolaire = '" & annee.Text & "'  GROUP BY id,nom,prenoms,annee_scolaire,trimestre,classe,rang ORDER BY AVG(notra) DESC", conn)
                    Dim adapter As New OleDbDataAdapter
                    Dim dt As New DataTable
                    adapter.SelectCommand = command
                    adapter.Fill(dt)
                    DataGridView1.DataSource = dt
     
                    adapter.Dispose()
                    command.Dispose()
                    conn.Close()
     
                End Using
                Label7.Visible = True
                Label7.Text = " moyenne  annuelle"
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
        End Sub
    là où il y a id,je l'ai remplacé par d'autres champs et cela ne me fait pas le rang selon les moyennes.

  9. #9
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Ah oui c'est juste ! La DB est Access...

    A vue de pif, changer le filtre (et p-e aussi dans la clause select) dans votre sous requête qui forme T2.

    Sinon, ce problème est en fait un problème access voir sql et pas du tout de vb.net. Vous aurez p-e de meilleures réponses dans le forum correspondant.
    Kropernic

Discussions similaires

  1. [MySQL] classement 1er, 2ème
    Par keunene dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 16/12/2014, 16h23
  2. Réponses: 2
    Dernier message: 10/09/2009, 20h54
  3. Couleur differente selon un champ dans zone liste
    Par banbanne dans le forum Access
    Réponses: 1
    Dernier message: 14/03/2006, 10h50
  4. Ecrire du texte selon un angle dans un TImage
    Par kem dans le forum Composants VCL
    Réponses: 2
    Dernier message: 15/10/2005, 09h40
  5. Réponses: 2
    Dernier message: 23/06/2004, 13h56

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