Les relations réflexives avec Microsoft Access

Souvent nous avons besoin d'un système hiérarchique, par exemple :

  • projet => sous-projets ;
  • contrats => avenants ;
  • Etc.

Construction selon la norme 3NF

L’exemple classique trouvé sur le Net c’est l'organigramme de l'entreprise, je ne dérogerais pas à la règle.

Organigramme hiérarchique
Figure 1 : Schéma organigramme.

J’ai des salariés qui sont des subordonnés et d’autres des supérieurs. Je souhaite conserver cette hiérarchie.

Utiliser du plusieurs à plusieurs

Pour se faire j’ai besoin de la liste des employés.

Affichage table employé
Figure 2: Affichage table employés.

Le réflexe naturel serait de créer une seconde table qui associe l’employé en lui attribuant le rôle de supérieur (champ [T_ORG].[EMP_SUP]) ou subordonné (champ [T_ORG].[EMP_SUB]).

Affichage table employé
Figure 3 : Affichage table organigramme.

Nous constatons que « Pierre » d'index 1 est le supérieur de « Marie » et « Loïc » alors que « Marie » est la chef de « Marc » et « Anne ».
Nous voyons que "Pierre", n'apparaît pas dans le champ [EMP_SUB], il n'a pas de supérieur.

Pour simplifier l’affichage, les deux champs [EMP_SUP] et [EMP_SUB] sont renseignés avec une zone de liste.

Création liste de choix du supérieur
Figure 4 : Création liste de choix de l'employé.

Ce qui donne l’affichage suivant.

Affichage liste de choix du supérieur
Figure 5 : Liste de choix de l'employé.

Tracer les relations

Nous avons une relation de 1 à plusieurs entre les champs [T_EMPLOYE].[EMP_ID] et [T_ORG].[EMP_SUP] et une seconde entre les champs [T_EMPLOYE].[EMP_ID] et [T_ORG].[EMP_SUB].

Nous avons donc une relation de plusieurs à plusieurs mais avec une seule table mère.

Il faut inclure deux fois la table [T_EMPLOYE] dans le schéma relationnel. La seconde sera renommée par Microsoft Access [T_EMPLOYE_1].

Relations avec la même table incluse deux fois
Figure 6 : Relation plusieurs à plusieurs.

Une autre approche

Relation sur un champ de la même table

Qu'il soit chef ou subordonné, ce sont tous des employés. Alors pourquoi ne pas utiliser une seule table.

Affichage d'une table avec une clé étrangère qui référence la clé primaire
Figure 7 : Affichage table réflexive.

L’index du supérieur de l’employé est directement dans un champ de la table des employés, ici le champ [EMP_SUP]. Ce champ contient l’index de la colonne [EMP_ID] du supérieur.

Là aussi nous voyons que « Pierre » n’a pas de supérieur et qu’il a deux subordonnés (« Marie » et « Loïc »).

Le champ [EMP_SUP] doit accepter les valeurs nulles pour les personnes (comme ici « Pierre ») qui n'auraient pas de supérieurs.

Faciliter l’exploitation

De façon identique avec deux tables, il est plus simple de créer une liste de choix sur le champ EMP_SUP.

Création d'une liste de choix sur la clé étrangère
Figure 8 : Structure clé étrangère.

Nous constatons que « Anne » est subordonnée à « Marie ».

Affichage liste de choix sur la clé étrangère
Figure 9 : Affichage clé étrangère.

Schéma relationnel

Pour créer le schéma relationnel, comme précédemment, il faut inclure deux fois la table [T_EMPLOYE_ORGA].

Affichage relation sur la même table
Figure 10 : Schéma relationnel réflexive.

La relation se fera entre les champs [T_EMPLOYE_ORGA].[EMP_ID] et [T_EMPLOYE_ORGA_1].[EMP_SUP].
Chose amusante, lorsque l'on ouvre à nouveau la fenêtre des relations, Microsoft Access a changé le sens pour [T_EMPLOYE_ORGA_1].[EMP_ID] vers [T_EMPLOYE_ORGA].[EMP_SUP].

Microsoft Access change le sens de la relation
Figure 11 : Microsoft Access modifie le sens de relation.>

Quelques requêtes

Trouver le supérieur d’un employé

Création requête supérieur
Figure 12 : Requête trouver le supérieur.

Nous trouvons bien pour l’employé « Marie », le supérieur « Pierre ».

