ACCESS : LES RELATIONS (a)

1-Avant de commencer

Ce cours inclut des exercices pour expérimenter les relations entre les tables. Il utilise le fichier commerce3.accdb.

2-Introduction

On relie des tables entre elles par des champs en commun pour éviter la redondance. Il est inutile de réécrire plusieurs fois les mêmes informations.

Ex : inutile de réécrire une information sur un client à chaque facture.

La force des tables reliées est de donner accès à de l'information d'une autre table à laquelle vous n'auriez pas eu accès sans une relation entre les tables.

Prenons l'exemple des tables Client et Facture. La table Facture contient le champ fact_cli_id et aucune autre information sur le client. Mais ce champ est la clé pour relier les deux tables. Il est possible de le relier au champ cli_id de la table Client. Une fois relié, il est ensuite possible d'avoir les autres informations sur le client tel que le nom de la compagnie, son adresse, etc.

Relation client facture

3-Les types de relations ou la cardinalité

Il existe trois types de relations : un à un, un à plusieurs et plusieurs à plusieurs.

Ce n'est pas toujours évident de déterminer quel genre de relation, appelé également cardinalité, existe entre deux tables.

Il faut se poser deux questions :

Les deux questions commencent toujours par : « Pour un enregistrement de ceci, combien de cela ? »

Les deux seules réponses acceptables sont soit un ou plusieurs. Une fois que vous avez les réponses, placez-les dans le petit tableau qui suit. Il faut inverser la question numéro deux pour la rentrer dans le tableau.

  1. Remplacez les "?" par les résultats (un ou plusieurs).
Détermination le type de relation
  Table 1   Table 2
Q1: 1 -> ?
Q2: ? <- 1
Max:      
  1. Ensuite, écrivez dans la dernière ligne le résultat le plus élevé des deux colonnes. Vous connaîtrez ainsi le type des relations.

Le prochain exercice consiste à expérimenter ce petit truc.

Vous allez essayer de déterminer quel type de relation existe entre les tables Facture et Client. Vous devez vous poser les questions :

  1. Remplissez ensuite le tableau ci-dessous.
Résultat du type de relation
  Facture   Clients
Q1: 1 -> 1
Q2: Plusieurs <- 1
Max: Plusieurs   1

Effectivement, il s'agit bien d'une relation d'un à plusieurs de Client vers Facture. Vous pouvez maintenant essayer avec d'autres tables ou d'autres situations.

Ceci veut aussi dire que vous pouvez trouver seulement une fois l'information en commun dans l'une des tables et plusieurs fois dans l'autre.

Pour cet exemple, chaque valeur du champ cli_id de la table Client est unique. Il n'y a pas deux enregistrements (ou clients) avec le même numéro de client.

Cependant, dans la table Factures, vous pouvez retrouver le même numéro de client pour plusieurs enregistrements différents. C'est pour cette raison que la relation est appelée de 1 à plusieurs.

L'information en commun se retrouve seulement une fois dans la première table (Client) et potentiellement plusieurs fois dans la seconde (Factures).

3.1-Relation un à un

Ex : Un homme est marié à une seule femme. Une femme est mariée à un seul homme.

3.2-Relation un à plusieurs

Ex.: Une personne peut posséder plusieurs voitures. Une voiture ne peut être possédée que par une seule personne. (On oublie les cas de copropriété).

3.3-Relation plusieurs à plusieurs

Ex : Un étudiant suit plusieurs cours. Un cours est suivi par plusieurs étudiants

Il faut faire attention lors de la conception d'une base de données avec des relations de type "plusieurs à plusieurs". Il y a plus de détails plus loin sur cette page Web sur ce cas spécial.

3.4-Ce qui est nécessaire pour faire une relation

Pour mettre en place une relation, il faut au minimum :

De ce fait, vous ne pourrez pas, par exemple, créer une relation entre les champs date et numéro de téléphone. Les champs ne sont pas des mêmes types (Date/Heure, Texte).

De même, vous ne pourrez pas créer de relation entre les champs emp_nom et emp_prenom. Bien que les deux champs soient du type Texte, ils n'ont pas le même longueur.

Il y a cependant une exception qui confirme la règle. Il est possible de faire une relation entre un champ de type NuméroAuto et un champ de type Numérique dont la taille du champ est Entier long.

Autre exception de taille : il est impossible de créer une relation de type un à plusieurs si les champs en commun sont de type NuméroAuto. Par définition, ce type de champ ne peut pas avoir deux fois la même information !

Cette exception est cependant très avantageuse.

Ex : l'utilisateur n'a pas besoin de s'inquiéter de donner des numéros d'identifications à un nouveau client. Access s'en charge automatiquement.

4-Création d'une relation dans une requête

