Skip to content

NSI - Terminale - Activité base de données

Travail demandé

Partie 1: construire des requêtes SQL

Pour réaliser cette partie, vous allez utiliser une machine virtuelle Linux-mint sur laquelle a été installée le Système de Gestion de Base De Données (SGBDD) MariaDB.
Démarrez la machine virtuelle Linux-mint ( regardez si nécessaire la vidéo de mise en place d'une machine virtuelle en cliquant sur ce lien ).

Question 1.1

  • Regardez la vidéo intitulée "requetes_terminal.mp4" en cliquant sur ce lien
    Avec le terminal, connectez vous au SGBDD MariaDB avec le compte nsiuser dont le mot de passe est nsiuser,
    puis demandez d'utiliser la base de données gestion__notes comme montré dans la vidéo.
  • Affichez les tables présentes dans la base de données gestion__notes.
  • Faites une capture d'écran de votre commande et de la réponse de la SGBDD.

Question 1.2

  • Afficher le contenu de la table PROFESSEUR.
  • Faites une capture d'écran de votre commande et de la réponse de la SGBDD.
  • Saisissez la commande quit pour quitter la session.
  • Refermez le terminal.

Question 1.3

  • A partir de maintenant, vous allez utiliser le logiciel PHP myadmin. Regardez la vidéo "phpmyadmin.mp4" en cliquant sur ce lien
  • Écrivez une requête INSERT pour ajouter le devoir DS1 de la discipline NSI dans la table Devoir ( faîtes une capture d'écran à mettre dans le compte rendu).
  • Vérifiez que la requête s'est bien exécutée en consultant la table DEVOIR.
  • Faites une capture d'écran de votre commande et de la réponse de la SGBDD.

Question 1.4

  • Ecrivez une requête INSERT sur la table APPARTENIR pour ajouter les élèves Auboisdormant et Ozor en classe de 1G1.
  • Vérifiez que la requête s'est bien exécutée en consultant la table APPARTENIR.
  • Faites une capture d'écran de votre commande et de la réponse de la SGBDD.

Question 1.5

  • On vous donne ci-dessous la requête qui a permis de créer la table FAIRE.
    Cette table permet d'associer: une discipline, un devoir, un élève, la date du devoir et la note qu'a obtenue l'élève à ce devoir.

  • Précisez sur votre compte rendu les clés étrangères de la table FAIRE ainsi que sa clé primaire ( rappel: une clé primaire peut être constituée de plusieurs attributs qui sont souvent des clés primaires d'autres tables).

Question 1.6

  • Ecrivez la requête qui ajoute une note de 15.5, obtenue au devoir DS1 de mathématiques par l'élève Nordine Ozor. La note ayant été obtenue le 01/09/23 ce qui se note au format date SQL: ' 2023-09-01'
  • Ecrivez la requête qui ajoute une note de 13.5, obtenue au devoir DS2 de mathématiques par l'élève Nordine Ozor. La note ayant été obtenue le 19/09/23.
  • Vérifiez que vos requêtes se sont bien exécutées en consultant la table FAIRE.
  • Faites une capture d'écran de vos commandes et de la réponse de la SGBDD.

Question 1.7

  • Le prof de maths a oublié un point au devoir DS2 de mathématiques de l'élève Nordine Ozor, il faut donc mettre à jour la table FAIRE, pour remplacer la note de 13.5 par 14.5. Ecrivez la requête qui fait cette mise à jour.
  • Vérifiez que la requête s'est bien exécutée en consultant la table FAIRE.
  • Faites une capture d'écran de votre commande et de la réponse de la SGBDD.

Question 1.8

  • Ecrivez la requête qui calcule la moyenne de mathématiques de l'élève Nordine Ozor.

Question 1.9

  • Ecrivez la requête avec JOINTURE entre les tables AFFECTER et PROFESSEUR qui permet d'afficher le nom du professeur de mathématiques de la classe de 1G1.
  • Faites une copie de la requête et du résultat obtenu pour le compte rendu.

Question 1.10

  • Ecrivez la requête avec JOINTURE entre les tables APARTENIR et ELEVE qui permet d'afficher le nom et le prénom des élèves de seconde 1.
  • Faites une copie de la requête et du résultat obtenu pour le compte rendu.

Partie 2: interaction Python et Mysql

Dans cette partie vous allez créer une application python qui communique avec la base de données "gestion__notes", l'objectif sera de créer un logiciel qui permette de lire les résultats d'un élève et d'ajouter des notes. Vous devez utiliser python dans la machine virtuelle.

Principe

Pour communiquer avec le SGBDD mysql depuis python, vous devez utilisez le module mysql.connector de python. Le code ci-dessous vous montre le principe, les commentaires en vert expliquent les lignes de code qui suivent:
NE PAS TESTER LE CODE, JUSTE LIRE LES COMMENTAIRES QUI EXPLIQUENT LE CODE POUR ESSAYER DE COMPRENDRE LE PRINCIPE

 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
# importer le module mysql.connector:
import mysql.connector
# Pour éviter un plantage du code en cas d'erreur, on se connecte à la base avec une gestion d'exception bloc try-except
# bloc try
try: 
    # Création d'un objet connexion appelé cnx avec la méthode connect(...) de mysql.connector:
    # cnx donnera un accès à la base gestion__notes:
    cnx = mysql.connector.connect(user='nsiuser', password='nsiuser', database='gestion__notes')
    # Création d'un objet curseur appelé cursor avec la méthode cursor() de l'objet cnx.
    # Un objet curseur permet d'envoyer des requêtes SQL via sa méthode execute(...), 
    # l'objet curseur contient la réponse du SGBDD après une requête:
    cursor = cnx.cursor()
    # écriture d'une requête représentée par la variable la_requete
    # remarquez que la requête SQL est dans une chaîne de caractères:
    la_requete = "SELECT NOM_CLASS FROM CLASSE ORDER BY NOM_CLASS"
    # exécution de la requête avec la méthode execute(..)  de cursor:
    cursor.execute(la_requete)
    # comme résultat de la requête, on va recevoir une liste de tuples,
    # chaque tuple est une ligne de la table CLASSE, on va récupérer  le nom des classes dans les tuples,
    # les noms des classes seront stockés dans la liste python "liste_classes" qui au départ est créée vide:
    liste_classes = []
    # seul le premier terme de chaque tuple contient le nom de la classe, 
    # une boucle "for" parcourt un par un tous les tuples reçus par cursor,
    # durant l'exécution de la boucle, on ajoute l'élément 0 (premier terme du tuple) à la liste_classes:
    for element in cursor:
        liste_classes.append(element[0])
    # Affichage du contenu de la liste dans la console python:
    print(liste_classes)
    # Déconnexion de la base de données 
    cursor.close()
    cnx.close()
# gestion de l'exception si le try échoue
except mysql.connector.Error as error:
    print("Erreur base de données: {}".format(error))

Question 2.1

  • Lancez le logiciel VSCodium avec le raccourci du bureau de linux Mint:

  • Sélectionnez le dossier Python-scripts du volet de gauche puis cliquez gauche sur test.py:

Copiez_collez, dans le fichier test.py, tout le code python donné dans la partie principe au dessus de la question 2.1 et BIEN vérifier l'indentation des blocs de code notamment au niveau des blocs try et except.

Exécutez le code en cliquant sur la flèche en haut à gauche (entourée dans l'image ci-dessous):


Faites une copie du résultat obtenu dans la console. Concluez sur l'aptitude de python à communiquer à votre base de données.

Question 2.2

  • Modifiez la valeur de la chaîne affectée à la variable la_requete pour récupérer la liste des noms de disciplines ( cela revient à écrire une chaîne de caractères qui contient la requête SQL qui lit le champ NOM_DISC de la table DISCIPLINE), la ligne à modifier est:

1
2
# remarquez que la requête SQL est dans une chaîne de caractères affectée à la variable la_requete:
    la_requete = "SELECT NOM_CLASS FROM CLASSE ORDER BY NOM_CLASS"
Testez votre code, faites une copie du résultat obtenu pour le compte rendu.

Question 2.3

Vous allez maintenant voir comment récupérer plusieurs informations d'une table, par exemple, récupérons le nom et le prénom des professeurs. Vous remarquerez que le programme est similaire au précédent:

 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
# importer le module mysql.connector:

import mysql.connector

# Pour éviter un plantage du code en cas d'erreur on se connecte à la base avec une gestion d'exception try-except

try:
    # Création d'un objet connexion appelé cnx avec la méthode connect(...) de mysql.connector:
    # cnx est connecté à la base gestion_notes:

    cnx = mysql.connector.connect(user='nsiuser', password='nsiuser', database='gestion__notes')
    # Création d'un objet curseur appelé cursor avec la méthode cursor() de l'objet cnx.
    cursor = cnx.cursor()
    # écriture d'une requête représentée par la variable la_requete

    la_requete = "SELECT NOM_PROF, PRENOM_PROF FROM PROFESSEUR ORDER BY NOM_PROF"

    # exécution de la requête avec la méthode execute(..)  de cursor:

    cursor.execute(la_requete)

    # comme résultat de la requête, on va recevoir une liste de tuples,
    # chaque tuple est une ligne de la table PROFESSEUR,
    # les noms et prénoms seront stockés dans la liste "liste_professeurs" qui au départ est vide:

    liste_professeurs = []

    # durant l'exécution de la boucle, on ajoute avec la méthode append() l'élément 0 (le nom) et l'élément 1 (le prénom) de chaque tuple
    # à la liste_professeurs:

    for element in cursor:
        print (element)
        liste_professeurs.append((element[0], element[1]))

    # Affichage du contenu de la liste dans la console python:

    print(liste_professeurs)
    # Déconnexion de la base de données 
    cursor.close()
    cnx.close()
    # gestion de l'exception
except mysql.connector.Error as error:
    print("Erreur base de données: {}".format(error))
Voici le résultat de l'exécution du code, cursor contient 5 tuples, le code les ajoute à la liste "liste_professeurs" avec l'itérateur for à la ligne 24, la liste est ensuite affichée avec un print à la ligne 29:

  • Modifiez le code précédent pour récupérer le nom et le prénom de tous les élèves que vous afficherez dans la console python.
  • Testez le code, faites une copie du résultat obtenu pour le compte rendu.

Question 2.4

  • Modifiez le code précédent pour récupérer uniquement le nom et le prénom des élèves de seconde 1 que vous afficherez dans la console python ( revoir votre réponse à la question 1.10).

Question 2.5

Création d'une Interface Homme- Machine (IHM)
Le code python ci-dessous créé une IHM avec tkinter qui va permettre d'afficher les informations de la base de données dans une fenêtre:

 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
# importation des modules tkinter (pour créer les fenêtres et listes déroulantes) et du module mysql.connector
from tkinter import *
from tkinter.ttk import Combobox
import mysql.connector
# création de deux listes vides
list_classes = []
list_eleves_classe_selectionnée = []

# création d'un objet fenêtre appelé fen avec la méthode constructeur Tk() de Tkinter
fen = Tk()
# réglage de la taille de la fenêtre en pixels avec la méthode geometry(...)
fen.geometry("700x300")
# réglage du titre de la fenêtre avec la méthode title(...)
fen.title("IHM gestion Notes")
# Création de deux objets zones de textes (deux Labels), 
# on utilise la méthode grid() pour les positionner ( grid <=> grille), 
# l'objet lbl_titre_classe est dans la première case de la grille row = 0 (ligne=0) et Column = 0 (colonne=0)
lbl_titre_classe = Label(fen, text='Classes').grid(row=0, column=0)

# l'objet lbl_titre_élèves est dans la deuxième case de la première ligne de la grille,  
# avec un décalage horizontal (padx) de 10 px par rapport au bord de la case:

lbl_titre_élèves=Label(fen, text='Liste élèves').grid(row=0, column=1, padx=10)
# Création d'un objet liste-déroulante appelé combo_affichage_liste_classes
combo_affichage_liste_classes = Combobox(fen, value=list_classes)
# Positionnement de l'objet en ligne 1 et colonne 0 de la grille
combo_affichage_liste_classes.grid(row=1, column=0)
# Création d'un objet liste-déroulante appelé combo_affichage_liste_élèves_classe
combo_affichage_liste_élèves_classe = Combobox(fen, value=list_eleves_classe_selectionnée)
# Positionnement de l'objet en ligne 1 et colonne 1 de la grille et décalage de 10 px vers la droite selon x
combo_affichage_liste_élèves_classe.grid(row=1, column=1, padx=10)

# Appel de la méthode mainloop() qui inscrit la fenêtre aux évènements de Windows.
fen.mainloop()
Voici le résultat lors de l'exécution du code:

Testez ce code python, faites une copie du résultat obtenu pour le compte rendu.

Question 2.6

Ajout des données de la bdd à la liste Classes.
Pour pouvoir renseigner les données de la liste déroulante, il faut se connecter à la base de données et remplir la liste list_classes comme vu dans les questions précédentes.
Ici on écrit une fonction initialisation() qui initialise la liste des classes:

 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
from tkinter import *
from tkinter.ttk import Combobox
import mysql.connector
liste_classes = []
liste_eleves_classe_selectionnée = []

# définition de la fonction initialisation
def initialisation():
    global liste_classes
    try:
    cnx = mysql.connector.connect(user='nsiuser', password='nsiuser', database='gestion__notes')
    cursor = cnx.cursor()
    la_requete = "SELECT NOM_CLASS FROM CLASSE ORDER BY NOM_CLASS"
    cursor.execute(la_requete)
    for (element) in cursor:
        liste_classes.append(element[0])
    cursor.close()
    cnx.close()
# gestion d'une erreur de connexion à la base de données
except mysql.connector.Error as error:
    print("Erreur base de données: {}".format(error))

fen = Tk()
fen.geometry("700x300")
fen.title("IHM gestion Notes")
lbl_titre_classe=Label(fen, text='Classes').grid(row=0, column=0)
lbl_titre_élèves=Label(fen, text='Liste élèves').grid(row=0, column=1, padx=10)
# appel de la fonction initialisation()
initialisation()
combo_affichage_liste_classes= Combobox(fen, value=liste_classes)
combo_affichage_liste_classes.grid(row=1, column=0)
# sélection premier item de la liste déroulante
combo_affichage_liste_classes.current(0)
combo_affichage_liste_élèves_classe= Combobox(fen, value=liste_eleves_classe_selectionnée)
combo_affichage_liste_élèves_classe.grid(row=1, column=1, padx=10)
fen.mainloop()  
Voici le résultat lors de l'exécution du code:


Testez le code, faites une copie du résultat obtenu pour le compte rendu.

Question 2.7

Ajout des données de la base à la liste élèves.

Le contenu de la liste déroulante Liste élèves dépend de la classe qui est sélectionnée, il faut donc récupérer l'élément sélectionné dans la liste Classes et agir en conséquence, la liste sera initialement remplie avec les éléments de la première classe qui est affichée ( ici 1G1), pour avoir les élèves de la 1G1 au lancement de l'application, on modifie la fonction initialisation() en ajoutant la requête requete_eleves ( code lignes 12-13 ci-dessous), l'itérateur for à la ligne 14 récupère le résultat de cette requête et remplit la liste liste_eleves_classe_selectionnée, cette liste est ensuite affectée à la liste déroulante à la ligne 28, le premier élement de la liste déroulante est affichée par défaut grâce à la ligne de code 30 :

 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
from tkinter import *
from tkinter.ttk import Combobox
import mysql.connector
liste_classes = []
liste_eleves_classe_selectionnée = []

def initialisation():
    global liste_classes
    try:
        cnx = mysql.connector.connect(user='nsiuser', password='nsiuser', database='gestion__notes')
        cursor = cnx.cursor()
        la_requete = "SELECT NOM_CLASS FROM CLASSE ORDER BY NOM_CLASS"
        cursor.execute(la_requete)
        for (element) in cursor:
                liste_classes.append(element[0])
        requete_eleves =  "SELECT NOM_ELEVE, PRENOM_ELEVE FROM ELEVE JOIN APPARTENIR ON APPARTENIR.ID_ELEVE = ELEVE.ID_ELEVE WHERE APPARTENIR.ID_CLASS = ( SELECT ID_CLASS FROM CLASSE WHERE NOM_CLASS=\'1G1\') "  
        cursor.execute(requete_eleves)
        for (nom,prenom) in cursor:
            liste_eleves_classe_selectionnée.append((nom,prenom))
        cursor.close()
        cnx.close()
    # gestion d'une erreur
    except mysql.connector.Error as error:
        print("Erreur base de données: {}".format(error))

fen = Tk()
fen.geometry("700x300")
fen.title("IHM gestion Notes")
lbl_titre_classe=Label(fen, text='Classes').grid(row=0, column=0)
lbl_titre_élèves=Label(fen, text='Liste élèves').grid(row=0, column=1, padx=10)
# appel de la fonction initialisation
initialisation()
combo_affichage_liste_classes= Combobox(fen, value=liste_classes)
combo_affichage_liste_classes.grid(row=1, column=0)
combo_affichage_liste_classes.current(0)
combo_affichage_liste_élèves_classe= Combobox(fen, value=liste_eleves_classe_selectionnée)
combo_affichage_liste_élèves_classe.grid(row=1, column=1, padx=10)
#le premier élément de la liste "liste_élèves" est sélectionné
combo_affichage_liste_élèves_classe.current(0)
fen.mainloop()
Résultat:

Testez le code, faites une copie du résultat obtenu pour le compte rendu.

Question 2.8

Réaction à un événement changement de classe

En cas de sélection d'une autre classe dans la liste déroulante des Classes, l'événement "nouvel item sélectionné" doit être détecté et conduire à la mise à jour des données de la liste déroulante des élèves pour afficher la liste des élèves de cette nouvelle classe, voyons comment faire ça.

La méthode bind() de l'objet liste déroulante ( combobox en Anglais) permet de lier un événement détecté par le système d'exploitation ( Windows, Linux..) avec une fonction qui doit s'exécuter quand ce type d'événement est détecté.

Un événement en python s'écrit <<nom_de_événement>>, l'événement qui nous intéresse est ici :
<<ComboboxSelected>> ce qui pourrait se traduire par << nouvel élément de combobox sélectionné>>

On va lier ensuite cet événement à une fonction que l'on appelera mise_a_jour_liste_eleves(eventObject) qui aura pour rôle de mettre à jour la liste déroulante des élèves.

Remarque: en python, les fonctions associées à des événements ont toujours un paramètre entre les parenthèses appelé eventObject. Ce paramètre est un objet que le système d'exploitation ( Windows, Linux..) renseigne, on ne s'en servira pas ici mais il est obligatoire ( on s'en sert dans les fonctions de gestion d'événements des touches de clavier par exemple pour savoir quelle touche a été enfoncée).

Dans le code, on doit ajouter l'utilisation de la méthode bind() à l'objet liste déroulante combo_affichage_liste_classes pour lier l'événement <<ComboboxSelected>> et la fonction mise_a_jour_liste_eleves(eventObject) c'est ce que fait la ligne de code 5 ci-dessous:

1
2
3
4
5
6
7
combo_affichage_liste_élèves_classe= Combobox(fen, value=liste_eleves_classe_selectionnée)
combo_affichage_liste_élèves_classe.grid(row=1, column=1, padx=10)
# sélection du premier item de la liste déroulante
combo_affichage_liste_élèves_classe.current(0)
# voici la ligne ajoutée:
combo_affichage_liste_classes.bind("<<ComboboxSelected>>", mise_a_jour_liste_eleves)
fen.mainloop()
Remarque: en python, dans une fonction ou une méthode comme ici bind, si un des paramètres placés dans les parenthèses de la méthode est une fonction comme ici mise_a_jour_liste_eleves, la fonction placée comme paramètre est écrite sans ses parenthèses et sans ses paramètres si elle en a, ainsi on doit écrire:
combo_affichage_liste_classes.bind("<<ComboboxSelected>>", mise_a_jour_liste_eleves)
et surtout pas:
combo_affichage_liste_classes.bind("<<ComboboxSelected>>", mise_a_jour_liste_eleves(eventObject))

On écrit ensuite le code de la définition de la fonction mise_a_jour_liste_eleves(eventObject) que l'on place juste après la définition de la fonction initialisation():

 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
def mise_a_jour_liste_eleves(eventObject):   
    global liste_eleves_classe_selectionnée
    # effacement du contenu précédent de la liste des élèves
    liste_eleves_classe_selectionnée.clear()            
    # on définit une variable appelée nom_classe_sélectionnée qui contient le nom de la classe sélectionnée
    # la méthode get() d'un objet combobox récupère l'item sélectionné:
    nom_classe_sélectionnée = combo_affichage_liste_classes.get()
    # on lance ensuite la requête de récupération des élèves dans la bdd:
    try:
        cnx = mysql.connector.connect(user='nsiuser', password='nsiuser', database='gestion_notes')
        cursor = cnx.cursor()
        requete_eleves =  "SELECT NOM_ELEVE, PRENOM_ELEVE FROM ELEVE JOIN APPARTENIR ON APPARTENIR.ID_ELEVE = ELEVE.ID_ELEVE"\
                        "WHERE APPARTENIR.ID_CLASS = ( SELECT ID_CLASS FROM CLASSE WHERE NOM_CLASS=\'{}\') ".format(nom_classe_sélectionnée)  

        cursor.execute(requete_eleves)
        for (nom,prenom) in cursor:
            liste_eleves_classe_selectionnée.append((nom,prenom))
        # ajout de la nouvelle liste d'élèves à la combobox:
        combo_affichage_liste_élèves_classe['values'] = list_eleves_classe_selectionnée
        # sélection premier item de la liste déroulante
        combo_affichage_liste_élèves_classe.current(0)
        # déconnexion base de données
        cursor.close()
        cnx.close()
    # gestion d'erreur de connexion si try échoue
    except mysql.connector.Error as error:
        print("Erreur base de données: {}".format(error))
Résultat:

Remarque:
on doit retrouver l'id de la la classe sélectionnée, ce qui demande une requête comme ci-dessous:
"...... ( SELECT ID_CLASS FROM CLASSE WHERE NOM_CLASS=\'{}\') ".format(nom_classe_sélectionnée)
La méthode format(..) d'une chaine de caractères permet d'injecter la valeur de variables dans la chaîne de caractères.
Le principe est le suivant, on met des accolades à l'endroit de la chaîne où la valeur des variables seront placées, exemple:
a = 'Clette'
b = 'Lara'
c = 'seconde 1'
" {} {} est une élève de {} ".format(b, a, c) donnera la chaine " Lara Clette est une élève de seconde 1 "
ainsi si la variable nom_classe_sélectionnée = '201', la requête: "...... ( SELECT ID_CLASS FROM CLASSE WHERE NOM_CLASS=\'{}\') ".format(nom_classe_sélectionnée)
devient:
...... ( SELECT ID_CLASS FROM CLASSE WHERE NOM_CLASS='201')

  • Testez le code en ajoutant la définition de la fonction mise_a_jour_liste_eleves(eventObject) et en ajoutant la ligne de code de la méthode bind() comme c'est montré ci-dessus. ATTENTION, lors du test Il vous faudra sélectionner une classe qui a des élèves inscrits dans la base de données comme la classe 201, vous n'avez pas inscrit d'élèves en TG1 , faites une copie du résultat obtenu pour le compte rendu.

Question 2.9

c'est la question synthèse à faire si vous avez compris tout ce qui a été réalisé jusqu'ici
- Ajoutez deux labels en colonne 2 pour afficher la moyenne de l'élève sélectionné:

Pour afficher le label vide, à fond blanc, d'une largeur de 10px, décaler de 10px par rapport au bords, vous pouvez coder:

label_moyenne = Label(fen, text=" ", bg="white", width=10 ).grid( padx=10, row=1, column=2)
- Ajoutez la méthode bind() à la liste déroulante combo_affichage_liste_élèves_classe qui liera l'événement <<ComboboxSelected>> à la fonction calcul-moyenne(eventObject) que vous définirez pour accéder aux notes de l'élève sélectionné.
- Testez votre code ( ATTENTION , pensez à sélectionner des élèves qui ont des notes, Nordine Ozor par exemple ) , faites une copie du résultat obtenu pour le compte rendu.