Salut
J'ai un problème que je n'arrive pas à résoudre depuis pas mal de temps.
J'ai une Form sur laquelle j'ai placé un DataGridView , un bouton et deux Combobox .
Le DataGridView doit m'afficher le résultat d'une requete SQL qui consiste à extraire le nombre d'élèves qui ont une moyenne par matière comprise entre deux valeurs choisies dans les deux Combobox.
Voici les tables :
eleves (idelv,nom,pren,idcla#,....)
divisions (idcla,libcla,...)
ici divisions veut dire classes (pour éviter toute ambiguité avec les mots réservés de Visual Basic 2010 , j'ai choisis divisions au lieu de classes)
Donc une division contient un ou plusieurs élèves (relation un à plusieurs)
matieres (idmat,libmat)
trimestres (idtrim,libtrim,datedebut,datefin)
evals (idelv,idmat,idtrim,moyev,dev1,dev2,examen,moymat)
ici la table evals est relié aux trois tables : eleves , matieres , trimestres donc on a une clé primaire composée car pour connaitre les notes d'un élève on doit connaitre son ID (idelv) , la matière pour laquelle il a passé le controle (idmat) et le trimestre (idtrim)
Ce que je veux c'est de calculer le nombre d'élève d'une classe (division) donnée qui ont une moyenne par matière (champ "moymat" de la table evals) comprise entre deux valeurs que je choisis dans deux Combobox appellées : cbMin et cbMax qui ne sont pas bindés à une quelconque source de données (je les ai remplis manuellement par code) donc j'ai fait cette requete SQL :
Dim strSQL As String = "select m.libmat,count(v.idelv) as nbelv from evals v inner join eleves e on v.idelv =e.idelv inner join divisions d on e.idcla =d.idcla inner join matieres m on v.idmat =m.idmat inner join trimestres t on v.idtrim =t.idtrim where e.idcla ='" & cbDiv.SelectedValue.ToString & "' and v.idmat ='" & cbMat.SelectedValue.ToString & "' and v.idtrim = '" & cbTrim.SelectedValue.ToString & "' and v.moymat between " & cbMin.SelectedItem & " and " & cbMax.SelectedItem & " group by m.libmat"
Donc le DataGridView m'affichera normalement deux colonnes (selon la requete SQL) qui sont : libmat (libellée de la matière) et le nombre d'élèves "nbelv" .
J'ai ajouté 4 Unbound Columns , chacune d'elles représente le nombre d'élèves suivant l'intervalle choisi : 0 - 6.99 / 7 - 9.99 / 10 - 11.99 / 12 - 20
Un exemple :
Quand je choisis des deux Combobox cbMin et cbMax les valeurs suivantes :
cbMin = 0 et cbMax = 6.99 et après click sur btnCalcul , le DataGridView doit m'afficher le nombre d'élèves qui ont une moyenne par matière comprise entre 0 et 6.99 sur la Unbound Column que j'ai appellée : 0 - 6.99 et ainsi de suite ..
Donc les différentes opérations que je fais pour le calcul du nombre d'élèves qui ont une moyenne par matière comprise entre deux valeurs choisies dans les deux Combobox cbMin et cbMax :
1- Je sélectionne une division (classe) via le Combobox cbDiv
2- Je sélectionne une matière via le Combobox cbMat
3- Je sélectionne un trimestre via le Combobox cbTrim
4- Je sélectionne une valeur Min via cbMin
5- Je sélectionne une valeur Max via cbMax
6- Je clique sur le bouton btnCalcul
Lors de l'exécution , lorsque je clique un 1ère fois sur le bouton btnCalcul le DataGridView m'affiche normalement les données voulues mais lorsque je choisis une autre valeur Min et une autre valeur Max des deux Combobox cbMin et cbMax tout en gardant les valeurs des autres Combobox , le DataGridView m'affiche les colonnes en double , une 3ème exécution de mon prog et il m'affiche les colonnes en triple ...etc je ne comprends pas pourquoi où se situe le problème , je doute sur les Unbound Columns que j'ai ajouté car ils ne sont liées à la base de données.
Je n'arrive pas à faire associer la valeur retournée par COUNT(v.idelv) aux différentes Unbound Columns : 0 - 6.99 / 7 - 9.99 / 10 - 11.99 / 12 - 20
Voici mon code :
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
| Private Sub btnCalcul_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalcul.Click
cn.ConnectionString = strcon
Dim strSQL As String = "select m.libmat,count(v.idelv) from evals v inner join eleves e on v.idelv =e.idelv inner join divisions d on e.idcla =d.idcla inner join matieres m on v.idmat =m.idmat inner join trimestres t on v.idtrim =t.idtrim where e.idcla ='" & cbDiv.SelectedValue.ToString & "' and v.idmat ='" & cbMat.SelectedValue.ToString & "' and v.idtrim = '" & cbTrim.SelectedValue.ToString & "' and v.moymat between " & cbMin.SelectedItem & " and " & cbMax.SelectedItem & " group by m.libmat"
Dim daMoyMat As New SqlDataAdapter(strSQL, cn)
Dim dsMoyMat As New DataSet
dtMoyMat = dsMoyMat.Tables("evals")
If cn.State Then cn.Close()
cn.Open()
dsMoyMat.Clear()
daMoyMat.Fill(dsMoyMat,"evals")
cn.Close()
dgvMoyMat.DataSource = dsMoyMat
dgvMoyMat.DataMember = "evals"
dgvMoyMat.Columns(0).ReadOnly = True
dgvMoyMat.Columns(0).HeaderText = "La Matière"
dgvMoyMat.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
dgvMoyMat.AutoGenerateColumns = False
Dim txtboxInterv1column As New DataGridViewTextBoxColumn
With txtboxInterv1column
.HeaderText = "0 - 6.99"
.Name = "interv1"
.DisplayIndex = 1
End With
dgvMoyMat.Columns.Add(txtboxInterv1column)
Dim txtboxInterv2column As New DataGridViewTextBoxColumn
With txtboxInterv2column
.HeaderText = "7 - 9.99"
.Name = "interv2"
.DisplayIndex = 2
End With
dgvMoyMat.Columns.Add(txtboxInterv2column)
Dim txtboxInterv3column As New DataGridViewTextBoxColumn
With txtboxInterv3column
.HeaderText = "10 - 11.99 "
.Name = "interv3"
.DisplayIndex = 3
End With
dgvMoyMat.Columns.Add(txtboxInterv3column)
Dim txtboxInterv4column As New DataGridViewTextBoxColumn
With txtboxInterv4column
.HeaderText = "12 - 20 "
.Name = "interv4"
.DisplayIndex = 4
End With
dgvMoyMat.Columns.Add(txtboxInterv4column)
End Sub |
Voilà j'éspère que je n'ai rien oublié et Merci d'avance pour tout ce vous faites
Partager