Il est très avantageux par moment d'être capable d'afficher les informations contenues de plusieurs tables en même temps. Il faut cependant avoir une relation entre les tables pour avoir un résultat intéressant. Le prochain exercice consiste à créer une relation entre deux tables dans une requête.

  1. À partir du menu Créer, cliquez sur le bouton bouton création de requête.
  2. Depuis la liste des tables disponibles, glissez-déposez les tables Facture et Client dans la fenêtre Relations.
  3. Sélectionnez les champs suivants de la table Facture : fact_id et fact_cli_id.
  4. Sélectionnez les champs suivants de la table Client : cli_nom et cli_adresse.
  5. Exécuter la requête en cliquant sur le bouton bouton exécuter.

Ce que vous voyez est le résultat de toutes les combinaisons possibles entre les deux tables.

Remarquez que pour chaque numéro de facture il y a 5 clients ! En fait, il y a 14 enregistrements dans la table Facture et 5 enregistrements dans la table Client. Donc, il y a 14 * 5 (70) enregistrements d'activés. Ceci est en réalité impossible. La raison est qu'il n'y a pas de relation entre ces deux tables en ce moment. Si vous ne faites pas de relations entre les tables d'une requête, Access va afficher toutes les combinaisons d'enregistrements possibles entre les deux tables. Il faut créer une relation entre deux tables pour éviter ce genre de situation.

Pour retourner au mode création :

  1. Cliquez sur le bouton bouton mode création.
OU
  1. Du menu Affichages, sélectionnez l'option Mode création.
  2. Déterminez les champs en commun entre les deux tables.

Dans notre exemple, il s'agit des champs fact_cli_id et cli_id. Bien qu'ils n'aient pas le même nom, ils sont de même type. Ils ont aussi le même format ou la même longueur et contiennent le même type d'information.

relation facture-clients dans une requête
  1. Placez le pointeur sur l'un des champs en commun.
  2. Cliquez et tout en restant appuyé sur le bouton gauche de la souris, déplacez le pointeur sur l'autre champ en commun.

Une ligne mince devrait apparaître entre les deux champs.

Les deux tables sont maintenant reliées. Sinon, réessayez.

Il se peut que, par accident, vous ayez relié des champs qui n'ont pas le même genre d'information. Il faut alors retirer la mauvaise relation avant de pouvoir réessayer.

  1. Cliquez sur la ligne qui relie les deux tables avec le bouton droit de la souris.
  2. Cliquez sur le menu menu supprimer ligne supprimer.
OU
  1. Cliquez sur la ligne qui relie les deux tables.
  2. Appuyez sur la touche touche SUPPR du clavier.

Maintenant que les tables sont correctement reliées, nous pouvons afficher le résultat.

  1. Exécutez encore une fois la requête en appuyant sur le bouton bouton exécuter.

Le nombre d'enregistrements devrait avoir réduit à 14 factures.

Vous remarquerez que vous voyez les informations de deux tables en même temps ! C'est là l'un des grands avantages des bases de données relationnelles; être capable d'accéder à des informations qu'aucune table, prise seule, n'est capable de fournir. C'est seulement une fois que ces tables sont reliées qu'elles sont vraiment efficaces.

4.1-Le mécanisme d'une relation

À partir d'une requête, il est possible de modifier ou d'ajouter des enregistrements. Lorsque vous écrivez une valeur dans l'un des champs en commun, Access va essayer de trouver si cette valeur existe dans l'un des enregistrements de l'autre table reliée. S'il trouve, vous aurez accès au contenu de tous les champs de l'enregistrement.

Prenons l'exemple des tables Facture et Client qui sont reliées sur les champs en commun fact_cli_id et cli_id dans une requête.

Si vous écrivez un chiffre entre 1 et 5, Access pourra trouver un enregistrement dans la table Client et vous afficher toutes les informations de l'enregistrement si vous le voulez.

Il est possible d'entrer ou de modifier une information à partir d'une requête qui contient plusieurs tables.

Vous devez vous s'assurer que l'un des champs en commun de toutes les tables reliées soit utilisé dans la requête. Sinon, Access va vous avertir qu'il ne peut pas réaliser la requête.

Le champ en commun doit être celui dans lequel vous pouvez entrer plusieurs fois la même information.

Ex : si vous faites une relation entre les tables Facture et Client sur le champ en commun cli_id, utilisez le champ fact_cli_id de la table Facture puisque vous pouvez entrer plusieurs fois le même numéro de client dans les factures.

5-Création de relations permanentes entre les tables

Il est avantageux de relier des tables dans la requête pour accéder à une information qu'aucune des tables prises seules ne possède. Le problème avec cette technique est qu'il faut refaire les relations à chaque fois que vous faites une nouvelle requête. Access vous offre une manière de créer des relations « permanentes » entre les tables de votre base de données. Elle a aussi l'avantage de vérifier « l'intégrité » des relations entre les tables.

