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
Sub
III. 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
Sub
et 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
Sub
V. 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
=
False
V-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
Sub
Et 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
Sub
VII. 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.