http://www.info-3000.com/access/supportdecours/lecon17/lecon17.htm

Leçon 17 : Options des relations

Pour suivre cette leçon, vous devez avoir suivi les leçons précédentes. Ou plus précisément, vous devez être en possession de la base de données procd.mdb telle qu'elle était à la fin de la leçon précédente. Si vous n'êtes pas certain de l'avoir, vous pouvez la télécharger ici

Résumé de la leçon précédente

La fois passée, nous avons parlé des relations entre les tables. Nous avons pris comme exemple le champ PaysOrigine de T_Client que nous avons relié avec le champ Pays de la table Pays. Nous avons constaté que si nous n'appliquons pas l'intégrité référentielle, nous pouvons lier n'importe quel champ de n'importe quelle table, et que ça n'avait pas grand intérêt... L'intégrité référentielle sert à "policer" la base de données et à exiger que tous les clients fassent partie d'un pays qui existe dans la table des pays,ou qu'ils ne fassent partie d'aucun pays.

Aperçu de cette leçon

Dans cette leçon, nous allons voir les options supplémentaires qu'offrent les relations. Nous allons pouvoir changer ou supprimer les pays dans la table T_Pays, et les voir instantanément se mettre à jour dans la table T_Client.

J'ai pensé à un cas de figure : Admettons que dans T_Pays, j'aie un pays qui est mal orthographié, que va-t-il se passer ?

Nous allons essayer : Ouvrez T_Pays, et remplacez Suisse par Suice. . Sauvegardez (SHIFT ENTER si vous avez oublié). Et voilà. Ca marche !

Ah oui, ça marche ! Bien sûr, puisqu'il n'y a aucun client qui vient de Suisse !

Bien. Nous allons essayer de changer l'orthographe d'un pays dont un ou plusisuers clients est originaire. Par exemple : Josiane Balasco vient de France. Restez dans T_Pays, et remplacez France par Frense, et enregistrez.

Là j'ai un message d'erreur : . C'est bien ce que je disais : Il y a un problème !

D'accord... Eh bien, vous n'avez qu'à aller dans T_Client, chercher Josiane Balasco, et remplacer son France par Frense, et puis voilà !

Mais je ne peux pas, puisqu'il y a une relation avec intégrité référentielle ! On a vu ça lors de la précédente leçon, ce n'est pas possible !

Non, c'est vrai... Vous avez raison. Bon ceci dit, ça tombe bien qu'on ne puisse pas changer l'orthographe de France, puisque c'est la bonne orthographe. C'est quand même ce qu'on voulait, non ?

Oui, mais si ce n'était pas la bonne orthographe quand même ??? Comment je fais alors ? Je suis OBLIGE de laisser France toute ma vie, même si en fait la vraie orthographe était par exemple "République française" ?? C'est nul !

Bon, d'accord ! Bon. C'est quoi qui vous ennuie ? Ce sont les relations ? Eh bien vous n'avez qu'à les supprimer, chercher tous les clients qui viennent de France, les remplacer par "République Française" à la main, et à la fin, remplacer France par République Française dans la table T_Pays, comme ça, de nouveau les 2 tables correspondantes, et vous pourrez remettre la relation avec intégrité référentielle ! Vous suivez ?

Hein !!! Mais c'est totalement malpratique... Et si j'ai douze mille clients à changer ??? Je passe ma journée à faire ça ! C'est n'importe quoi !

Allez, vous avez gagné : Je vous donne l'astuce. Nous allons utiliser notre Suice. Un peu plus hat dans la leçon, vous avez changé Suisse en Suice. Vous n'avez pas eu de problèmes puisqu'aucun client ne provenait de Suisse - Ni de Suice d'ailleurs.

Allez dans T_Client, et définissez 3 clients comme provenant de Suice :

Et maintenant, essayez de rectifier l'orthographe de Suice en Suisse pour, par exemple Juliette Griko

Donc, d'accord, ici, je ne peux pas, à cause de l'intégrité référentielle. Ca j'ai bien compris !

Oui. Maintenant, quittez T_Pays, allez dans T_Client, et changez Suice en Suisse. Vous pouvez ?

Alors, non plus, c'est comme on disait plus haut : C'est le serpent qui se mord la queue. Alors, l'astuce, c'est ?

L'astuce consiste à quitter la table T_Client, et aller dans Outils/Relations. Cliquez 2 fois sur la relation T_Client.PaysOrigine <--> T_Pays.Pays. Cochez "Mettre à jour en cascade les champs correspondants" :. Cliquez sur OK, et quittez les relations.

Ah d'accord ! C'est cette option qui va me permettre de changer Suice en Suisse dans T_Pays sans qu'Access me dise qu'il y a un problème d'intégrité référentielle !

