mercredi 22 février 2012

Access : un exemple pour illustrer une relation réflexive

Icon_Access_2010Dans cette article, je vais vous présenter la manière d’implémenter une relation réflexive sous Access (toutes versions confondues) mais avant tout

Qu’est ce qu’une “relation réflexive”.

Définition : une association est qualifié de réflexive quand elle matérialise une relation entre un entité et elle-même.

  • Ce type de relation pourra être utiliser à chaque fois qu’une notion de hiérarchie doit être mise en place entre les mêmes individus. Par exemple avec l’entité “Employés” afin de définir qui est le responsable (le chef) de qui.
  • Une autre situation qui pourrait amener à utiliser une relation réflexive c’est dans le cas de relation de parenté entre différents personnes afin d’établir qui est le père (et/ou la mère et/ou le frère/sœur et/ou le conjoint) de qui.

Comment obtenir cette relation ?

Par définition une relation est établie entre une clé primaire et une clé étrangère, la particularité dans le cas d’une relation réflexive est que la clé étrangère se trouve dans la même entité ou se trouve la clé primaire.

Un exemple

Pour notre exemple, nous allons utiliser une tables “Personnes” dans laquelle on établira les liens de parenté “à pour père” et “à pour mère

La table “Personnes” sera composée des champs suivants:

Nom du champ Type su champ Légende Commentaire
Id_personne NuméroAuto ID Clé primaire qui permet d’identifier d’une manière unique chaque personne
Nom Texte Nom Le nom de famille de la personne
Prénom Texte Prénom Le prénom de la personne
Sexe Octet Genre Liste déroulante avec 1 pour une personne de sexe masculin et 2 pour une personne de sexe féminin
Id_père Numérique (long) Père Clé étrangère permettant de désigner le père da la personne
Id_mère Numérique (long) Mère Clé étrangère permettant de désigner la mère de la personne

Afin de facilité la saisie des parents, j’utilise un contrôle “Liste déroulante” dans les champs “Id_père” et “Id_mère” afin de ne lister que les hommes pour le champ “Id_père” et que les femmes pour le champ “Id_mère

Donc nous aurons dans la propriété contenu de la liste déroulante du champ “Id_père” la requête suivante:

SELECT Personnes.Id_personne,
       UCase([Nom] & " " & [Prénom]) AS Père FROM Personnes
WHERE (((Personnes.Sexe)=1))
ORDER BY Personnes.Nom, Personnes.Prénom; 



et en prenant soin de n’afficher que la deuxième colonne.


Pour la saisie de l’id de la mère, le même principe avec juste une modification de la condition Personnes.Sexe=2


Maintenant que nous avons notre table passons à  la création de la relation.


Créer une relation réflexive sous Access:


Le principe est simple puisque la relation est entre la même table, il faudra ajouter une première fois la table en question au schéma relationnel puis l’ajouter à nouveau autant de fois qu’il y a de relation à établir (Dans notre cas, il faudra en tout ajouter trois (03) fois la table) puis établir la relation entre la clé primaire et la clé étrangère d’une même table à l’autre.


En pratique



  1. Ouvrez la boite de dialogue “Relations
    Outils de base de données > Relations > Relations
  2. Affichez, si besoin est, la boite de dialogue “Afficher la table
    Outils de relation > Créer > Relation > Afficher la table
  3. Sélectionnez la table “Personnes” puis cliquez trois fois sur le bouton “Ajouter” puis fermez la boite
    image

    Remarque :
    Access nomme la première table par son nom “Personnes” et renomme les tables suivantes en “Personnes_1” et “Personnes_2
  4. Pour établir la relation père-enfant, faites un cliquer-glisser de la clé primaire “Id_personne” de la table “Personnes_1” sur le la clé étrangère “Id_père” de la table “Personnes
  5. Appliquez les options d’intégrités référentielles
    image
  6. Pour établir la relation père-enfant, faites un cliquer-glisser de la clé primaire “Id_personne” de la table “Personnes_2” sur le la clé étrangère “Id_mère” de la table “Personnes” puis appliquez les options d’intégrités référentielles.
    Vous devriez obtenir le schéma suivant:
    image
  7. Enregistrez et fermez la boite de dialogue “Relations

Voilà, il ne reste plus qu’à créer un joli formulaire et à saisir vos données.


A la prochaine Sourire



Mots clés Technorati : ,,

5 commentaires:

  1. Bonjour,

    Tout d'abord je vous remercie pour votre billet très clair qui m'a permis de créer ma relation réflexive. Cependant, j'ai un souci concernant le formulaire de cette relation et j'aimerais avoir votre avis à ce sujet.
    J'ai une table contact à laquelle j'enregistre aussi bien les députés que leurs assistants. La clé primaire est "Prénom Nom", et la clé étrangère est "assistant".
    Mon but est de créer un formulaire avec 2 onglets, le premier permettant d'afficher la fiche contact du député et le second celui de l'assistant.
    Sous le 2ème onglet, je fait "ajouter un sous-formulaire" et je choisis la table contact. Cela affiche bien les informations de l'assistant, mais sous forme de "feuille de donnée". Or, je voudrais qu'en cliquant sur le deuxième onglet, les données de l'assistant soient présentées telles qu'un formulaire classique.
    Avez-vous une idée sur la solution ?

    RépondreSupprimer
  2. Bonjour Loana,
    Je vous propose de modifier la propriété de format "Affichage par défaut" de "Feuille de données" à "Formulaire unique" et si cela ne suffit pas de le formcer en n'autorisant que ce mode, c'est à dire mettre "Non" sur toutes les propriétés autre que "Autoriser le mode affichage formulaire".
    Cordialement

    RépondreSupprimer
  3. Ce commentaire a été supprimé par un administrateur du blog.

    RépondreSupprimer
  4. bjr,
    j'ai utilisé votre procédé pour des sociétés porteuses-portées (mères-filles) - merci !
    --> comment faire pour qu'on ait une cardinalité 0-N car certaines sociétés n'ont pas de mère (SSII porteuse) ?
    bien cordt

    RépondreSupprimer
    Réponses
    1. Il me semble que les seules possibilités de relation directeur entre deux tables sont 1 à 1 et 1 à plusieurs pour tout autre type de relation plusieurs à plusieurs par exemple il faut passé par une table de liaison.
      Pour permettre à la fois l'utilisation d'une relation réflexive avec la possibilité de ne pas avoir d'enfant, j'ai utilisé l'approche suivante:
      Un champ IdSociétéPorteuse pour la clé étrangère qui retiendra l'ID de la société porteuse (si elle existe) dont les propriétés sont les suivantes :
      Valeur par défaut : Null
      Null interdit : Non
      et bien sûr une liste déroulante pour sélectionner la société mère
      Pour ce qui est de la relation entre la table (IdSociété) et elle-même (IdSociétéPorteuse), il faudra ne pas cocher la case intégrité référentielle car si vous cochez l'intégrité référentielle vous devrez obligatoirement saisir une valeur pour la clé étrangère.
      Cordialement,
      Mehdi

      PS : à toute fin utile, je vous invite à visionner la série de vidéo suivantes : https://www.youtube.com/watch?v=nwDBiGllFRE

      Supprimer