Relation plusieurs-à-plusieurs dans Access

Denis Hulo

Objectif : créer une relation plusieurs-à-plusieurs, puis réaliser un formulaire Access pour la saisie et la consultation des données.

Niveau requis : débutant.

Commentez cet article : Commentez

- Titre : Relation plusieurs-à-plusieurs dans Access

- Auteur : Denis Hulo

- Parution : 14 mai 2020

- Mise à jour : 26 janvier 2022

- Public visé :

- Licence : Copyright ® 2020 Denis Hulo. 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. Description du contexte

- II. Les champs multivalués : la solution de facilité

- III. Concevoir d'abord un bon schéma relationnel

- IV. Tables nécessaires

- IV-A. T_Candidat

- IV-B. T_Examen

- IV-C. T_Inscription_Examen

- V. Relations entre les tables

- VI. Requête R_Candidats

- VII. Sous-formulaire

- VII-A. Liste de choix du candidat

- VIII. Formulaire principal

- VIII-A. Liaison entre le formulaire principal et le sous-formulaire

- IX. Rendu final

- X. Base de données à télécharger

- XI. Remerciements

I - Description du contexte

On souhaite réaliser un formulaire permettant de choisir les candidats inscrits à un examen de formation (« Algorithmique - Programmation », « TP Programmation », etc.).

Ce formulaire affichera, en plus des informations relatives à l'examen, la liste des candidats inscrits, avec idéalement leur date d'inscription :

Formulaire Examen

Nous allons voir comment mettre en place ce type d'interface en s'appuyant sur un bon schéma relationnel.

II - Les champs multivalués : la solution de facilité

Les champs multivalués permettent d'afficher directement dans les tables, les requêtes ou les formulaires, des listes de choix avec des cases à cocher pour sélectionner des données provenant d'une autre source.

Par exemple, on peut choisir les candidats inscrits à l'examen « Algorithmique - Programmation » directement dans la table des examens :

Champs multivalués

Cependant, comme ces champs peuvent contenir plusieurs valeurs pour un même enregistrement, ils ne répondent pas à la première forme normale de la théorie de la normalisation, nécessaire pour concevoir un bon schéma d'une base de données. Leur utilisation dans les requêtes comme dans le code peut ainsi sembler déroutante.

En résumé, ils peuvent par la suite compliquer le développement et la maintenance de la base Access.

Ce type de champ ne permet pas non plus d'enregistrer d'autres informations relatives à l'inscription, comme la date d'inscription.

III - Concevoir d'abord un bon schéma relationnel

Pour éviter ces problèmes, on se basera pour réaliser notre exemple, sur le modèle entité-association suivant :

Modèle entité-association

On a une relation plusieurs-à-plusieurs dans laquelle un candidat peut passer un ou plusieurs examens, de même un examen peut être passé par un ou plusieurs candidats.

On va donc devoir créer une table intermédiaire entre les tables Candidat et Examen nécessaire pour concevoir un bon schéma relationnel :

- Candidat(IdCandidat, NomCandidat, PrenomCandidat,...) ;

- Examen(IDExamen, IntituleExamen, DateExamen,...) ;

- Inscrire(IdCandidat, IdExamen, DateInscription).

IV - Tables nécessaires

En plus des deux tables principales, on en aura besoin d'une supplémentaire pour enregistrer les inscrits à chaque examen.

IV-A - T_Candidat

Elle permet d'enregistrer les données concernant les candidats.

Nom du champ

Type de données

Description du champ

IdCandidat

NumeroAuto

Identifiant du candidat

NomCandidat

Texte

Nom du candidat

PrenomCandidat

Texte

Prénom du candidat

Cycle

Texte

Cycle de formation du candidat

Annee

Texte

Année scolaire : 2020-2021

IV-B - T_Examen

Elle contient les informations relatives aux examens.

Nom du champ

Type de données

Description du champ

IdExamen

NumeroAuto

Identifiant de l'examen

IntituleExamen

Texte

Intitulé de l'examen : « TP Programmation », etc.)

Cycle

Texte

Cycle de formation : « A1 »,  « A2 », etc.

DateExamen

Date/Heure

Date de l'examen

HeureDebutExamen