Exactement. Lorsque vous irez dans T_Pays, et que vous changerez Suice en Suisse, Access, discrètement, changera tous les "Suice" de T_Client en "Suisse" (En l'occurrence : Juliette Griko, Jean-Paul Belmondos et Jules Martin).

Nous allons essayer : Allez donc dans T_Pays, et Changez Suice en Suisse. Quittez T_Pays, et retournez dans T_Client : Regardez les 3 clients sont devenus "Suisse" :

D'accord. Mais ça ne marche pas dans le sens inverse je suppose : Si par exemple je dis que Juliette Griko est "Confédération Helvétique" par exemple, ça ne change pas "Suisse" en "Confédération Helvétique" dans T_Pays ?

Effectivement, ça ne marche pas dans ce sens là. C'est seulement dans la table du côté 1 que ça marche :

Et si jamais je voulais supprimer "Suisse" de la table T_Pays, ça dirait que Juliette Griko, Jean-Paul Belmondos et Jules Martin n'ont plus de pays ?

Non. Du tout ! En fait ce ne serait pas possible. Il y aurait à nouveau l'intégrité référentielle qui nous empêcherait de le faire. Essayez. Effacez Suisse de T_Pays. Vous obtenez le message d'erreur suivant :

D'accord. Donc, là, c'est impossible de supprimer Suisse. Bon dans un sens, ce n'est pas plus mal, parce que je ne vois pas pourquoi je supprimerais la Suisse si j'ai des clients qui sont Suisses !

Absolument ! D'ailleurs, si vraiment vous voulez supprimer la Suisse, vous n'avez qu'à supprimer tous les clients qui viennent de Suisse, et alors, Access vous laissera supprimer Suisse de T_Pays puisqu'il n'y a alors plus de clients correspondants.

Oui. Mais on peut quand même imaginer le cas de figure ou j'aimerais supprimer la Suisse dans T_Pays, et que j'aimerais qu'il supprime tous les clients Suisses automatiquement ?

Oui, on peut. Par exemple, imaginons que vous commercialisez des médicaments, et que soudain, une nouvelle loi suisse interdit complètement la vente par correspondance de médicaments... Du coup, vous pouvez rayer de votre table clients tous vos clients suisses. On peut :

  1. Allez dans les relations
  2. Cliquez 2 fois sur la relation T_Client.PaysOrigine <--> T_Pays.Pays
  3. Cochez la case "Effacer en cascade les enregistrements correspondants"
  4. Cliquez sur OK
  5. Quittez les relations
    Actuellement, vous avez vos 3 clients suisses :
  6. Allez dans T_Pays
  7. Supprimez "Suisse" (Je vous rappelle encore une fois qu'il NE FAUT PAS sélectionner en noir Suisse et faire Delete, mais qu'il faut bien cliquer dans la marge et faire Delete)
  8. Vous avez ce message qui n'est pas un message d'erreur, mais un message d'attention :

    Qui veut dire que vous allez supprimer la SUisse de T_Pays, mais également les quatorze millions de clients suisses de T_Client. Bon, j'exagère avec quatorze millions, il n'y en à que 3. Mais il y en aurait 14'000'000 que le message aurait été strictement le même. Access ne nous informe pas du nombre d'enregistrements effacés !
  9. Répondez OUI
  10. Quittez T_Pays
  11. Allez dans T_Client

Oh suprise ! Il y a 3 clients en moins : Les 3 suisses (Sans jeu de mots...) :

Et bien entendu, les IDClient qui sont des numéros automatiques ne se suivent plus, mais ça vous vous en doutiez. (revoyez la leçon sur les NuméroAuto si vous avez besoin de vous rafraîchir la mémoire)

En fait, c'est une option aussi pratique que dangereuse finalement...

Absolument, oui. Il faut avoir la tête bien sur les épaules, et déterminer les implications de vos choix !

Bon... Hem... On peut résumer ?

Il faut regarder chaque relation avec soin, et définir chaque option de relation en toute connaissance de cause. Il faut imaginer la base de données une fois terminée, et se poser la question à chaque fois : Est-il bien d'établir une relation, faut-il y appliquer l'intégrité référentielle, et est-il nécessaire, recommandé, ou interdit de "Mettre à jour en cascade les champs correspondants" et/ou "Effacer en cascade les enregistrements correspondants". Notez qu'il n'est pas possible de demander des options pour une relation qui n'a pas d'intégrité référentielle.

Avez-vous bien compris ?

  1. J'ai une table T_Couleur, qui contient un seul champ Couleur avec les données : Rouge et Vert. D'autre part, j'ai une table T_Ami avec 2 champs : Prenom et Couleur. Les données sont : Robert/Vert, André/Vert, Louis/Bleu et Noémie/Vert. Je définis une relation avec intégrité référentielle entre Couleur de T_Ami et Couleur de T_Couleur, avec comme option "Effacer en cascade les enregistrements correspondants". Dans la table T_Couleur, j'efface Vert. Combien me reste-t-il de clients ?
    a. 1
    b. 2
    c. 3
    d. La situation est impossible *** (Il n'y a pas Bleu dans T_Couleur)

  2. J'ai une table T_Couleur, qui contient un seul champ Couleur avec les données : Rouge et Vert. D'autre part, j'ai une table T_Ami avec 2 champs : Prenom et Couleur. Les données sont : Robert/Vert, André/Vert, Louis/Vert et Noémie/Vert. Je définis une relation avec intégrité référentielle entre Couleur de T_Ami et Couleur de T_Couleur, avec comme option "Effacer en cascade les enregistrements correspondants". Dans la table T_Couleur, j'efface Vert. Combien me reste-t-il de clients ?
    a. Plus aucun ***
    b. 1
    c. La situation est impossible
    d. Tous restent et un message d'erreur est généré

  3. J'ai une table T_Couleur, qui contient un seul champ Couleur avec les données : Rouge et Vert. D'autre part, j'ai une table T_Ami avec 2 champs : Prenom et Couleur. Les données sont : Robert/Vert, André/Rouge, Louis/Vert et Noémie/Rouge. Je définis une relation avec intégrité référentielle entre Couleur de T_Ami et Couleur de T_Couleur, avec comme option "Mettre à jour en cascade les champs correspondants". Dans la table T_Couleur, je remplace Rouge par Noir. Que se passe-t-il dans T_Client ?
    a. Rien du tout
    b. André et Noémie ont maintenant Noir comme couleur ***
    c. Tous les clients ont Noir comme couleur
    d. Rien ne change et un message d'erreur est généré

  4. J'ai une table T_Couleur, qui contient un seul champ Couleur avec les données : Rouge et Vert. D'autre part, j'ai une table T_Ami avec 2 champs : Prenom et Couleur. Les données sont : Robert/Vert, André/Rouge, Louis/Vert et Noémie/Rouge. Je définis une relation sans intégrité référentielle entre Couleur de T_Ami et Couleur de T_Couleur. Dans la table T_Couleur, je remplace Rouge par Noir. Que se passe-t-il dans T_Client ?
    a. Rien du tout ***
    b.André et Noémie ont maintenant Noir comme couleur
    c. Tous les clients ont Noir comme couleur
    d. Rien ne change et un message d'erreur est généré

Pour voir les solutions, il vous suffit de sélectionner le questionnaire ci-dessus : 3 petites étoiles *** apparaîtront en face des bonnes réponses.

Exercice

Nous allons faire un exercice amusant qui va bien illustrer ce concept de modification et de suppression des données en cascade. Nous allons lier 3 tables l'une à l'autre. Vous allez constater 2 fautes d'orthographe : Belgike et Europpe. Les voici (Créez une base de données Intercontinental.MDB dans laquelle vous créez ces 3 tables):

T_Client

Prenom Pays
André Belgike
Bernard France
Charles Belgike
Daniel Chine
Eugène Japon

T_Pays

Pays Continent
Belgike Europpe
France Europpe
Suisse Europpe
Chine Asie
Ouganda Afrique
Japon Asie

T_Continent

Continent
Asie
Afrique
Amérique
Europpe
Océanie

Une fois ces 3 tables créées, il s'agit de les relier entre elles...A vous de voir quels champs de quelles tables se lient avec quels champs de quelles autres tables... Une fois qu'elles sont liées (Avec intégrité référentielle évidemment...), il s'agit de donnes les options nécessaires pour corriger Belgike et Europpe (Bien évidemment, il doit suffire d'écrire UNE SEULE fois Belgique pour que la correction se fasse automatiquement partout. Même commentaire pour Europpe !)

Par contre, il NE DOIT PAS être possible d'effacer un pays dont au moins un client est d'origine (Ici, il s'agit de Belgique, France, Chine et Japon). Une fois tout ce travail terminé, quels sont les continents que vous pouvez effacer ?
Réponse : (Sélectionnez la ligne : Amérique, Océanie)

Téléchargez la solution de l'exercice ici (Pour tester la solution, il suffit de changer Belgike en Belgique dans la table T_Pays, et Europpe en Europe dans la table T_Continent, pour constater que c'est possible et que les modifications sont répercutées dans les tables correspondantes. Et vous ne pouvez pas effacer Belgique ni France ni Chine ni Japon dans T_:Pays, car des clients correspondent)

Si vous n'êtes pas tout à fait certain d'avoir suivi correctement toutes les étapes de cette leçon, vous avez la possibilité de télécharger ici la version de procd.mdb exactement dans l'état ou elle devrait être à la fin de cette leçon.

Aperçu de la leçon suivante

Lors de la prochaine leçon, nous verrons qu'Access est ouvert sur le monde extérieur : Il va pouvoir récupérer des données en provenances d'autres programmes de gestion de bases de données (comme DBase ou Paradox), mais maintient de forts liens avec Excel, si bien qu'on n'a pas souvent à se demander quel programme on doit utiliser pour faire telle ou telle chose, du fait même que de toute façon, les données sont assez facilement transportables. Nous verrons qu'il est même possible de transformer les tables en de simpes fichiers textes lisibles par n'iporte quel ordinateur. Bien entendu, nous verrons également comment passer de stables d'une base de données à une autre, cequi est sans doute l'opération la plus facile