Developpez.com

Télécharger gratuitement le magazine des développeurs, le bimestriel des développeurs avec une sélection des meilleurs tutoriels

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

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 Donner une note à l'article (5) 

Article lu   fois.

Les deux auteurs

Site personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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.

Image non disponible 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.

Image non disponible
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 ».

Image non disponible
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 :

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

Image non disponible

IV. La grille d'évaluation

Image non disponible
3 Cliquez sur l'image pour l'agrandir

C'est le pseudopère/fils décrit plus haut.

Image non disponible 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 :

Image non disponible

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 :

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

 
Sélectionnez
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.

Image non disponible
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 :

 
Sélectionnez
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.

 
Sélectionnez
1.
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 :

Image non disponible

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 :

Image non disponible
6 Cliquez sur l'image pour l'agrandir
 
Sélectionnez
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 :

Image non disponible

En d'autres mots, cette mise à jour laissera intactes les comptabilisations précédentes pour cet élève.

 
Sélectionnez
1.
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

Image non disponible
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.

Image non disponible

Lorsque l'utilisateur a choisi une période, les champs debut et fin sont alimentés :

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

 
Sélectionnez
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.
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  " & " " & 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 :

Image non disponible
8 Cliquez sur l'image pour l'agrandir
 
Sélectionnez
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.

Image non disponible

Cette erreur est traitée à l'instruction 28.

Et dans l'événement « Sur aucune donnée » de l'état :

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

Image non disponible

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 :

Image non disponible
9 Cliquez sur l'image pour l'agrandir

Voici le code :

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

http://claudeleloup.developpez.com/tutoriels/access/evaluation-maternelle/Application.zip

N.B. Vous devez décompresser l'archive complète dans un répertoire quelconque.

Image non disponible

VIII. Remerciements

Merci à Maxy35 pour la relecture orthographique.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

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.