Composer un livret de réussite (classes d'école maternelle) avec Access

| Torklebô | Claude Leloup |

Dans ce tutoriel, vous apprendrez une technique pour présenter des pères/fils/petits-fils/arrière-petits-fils… tous en continu… et avec des images différentes pour chaque enregistrement !

Vous y trouverez aussi des exemples qui montrent comment traiter des images logées en dehors de la base de données.

Nous utiliserons aussi une méthode passe-partout pour ouvrir un fichier avec le programme que vous avez associé à une extension.

Pour commenter cet article, un espace de discussion a été ouvert Commentez

- Titre : Composer un livret de réussite (classes d'école maternelle) avec Access

- Auteurs : Torklebô, Claude Leloup

- Parution : 8 février 2017

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2017 Torklebô. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Le contexte pédagogique

- II. Comment procéder pour afficher en continu une lignée de pères/fils

- II-A. De quoi parle-t-on ?

- II-B. L'astuce

- II-C. Un code VBA rikiki

- III. Au menu de l'application

- IV. La grille d'évaluation

- V. Le formulaire fEleves

- V-A. À l'ouverture

- V-B. À chaque lecture d'un enregistrement

- V-C. La mise à jour du niveau

- VI. Imprimer les feuilles d'évaluation

- VI-A. Fonctionnement

- VI-B. Les images des compétences

- VII. Téléchargement

- VIII. Remerciements

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.

1 Cliquez sur l'image pour l'agrandir

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 ».

2 Cliquez sur l'image pour l'agrandir

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

3 Cliquez sur l'image pour l'agrandir

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.

5 Cliquez sur l'image pour l'agrandir

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.

1. Private Sub Form_Current()

2. Dim sCheminPhoto As String

3. 'Vérifier qu'une photo est présente

4. sCheminPhoto = CurrentProject.Path & "\Photos\" & Me.txttElevesPK & ".jpg"

5. If Dir(sCheminPhoto) = Me.txttElevesPK & ".jpg" Then

6. Me.Photo.Picture = sCheminPhoto

7. Else

8. Me.Photo.Picture = CurrentProject.Path & "\Photos\Default.bmp"

9. End If

10. 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 :

6 Cliquez sur l'image pour l'agrandir

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.

1. Private Sub cboNiveau_AfterUpdate()

2. Dim q As QueryDef

3. Dim ctl As Control

4. 'Sauvegarder

5. Me.Refresh

6. 'Compléter la table tElevCompet

7. Set q = CurrentDb.QueryDefs("rAjouttElevCompet")

8. q.Parameters("Eleve") = Me.txttElevesPK

9. q.Parameters("Niveau") = Me.cboNiveau

10. q.Execute

11. Set q = Nothing

12. 'Rafraîchir les sous-formulaires

13. For Each ctl In Me.Controls

14. If ctl.Name Like "CTNR*" Then ctl.Requery

15. Next ctl

16. 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

7 Cliquez sur l'image pour l'agrandir

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é :

1. Private Sub cboEleve_AfterUpdate()

2. On Error GoTo GestionErreurs

3. Dim oQry As DAO.QueryDef

4. Dim sSQL As String

5. If IsNull(Me.cboPeriode) + IsNull(Me.cboEleve) <> 0 Then

6. MsgBox "Un champ n'est pas rempli !", vbCritical

7. Exit Sub

8. End If

9. 'Récupérer le sql de la source de eFeuillesEval

10. Set oQry = CurrentDb.QueryDefs("reFeuillesEval")

11. sSQL = oQry.SQL

12. sSQL = Replace(sSQL, "Formulaires", "Forms")

13. sSQL = Replace(sSQL, 999999, Me.cboEleve)

14. 'Modifier la source de eFeuillesEval

15. DoCmd.OpenReport "eFeuillesEvalUn", acViewDesign

16. Reports!eFeuillesEvalUn.RecordSource = sSQL

17. DoCmd.Close acReport, "eFeuillesEvalUn", acSaveYes

18. DoCmd.OpenReport "eFeuillesEvalUn", acViewPreview

19. GestionErreurs:

20. Select Case Err.Number

21. Case 0 'pas d'erreur

22. Case 2501 ' pas d'évaluation pour cet élève

23. Resume Next

24. Case Else

25. MsgBox " Erreur dans cboEleve_AfterUpdate N° " & " " & Err.Description

26. End Select

27. 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 :

8 Cliquez sur l'image pour l'agrandir

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 :

9 Cliquez sur l'image pour l'agrandir

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.