À partir du menu Outils de base de données, il est possible d'accéder à la partie des relations.

  1. Cliquez sur le bouton bouton relations.
fenêtre relations sansla table client

C'est dans cette fenêtre que vous allez créer les relations entre les tables. Lorsque vous ouvrez cette section pour la première fois, il n'y a pas de tables; seulement un grand espace vide. Il faut premièrement ajouter les tables ou les requêtes que vous voulez relier.

Dans cet exercice, le fichier contient déjà toutes les tables qui seront nécessaires pour créer les relations sauf la table Client.

5.1-Ajouter une table

Lorsque vous allez ouvrir la zone des relations pour la première fois, elle devrait être vide. Il faut ajouter les tables ou les requêtes que vous voulez relier avant d'établir les relations.

  1. Du menu Relations, cliquez sur le bouton bouton ajouter une table.

OU

  1. Placez le pointeur de la souris dans la zone des relations.
  2. Cliquez sur le bouton droit de la souris.
  3. Du menu contextuel, sélectionnez l'option Afficher la table...
  4. afficher toutes les tables

Le menu Ajouter des tables va s'afficher (s'il ne l'était pas encore).

  1. cliquez - glissez les tables souhaitées vers la zone grise et ajuster les tailles des tables si nécessaire.
fenêtre des relations entre tables

5.2-Établir les relations entre les tables

  1. Placez le pointeur sur le champ cli_id de la table Client.
  2. Cliquez sur le bouton gauche de la souris pour sélectionner le champ.
  3. En restant appuyé sur le bouton gauche de la souris, déplacez le pointeur surs le champ fact_cli_id de la table Facture.
  4. Relâchez ensuite le bouton de la souris.

Une fois que vous aurez fait la relation, l'écran suivant va apparaître.

fenêtre de modification des relations entre tables

5.3-Appliquer l'intégrité référentielle

Cette option est nécessaire pour établir une relation « forte ». C'est-à-dire une relation qui s'assure de l'existence d'une valeur dans la table reliée.

En activant l'option Appliquer l'intégrité référentielle, Access s'assure que certaines règles d'intégrité d'une relation soient respectées et ainsi d'avoir toujours des relations correctes entre les tables reliées. Aucune information ne peut être « perdue » en laissant Access valider ces règles.

Access peut cependant refuser de créer une relation avec intégrité référentielle pour plusieurs raisons :

fenêtre index unique introuvable

Ex : plusieurs produits ont le même numéro de produit.

Il faut toujours que les champs en commun des deux tables aient une information dans l'autre table.

fenêtre erreur même type de données

Ex : le champ cli_id est de type NuméroAuto et sa taille est Entier long alors que le champ fact_cli_id et de type Numérique (ce qui et autorisé) mais sa taille est Réel double. Il faut donc modifier celle-ci en Entier long

Ex : L'un des enregistrements contient le produit numéro 5 alors qu'il y existe seulement quatre produits, de 1 à 4.

Voici la procédure à suivre pour fermer des objets qui seraient resté ouvert.

  1. Fermez la fenêtre des relations.
  2. Du menu Fenêtre, sélectionnez l'objet (table, requête ...) qui est resté ouvert.

L'option du menu ouvert vous permet de passer facilement d'un objet à un autre. Dans notre cas, c'est pour fermer tous les objets ouverts sauf la base de données et l'écran des relations.

  1. Fermez l'objet.

Si d'autres objets sont ouverts, sauf pour la base de données et l'écran des relations, répétez les opérations précédentes pour fermer ces objets. Vous pourrez ensuite réessayer de créer des relations entre les tables.

5.4-L'option Mise à jour en cascade

Cette option met à jour les enregistrements dans la ou les autres tables reliées.

Si vous changez le numéro de client, tous les enregistrements des autres tables reliées dont le code client est identique vont aussi être modifiés.

Ex : Si vous changez la valeur du champ cli_id de la table Client, Access va la changer pour tous les champs en commun des tables reliées. Dans notre cas, ce serait seulement le champ fact_cli_id de la table Facture.

5.5-L'option Effacer en cascade

Cette option efface les enregistrements de l'autre table qui ont le même champ en commun que l'enregistrement supprimé.

Quand doit-on activer cette option ? Cela dépend du contenu des tables.

Ex : pour des raisons fiscales, si un client part, il serait préférable de conserver ses données. Mais pour une autre base de données, pour des réservations par exemple, il serait préférable d'enlever les options en même temps qu'une réservation.

Voici une représentation des tables et de leurs relations. Vous devrez créer toutes les relations entre ces tables plus tard. Pour le moment, lisez les autres options concernant les relations.

fenêtre des relations entre les tables