Affichage requête supérieur
Figure 13 : Affichage du supérieur.

Filtrer les subordonnés à un employé

Création requête subordonnés
Figure 14 : Requête trouver les subordonnés.

Nous retrouvons bien les deux subordonnés de « Marie ».

Affichage requête subordonnés
Figure 15 : Affichage des subordonnés.

Récupérer ceux sans supérieur

Création requête sans supérieur
Figure 16 : Requête employés sans supérieur.

Sans surprise, nous récupérons bien « Pierre ».

Affichage requête sans supérieur
Figure 17 : Affichage employés sans supérieur.

Plusieurs colonnes liées

Il est possible de lier plusieurs fois la table mère.

Deux clés étrangères sur la clé primaire
Figure 18 : Structure table avec plusieurs relations réflexives.

Dans ce cas, il faudra inclure dans les relations deux fois la table [T_GENEALOGIE], une pour le lien [T_ GENEALOGIE].[GEN_MERE] et une pour [GENEALOGIE].[GEN_PERE].

Notes

Microsoft Access utilise cette technique dans les tables systèmes.

Limites

Je déconseille d’utiliser une relation réflexive pour gérer une hiérarchie aussi complexe qu’un organigramme.

Niveaux d’imbrication

Que ce soit sous forme de relation avec deux tables, ou réflexive, cette technique n'est réellement utilisable que s'il n'y a qu'un niveau d'imbrication.

Il devient difficile de manipuler des sous-niveaux.

S'il est aisé de retrouver le supérieur direct de "Anne" qui est "Marie", il devient difficile d'afficher la hiérarchie complète, « Jean » => « Anne » => « Marie » => « Pierre ».

Pas de plusieurs à plusieurs

Un subordonné peut avoir un responsable direct et un seul, dans la réalité, ce ne sera pas forcément le cas.
Loïc pourrait avoir « Pierre » comme responsable, mais aussi « Jean ». Cette structure ne le permet pas. La relation entre [EMP_ID] et [EMP_SUP] est forcément de type 1 à plusieurs.

Un gestionnaire de liste

Nous utilisons souvent ce que j'appelle des listes de confort :

  • civilités (madame; monsieur, etc.) ;
  • types de téléphone (portable, fixe, etc.) ;
  • mois (janvier, février, mars, etc.).

En règle générale, le concepteur créera une table par liste : T_TYPE_TEL – T_CIVILITE – T_MOIS – etc.

Regrouper les tables

Nous avons une table [T_LISTE].

Structure des listes et leurs éléments
Figure 19 : Structure table T_LISTE.

Volontairement, je n'utiliserais pas de clé primaire numérique, mais je la place sur [LIST_ITEM].

Comme précédemment, la table T_LISTE est dupliquée dans la fenêtre des relations pour créer le lien entre [LIST_ITEM] et [LIST_LIEN].

Le champ [LIST_ITEM] contient l’ensemble des termes, et [LIST_LIEN] les valeurs critères de filtres.

Table des listes et leurs éléments
Figure 20 : Affichage table T_LISTE.

Filtrer les catégories

Les enregistrements dont le champ [LISTE_LIEN] est nul, sont considérés comme les titres des listes et seront utilisés comme critères pour filtrer sur une catégorie.

Création requête catégorie des civilités
Figure 21 : Requête catégorie "Civilités".

Pour filtrer sur une autre catégorie, il suffit de changer le critère.

Création requête catégorie des types de voies
Figure 22 : Requête catégorie "Voies".

Afficher les catégories

La requête est inchangée, seul le critère change.

Création requête catégorie
Figure 23 : Requête catégories.

Ce système est facile à utiliser puisqu'il suffit de copier/coller la requête et changer la valeur du critère.

Formulaire de gestion

Un formulaire [Liste_fr], permet d’ajouter/supprimer/modifier une catégorie et ses items.

Formulaire gestion des listes
Figure 24 : Formulaire de gestion de liste.

Table exemple

La table [T_SAMPLE], affiche les listes filtrées par catégories.

Structure table exemple
Figure 25 : Table exemple.

Utilisation

Télécharger le fichier (Microsoft Access 2010).
Pour utiliser ce gestionnaire, exporter la table T_LISTE et le formulaire [Liste_fr] dans votre projet.


Achetez mon ouvrage !

Mon PDF « Créer un planning perpétuel sur Microsoft Excel sans macro » est disponible à la vente.

Pour plus d’informations, rendez-vous sur la page dédiée.