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 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
| Private Sub cmd_matieres_calculerMM_Click()
' 2020-08-24 calculer la moyenne MM pour une classe d'élèves
' pour toutes les matières (avec an moins une note)
' avec des notes MD et CP comprises entre 2 dates
' Hypothèses:
' 1 éléve appartient à une classe
' 1 devoir est appartient à une classe
' certains élèves peuvent manquer un devoir, une composition
' le calcul peut se faire sur plusieurs devoirs, sur plusieurs compositions (même s'il n'y a qu'une seule CP en principe)
Dim s1 As String, strSQL As String
Dim db1 As DAO.Database, rs1 As DAO.Recordset, rs2 As DAO.Recordset, rs3 As DAO.Recordset
If IsNull(Me.classe_num) Then
MsgBox "vous devez saisir une classe", vbInformation
Exit Sub
End If
If IsNull(Me.date_deb) Or IsNull(Me.date_fin) Then
MsgBox "vous devez saisir une date début et une date de fin", vbInformation
Exit Sub
End If
' déclarer une instance de l'application
Set db1 = CurrentDb
' élèves de la classe
strSQL = "SELECT Eleve_id, NomPrenom FROM R_classe_eleve" _
& " WHERE Classe_id=" & Me.classe_num _
& " GROUP BY Eleve_id, NomPrenom;"
Set rs2 = db1.OpenRecordset(strSQL, dbOpenSnapshot)
If rs2.RecordCount = 0 Then
MsgBox "Il n'y a aucun élève dans cette classe", vbInformation
Exit Sub
End If
' Boucle sur les matières avec devoirs valides dans cette période
s1 = "Classe_id =" & Me.classe_num _
& " AND format(devoir_date,'yyyymmdd') >= '" & Format(Me.date_deb, "yyyymmdd") & "'" _
& " AND format(devoir_date,'yyyymmdd') <= '" & Format(Me.date_fin, "yyyymmdd") & "'"
strSQL = "SELECT Matiere_id" _
& " FROM (SELECT Classe_id, Matiere_id, Devoir_id, Devoir_valide, Devoir_date" _
& " FROM T_DEVOIR" _
& " WHERE Devoir_valide = True AND " & s1 & ")" _
& " GROUP BY Matiere_id"
Debug.Print strSQL
Set rs1 = db1.OpenRecordset(strSQL, dbOpenSnapshot)
If rs1.RecordCount = 0 Then
MsgBox "Il n'y a aucun devoir noté pour cette classe dans la période saisie", vbInformation
Exit Sub
End If
' préparer la table temporaire
' 2020-10-20 modif
strSQL = "DELETE FROM T_TEMP_MATIERE_MM " _
& " WHERE Classe_id= " & Me.classe_num & " AND semestre = '" & Nz(Me.Sem_libelle) & "'"
db1.Execute strSQL
rs1.MoveLast
rs1.MoveFirst
' boucle sur les matière de la classe
While Not rs1.EOF
rs2.MoveLast
rs2.MoveFirst
' Boucle sur les élèves de la classe
While Not rs2.EOF
' nb et note moyenne des devoirs par matière pour cet eleve
strSQL = "SELECT Classe_id, matiere_id, eleve_id, DevoirType_libelle, Count(Note_valeur) AS nbDeNotes, Sum(Note_valeur) AS sumDeNotes" _
& " FROM R_classe_eleve_note" _
& " WHERE Classe_id =" & Me.classe_num _
& " AND Matiere_id =" & rs1!Matiere_id _
& " AND format(devoir_date,'yyyymmdd') >= '" & Format(Me.date_deb, "yyyymmdd") & "'" _
& " AND format(devoir_date,'yyyymmdd') <= '" & Format(Me.date_fin, "yyyymmdd") & "'" _
& " AND Eleve_id =" & rs2!Eleve_id _
& " GROUP BY Classe_id, matiere_id, Eleve_id, DevoirType_libelle" _
& " HAVING DevoirType_libelle = 'DV'"
Debug.Print strSQL
Set rs3 = db1.OpenRecordset(strSQL, dbOpenSnapshot)
Debug.Print rs3.RecordCount
If rs3.RecordCount > 0 Then
strSQL = "INSERT INTO T_TEMP_MATIERE_MM " _
& " (Classe_id, Matiere_id, Eleve_id, semestre, date_debut, date_fin, DV_nb, DV_moy) VALUES" _
& " (" & Me.classe_num & "," & rs1!Matiere_id & "," & rs2!Eleve_id & ",'" & Me.Sem_libelle _
& "', #" & Format(Me.date_deb, "mm/dd/yyyy") & "# , #" & Format(Me.date_fin, "mm/dd/yyyy") & "#," _
& rs3!nbDeNotes & ",'" & Round(rs3!SumDeNotes / rs3!nbDeNotes, 2) & "')"
Debug.Print strSQL
db1.Execute strSQL
Debug.Print db1.RecordsAffected
Else
' aucun DV
strSQL = "INSERT INTO T_TEMP_MATIERE_MM " _
& " (Classe_id, Matiere_id, Eleve_id, semestre, date_debut, date_fin, DV_nb, DV_moy) VALUES" _
& " (" & Me.classe_num & "," & rs1!Matiere_id & "," & rs2!Eleve_id & ",'" & Me.Sem_libelle _
& "', #" & Format(Me.date_deb, "mm/dd/yyyy") & "# , #" & Format(Me.date_fin, "mm/dd/yyyy") & "#," _
& 0 & ",'0')"
db1.Execute strSQL
Debug.Print db1.RecordsAffected
End If
' nb et note moyenne des CP pour cet eleve (en principe : nb CP = 1)
strSQL = "SELECT Classe_id, matiere_id, Eleve_id, DevoirType_libelle, Count(Note_valeur) AS nbDeNotes, Sum(Note_valeur) AS sumDeNotes" _
& " FROM R_classe_eleve_note" _
& " WHERE Classe_id =" & Me.classe_num _
& " AND Matiere_id =" & rs1!Matiere_id _
& " AND format(devoir_date,'yyyymmdd') >= '" & Format(Me.date_deb, "yyyymmdd") & "'" _
& " AND format(devoir_date,'yyyymmdd') <= '" & Format(Me.date_fin, "yyyymmdd") & "'" _
& " AND Eleve_id =" & rs2!Eleve_id _
& " GROUP BY Classe_id, Matiere_id, Eleve_id, DevoirType_libelle" _
& " HAVING DevoirType_libelle = 'CP'"
Debug.Print strSQL
Set rs3 = db1.OpenRecordset(strSQL, dbOpenSnapshot)
Debug.Print rs3.RecordCount
If rs3.RecordCount > 0 Then
strSQL = "UPDATE T_TEMP_MATIERE_MM SET " _
& " CP_nb =" & rs3!nbDeNotes & "," _
& " CP_moy = '" & Round(rs3!SumDeNotes / rs3!nbDeNotes, 2) & "' " _
& " WHERE Classe_id =" & Me.classe_num _
& " AND Matiere_id =" & rs1!Matiere_id _
& " AND Eleve_id =" & rs2!Eleve_id _
& " AND date_debut = #" & Format(Me.date_deb, "mm/dd/yyyy") & "#"
Debug.Print strSQL
db1.Execute strSQL
Debug.Print db1.RecordsAffected
Else
' pas de CP
strSQL = "UPDATE T_TEMP_MATIERE_MM SET " _
& " CP_nb = 0 ," _
& " CP_moy = 0 " _
& " WHERE Classe_id =" & Me.classe_num _
& " AND Matiere_id =" & rs1!Matiere_id _
& " AND Eleve_id =" & rs2!Eleve_id _
& " AND date_debut = #" & Format(Me.date_deb, "mm/dd/yyyy") & "#"
Debug.Print strSQL
db1.Execute strSQL
Debug.Print db1.RecordsAffected
End If
NEXT_ELEVE:
rs2.MoveNext
Wend
NEXT_MATIERE:
rs1.MoveNext
Wend
' Calcul de MM
Call ComputeMM ' programme ci-dessous
MsgBox "Traitement terminé"
Exit_0:
Set rs3 = Nothing
Set rs2 = Nothing
Set rs1 = Nothing
Set db1 = Nothing
End Sub |
Partager