I. Le contexte pédagogique▲
Le carnet de suivi des apprentissages permet de rendre compte des acquis des enfants durant leur scolarité en maternelle. Ce carnet a été élaboré sur le principe que seuls les acquis apparaissent sur la feuille à imprimer. Ainsi, si un enfant sait enfiler des perles sur un lacet, mais ne sait pas encore disposer ces perles selon un algorithme simple, seule la compétence « enfiler des perles » apparaîtra sur le carnet. Celle relative aux algorithmes n'apparaîtra que lorsque la compétence sera validée.
Le livret est distribué aux enfants et aux familles à chaque fin de trimestre.
Dans un premier temps, il faut entrer les noms des enfants ainsi que leur niveau (toute petite section, petite section, moyenne section et grande section) dans le formulaire fEleves. Parallèlement, ont été entrées dans les tables toutes les compétences qui seront évaluées. Chaque compétence a la possibilité d'être travaillée dans un ou plusieurs niveaux. Pour cela, il suffit de cocher les cases correspondantes. Notez qu'il est possible de modifier, supprimer ou ajouter de nouvelles compétences, ainsi que les niveaux auxquels elles apparaissent, en utilisant le formulaire fGrilleEval.
Les compétences sont regroupées dans des objectifs qui eux-mêmes appartiennent à l'un des cinq grands domaines. Nous avons gardé cette répartition en domaines et objectifs afin de retrouver plus facilement les compétences et pour pouvoir par la suite les imprimer en gardant la répartition par domaines.
Du fait de la répartition des compétences en fonction du niveau de classe, sur les formulaires élèves, n'apparaissent que les compétences correspondant au niveau de l'enfant. Ainsi pour un enfant en petite section n'apparaîtront que les compétences dont la case « petite section » est cochée. Si l'enfant change de niveau (l'année suivante), les nouvelles compétences correspondant au nouveau niveau de l'élève apparaîtront.
Bien entendu, il a fallu aussi entrer les dates de début et de fin de chaque trimestre.
Pour valider les compétences de chaque enfant, il suffit d'utiliser le formulaire fEleves. Chaque élève apparaît dans l'ordre alphabétique avec son nom, son prénom, sa date de naissance et son niveau ainsi que sa photo. Il suffit de marquer la date de l'acquis dans la case correspondante.
Il ne reste plus qu'à imprimer les feuilles pour chaque enfant. Cliquez « Imprimer les feuilles d'évaluation une par une ». Un nouveau formulaire apparaît, demandant quelle est la période à imprimer. Puis une liste déroulante apparaît permettant de choisir la fiche de l'élève que vous voulez imprimer. Chaque compétence validée apparaît, précédée d'un petit dessin.
|
Abordons maintenant les aspects techniques de l'application. |
II. Comment procéder pour afficher en continu une lignée de pères/fils▲
Si la technique « traditionnelle » des formulaires pères/fils ne vous est pas familière, voyez ce tutoriel : Comment classer les données dans des tables liées et construire un formulaire père/fils
II-A. De quoi parle-t-on ?▲
En clair, comment réaliser cette cascade :
il y a plusieurs domaines, chaque domaine a plusieurs objectifs et chaque objectif est rattaché à une série de compétences.
Si Access permet de créer un formulaire père/fils, il y a toutefois deux contraintes :
- le père doit être affiché en « mode simple », c'est-à-dire afficher un enregistrement à la fois ;
- seulement deux générations : un père et son (ses) fils.
Ce que nous voulons réaliser, c'est un père, son fils et son petit-fils, et les afficher tous en continu.
La technique que nous allons expliquer permet d'allonger la descendance : un arrière-petit-fils, un arrière-arrière… C'est la taille de votre écran qui constitue la limite.
II-B. L'astuce▲
Incorporer les formulaires continus originaux dans une enveloppe et utiliser la technique « père/fils » par rapport à un contrôle indépendant - situé dans l'enveloppe - qui contient la clé de l'enregistrement actif du « pseudopère ».
Le premier sous-formulaire (celui à gauche) est un sous-formulaire banal, pas un fils.
Les suivants sont des « frères », ils sont chacun fils d'une zone de texte située dans l'enveloppe.
Chaque sous-formulaire, sauf le dernier, tient à jour la zone de texte qui sert de champ père pour son suivant : cet artifice donne l'illusion de formulaires pères/descendants.
II-C. Un code VBA rikiki▲
Une seule instruction apparaît dans l'événement « Sur activation » de chaque pseudopère, pour garnir dans l'enveloppe la zone de texte qui provoquera la synchronisation de son pseudofils :
Option Compare Database
Option Explicit
Private Sub Form_Current()
Me.Parent!TXTtDomainesPK = Me.TXTtDomainesPK
End SubIII. Au menu de l'application▲
À l'ouverture de la base, un menu propose d'accéder aux trois formulaires principaux :

IV. La grille d'évaluation▲
C'est le pseudopère/fils décrit plus haut.
|
La technique pour afficher une image différente par enregistrement dans un formulaire continu est décrite dans ce tutoriel : Un formulaire continu avec des images avec Access 2000 |
L'image affichée est de taille réduite, mais si vous double-cliquez sur le N°, le programme que vous avez associé pour l'ouverture des fichiers *.jpg va ouvrir l'image originale :

Cette méthode universelle (elle fonctionne quelle que soit l'extension du fichier) est donnée par Loufab dans cette contribution.
Dans un module, par exemple « mLoufab », vous collez ces quelques lignes de code :
Option Compare Database
Option Explicit
'Pour rendre compatible 32 bits/64 bits
#If VBA7 Then
DefLngPtr A - Z
Const PtrNull As LongPtr = 0
#Else
DefLng A-Z
Const PtrNull As Long = 0
#End If
#If VBA7 Then
Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr
#Else
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#End If
Public Sub Ouvrir_fichier(Chemin As String)
'Ouvrir, avec le pgm associé, le fichier dont le chemin est passé en paramètre
ShellExecute Application.hWndAccessApp, "open", Chemin, "", "", 1
End Subet pour l'utiliser, simplement ceci : Call Ouvrir_fichier("CheminDuFichier").
Dans le cas qui nous occupe :
Option Compare Database
Option Explicit
Private Sub txttCompetencesPK_DblClick(Cancel As Integer)
Call Ouvrir_fichier(CurrentProject.Path & "\ImagesCompet\" & [tCompetencesPK] & ".jpg")
End SubV. Le formulaire fEleves▲
Il permet d'encoder les cordonnées de l'élève et de comptabiliser ses compétences acquises.
Il s'agit aussi d'un pseudopère/fils construit sur le modèle de fGrilleEval.
V-A. À l'ouverture▲
Le programme empêche l'utilisateur de modifier les domaines et objectifs :
Option Compare Database
Option Explicit
Private Sub Form_Open(Cancel As Integer)
'Positionner le formulaire sur l'écran
DoCmd.MoveSize 100, 1000, 19000, 10850
'Empêcher modif fDomaines
Me.CTNRfDomaines.Form.AllowEdits = False
Me.CTNRfDomaines.Form.AllowDeletions = False
Me.CTNRfDomaines.Form.AllowAdditions = False
'Empêcher modif fObjectifs
Me.CTNRfObjectifs.Form.AllowEdits = False
Me.CTNRfObjectifs.Form.AllowDeletions = False
Me.CTNRfObjectifs.Form.AllowAdditions = FalseV-B. À chaque lecture d'un enregistrement▲
Le programme aménage la photo.
On a pris le parti de loger les photos dans un sous-répertoire « Photos ».
Les photos sont du type *.jpg et leur nom se compose du tElevesPK de l'élève.
Par exemple, pour la mignonne Isabel, sa photo s'appelle 6.jpg et est logée dans un sous-répertoire appelé « Photos » du répertoire qui contient la base de données.
Ceci simplifie le code et la maintenance.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Sub Form_Current()
Dim sCheminPhoto As String
'Vérifier qu'une photo est présente
sCheminPhoto = CurrentProject.Path & "\Photos\" & Me.txttElevesPK & ".jpg"
If Dir(sCheminPhoto) = Me.txttElevesPK & ".jpg" Then
Me.Photo.Picture = sCheminPhoto
Else
Me.Photo.Picture = CurrentProject.Path & "\Photos\Default.bmp"
End If
End Sub
Comme on le voit ligne 8, si la photo de l'élève n'est pas présente, le programme affiche celle-ci :

Si vous n'êtes pas encore convaincu qu'il vaut mieux loger les images en dehors de la base de données, voyez ce tutoriel : Stockez les images statiques de vos formulaires et états Access hors de la base de données.
V-C. La mise à jour du niveau▲
La mise à jour va déclencher l'exécution de cette requête :
PARAMETERS [Eleve] Long, [Niveau] Long;
INSERT INTO tElevCompet ( tElevesFK, tCompetencesFK )
SELECT tEleves.tElevesPK, tCompetences.tCompetencesPK
FROM tEleves, tCompetences
WHERE (((tEleves.tElevesPK)=[Eleve]) AND ((tCompetences.TPS)=IIf([Niveau]=1,Yes))) OR (((tEleves.tElevesPK)=[Eleve]) AND ((tCompetences.PS)=IIf([Niveau]=2,Yes))) OR (((tEleves.tElevesPK)=[Eleve]) AND ((tCompetences.MS)=IIf([Niveau]=3,Yes))) OR (((tEleves.tElevesPK)=[Eleve]) AND ((tCompetences.GS)=IIf([Niveau]=4,Yes)));Cette requête va donc ajouter dans la table tElevCompet
- pour cet élève,
- toutes les compétences qui correspondent à son niveau,
… pour autant qu'elles n'y figurent pas déjà. Par exemple pour un élève qui, l'an passé, lorsqu'il était dans un niveau inférieur, avait déjà cette compétence à son programme.
En effet, ces « doublons » seront refusés, en raison de la définition de la table :
En d'autres mots, cette mise à jour laissera intactes les comptabilisations précédentes pour cet élève.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private Sub cboNiveau_AfterUpdate()
Dim q As QueryDef
Dim ctl As Control
'Sauvegarder
Me.Refresh
'Compléter la table tElevCompet
Set q = CurrentDb.QueryDefs("rAjouttElevCompet")
q.Parameters("Eleve") = Me.txttElevesPK
q.Parameters("Niveau") = Me.cboNiveau
q.Execute
Set q = Nothing
'Rafraîchir les sous-formulaires
For Each ctl In Me.Controls
If ctl.Name Like "CTNR*" Then ctl.Requery
Next ctl
End Sub
13 à 15 : on provoque la réactualisation des sous-formulaires, car leur source a été modifiée.
VI. Imprimer les feuilles d'évaluation▲
Nous avons opté pour l'impression d'un livret à la fois, pour deux raisons :
- pour pouvoir imprimer recto verso ;
- parce que sur certaines machines, le programme plantait si le nombre de livrets dépassait 8 !
Probablement en raison du nombre d'images que contient un livret (une cinquantaine, toutes différentes).
VI-A. Fonctionnement▲
Le clic sur le bouton du menu provoque l'ouverture du formulaire fFeuillesEval. Celui-ci propose de choisir une période et un élève.
Lorsque l'utilisateur a choisi une période, les champs debut et fin sont alimentés :
Private Sub cboPeriode_AfterUpdate()
Me.cboEleve.SetFocus
Me.cboEleve.Dropdown
Me.Debut = Me.cboPeriode.Column(1)
Me.Fin = Me.cboPeriode.Column(2)
End SubEt quand l'élève est désigné :
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.
Private Sub cboEleve_AfterUpdate()
On Error GoTo GestionErreurs
Dim oQry As DAO.QueryDef
Dim sSQL As String
If IsNull(Me.cboPeriode) + IsNull(Me.cboEleve) <> 0 Then
MsgBox "Un champ n'est pas rempli !", vbCritical
Exit Sub
End If
'Récupérer le sql de la source de eFeuillesEval
Set oQry = CurrentDb.QueryDefs("reFeuillesEval")
sSQL = oQry.SQL
sSQL = Replace(sSQL, "Formulaires", "Forms")
sSQL = Replace(sSQL, 999999, Me.cboEleve)
'Modifier la source de eFeuillesEval
DoCmd.OpenReport "eFeuillesEvalUn", acViewDesign
Reports!eFeuillesEvalUn.RecordSource = sSQL
DoCmd.Close acReport, "eFeuillesEvalUn", acSaveYes
DoCmd.OpenReport "eFeuillesEvalUn", acViewPreview
GestionErreurs:
Select Case Err.Number
Case 0 'pas d'erreur
Case 2501 ' pas d'évaluation pour cet élève
Resume Next
Case Else
MsgBox " Erreur dans cboEleve_AfterUpdate N° " & " " & Err.Description
End Select
End Sub
Commentaires du code
5 - 8 : on vérifie la complétude des deux champs.
Dans Access, la valeur de True est -1, celle de False est 0.
La somme sera = 0 si les deux champs sont remplis.
9 - 13 : pour simplifier la confection du SQL de la source de l'état, nous avons enregistré la requête reFeuillesEval :
SELECT tEleves.tElevesPK, tElevCompet.DateAcquis, [EleveNom] & ", " & [ElevePrenom] AS Eleve, tEleves.DateNaissance, tCompetences.tCompetencesPK, tCompetences.Competence, tObjectifs.Objectif, tDomaines.Domaine, tNiveaux.Niveau, tNiveaux.NiveauEnClair
FROM tNiveaux INNER JOIN (tEleves INNER JOIN (((tDomaines INNER JOIN tObjectifs ON tDomaines.tDomainesPK = tObjectifs.tDomainesFK) INNER JOIN tCompetences ON tObjectifs.tObjectifsPK = tCompetences.tObjectifsFK) INNER JOIN tElevCompet ON tCompetences.tCompetencesPK = tElevCompet.tCompetencesFK) ON tEleves.tElevesPK = tElevCompet.tElevesFK) ON tNiveaux.tNiveauxPK = tEleves.tNiveauxFK
WHERE (((tEleves.tElevesPK)=999999) AND ((tElevCompet.DateAcquis)>=[Formulaires]![fFeuillesEval]![Debut] And (tElevCompet.DateAcquis)<=[Formulaires]![fFeuillesEval]![Fin]));Il nous suffit de la mettre à la sauce anglaise (Formulaires => Forms) : instruction 12,
et de remplacer 999999 par l'id de l'élève choisi : instruction 13.
15 - 18 : on ouvre l'état eFeuillesEval en mode construction (15), on lui colle le SQL adapté (16), on sauvegarde en silence pour éviter qu'Access pose la question (17) et on affiche (18).
L'instruction 18 génère une erreur N° 2501 s'il n'y a pas d'évaluation pour cette période/élève.

Cette erreur est traitée à l'instruction 28.
Et dans l'événement « Sur aucune donnée » de l'état :
Private Sub Report_NoData(Cancel As Integer)
MsgBox "Il n'a pas d'évaluation de période pour cet élève !", vbCritical
Cancel = True
End Sub… on le dit à l'utilisateur :

VI-B. Les images des compétences▲
À chaque compétence (ou presque), une image est associée.
Elles sont logées dans le sous-répertoire « ImagesCompet ».
Leur nom est aussi construit : tCompetencesPK de la compétence suivi de l'extension jpg.
Lorsqu'elle est présente, l'image occupe un espace plus grand que celui nécessaire au libellé de la compétence ; quand l'image n'est pas présente, on réduit l'espace réservé à son affichage :
Voici le code :
Private Sub Détail_Format(Cancel As Integer, FormatCount As Integer)
Dim sCheminImageCompet As String
'Vérifier qu'une image de compétence est présente
sCheminImageCompet = CurrentProject.Path & "\ImagesCompet\" & Me.txttCompetencesPK & ".jpg"
'si oui, aménager l'espace
If Dir(sCheminImageCompet) = txttCompetencesPK & ".jpg" Then
Me.iCompetence.Height = 1636
Me.iCompetence.Width = 1636
Me.iCompetence.Picture = sCheminImageCompet
Me.txtCompetence.Top = 810
Else
'sinon réduire l'espace
Me.iCompetence.Height = 0
Me.Section("détail").Height = 0
Me.txtCompetence.Top = 50
End If
End SubVII. Téléchargement▲
La base de données au format Access 2000 (7500 Ko avec les images) se trouve ici :
https://claudeleloup.developpez.com/tutoriels/access/evaluation-maternelle/Application.zip
N.B. Vous devez décompresser l'archive complète dans un répertoire quelconque.

VIII. Remerciements▲
Merci à Maxy35 pour la relecture orthographique.