Date/Heure

Heure de début de l'examen

HeureFinExamen

Date/Heure

Heure de fin de l'examen

Salle

Texte

Identifiant de la salle où a lieu l'épreuve

DateFinInscription

Date/Heure

Date de fin des inscriptions à l'épreuve

IV-C - T_Inscription_Examen

Cette table permet de faire le lien entre les 2 tables précédentes. Elle constitue la source de données du sous-formulaire destiné à afficher la liste des candidats inscrits à l'examen, avec pour chacun leur date d'inscription.

Nom du champ

Type de données

Description du champ

IdCandidat

Entier long

Identifiant du candidat : clé étrangère héritée de la table T_Candidat et composante de la clé primaire de T_Candidat_Examen

IdExamen

Entier long

Identifiant de l'examen : clé étrangère héritée de la table T_Examen et composante de la clé primaire de T_Candidat_Examen

DateInscription

Date/Heure

Date d'inscription du candidat à l'épreuve

La clé primaire est composée des colonnes IdCandidat et IdExamen, elle permet ainsi d'identifier de manière unique l'enregistrement de la table. On est donc assuré de ne pas avoir deux fois le même candidat pour un examen donné.

V - Relations entre les tables

On définit :

- une relation 1 à plusieurs entre les tables T_Candidat et T_Inscription_Examen sur le champ IdCandidat ;

- une relation 1 à plusieurs entre les tables T_Examen et T_Inscription_Examen sur respectivement les colonnes IdExamen et IdExamen.

Relations entre les tables

Access ne gère pas les relations 0 à plusieurs.

VI - Requête R_Candidats

Elle affiche la liste des candidats ordonnés suivant leur nom et prénom.

Requête R_Candidats

Elle alimente la liste déroulante permettant de choisir un inscrit dans le sous-formulaire.

VII - Sous-formulaire

Il est contenu dans le formulaire principal et est basé sur la table T_Inscription_Examen.

Il comporte :

- une liste déroulante pour choisir le candidat inscrit ;

- une zone de texte pour saisir sa date d'inscription.

Ce sous-formulaire est en mode feuille de données, avec ajout et suppression des données autorisés.

Sous-formulaire en mode création

VII-A - Liste de choix du candidat

Elle est liée au champ IdCandidat de la table et permet de choisir un candidat inscrit à l'examen.

Liste de choix cmbCandidat

Elle a comme contenu la requête R_Candidats et affiche les noms complets des candidats, leur identifiant étant masqué :

- colonne n°1 : elle est masquée et liée au champ IdCandidat ;

- colonne n°2 : affiche les noms complets des inscrits.

Cette astuce permet d'afficher dans la liste le nom du candidat au lieu de son identifiant et d'alimenter en réalité la colonne IdCandidat de la table intermédiaire.

VIII - Formulaire principal

Il est basé sur la table T_Examen et contient les contrôles liés aux champs de cette table. Il comprend en plus le sous-formulaire permettant de choisir les inscrits.

Fomulaire principal en mode création

VIII-A - Liaison entre le formulaire principal et le sous-formulaire

Pour les relier, on définit dans les propriétés du contrôle sous-formulaire, la colonne IdExamen de la table T_Examen comme champ père, et la colonne IdExamen de la table T_Inscription_Examen comme champ fils.

Liaison entre le formulaire principal et le sous-formulaire

Celle liaison permet de synchroniser les données des deux objets.

IX - Rendu final

Affichage du formulaire principal avec son sous-formulaire permettant de choisir les candidats :

Formulaire Examen

Une date de fin d'inscription permet de finaliser la saisie.

Cette méthode nécessite donc de remplir la liste des inscrits, contrairement au champs multivalués où il suffit juste de cocher les candidats.

En réalité, ce sont bien les colonnes de la table associative qui sont alimentées lors de la saisie des candidats.

X - Base de données à télécharger

La base jointe est au format accdb

Le champ multivalué Inscrits de la table des examens n'est pas nécessaire dans notre exemple.

XI - Remerciements

Je tiens à remercier Jean-Philippe André et Pierre Fauconnier pour m'avoir conseillé pour la réalisation de cet article, ainsi que escartefigue pour sa relecture.