Leçon 15 : Listes déroulantes basées sur d'autres tables

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 dernière fois, nous avons vu comment faire pour limiter les entrées dans un champ : En utilisant une liste déroulante locale (Dans Type de données, choisir "Assistant liste de choix"), ce qui nous permettait, par exemple, dans un champ EtatCivil, de choisir parmi les valeurs : "Marié", "Divorcé", "Célibataire", etc. plutôt que de laisser l'utilisateur saisir la valeur en entier avec les risques d'erreurs que cela comporte.

Aperçu de cette leçon

Dans cette leçon, nous allons voir qu'il n'est pas toujours possible de créer des listes déroulantes locales : Dans le cas d'un Titre (Monsieur, Madame, Mademoiselle), ou d'un état civil (Marié, divorcé, célibataire), c'est simple, car il n'y a que quelques choix possibles. Par contre, si vous avez un champs Pays, alors, c'est plus délicat : En effet, la terre compte plus de 200 pays

Oui, alors justement, avec les pays, on ne peut pas faire une liste déroulante locale, comme on a fait dans la leçon précédente ? pourquoi ?

Simplement, parce qu'il y en a trop ! Ce serait un véritable enfer de tout rentrer dans l'assistant liste de choix ! D'autant qur vous prenez le risque de mettre 2 fois le même pays... Bref, ça ne va pas.

Oui, mais si j'ai seulement besoin de quelques pays : France, Suisse, et Italie par exemple ?

Alors là, oui, on peut faire une liste locale. Mais ce n'est plus le sujet. Nous imaginons que vous avez besoin de tous les pays du monde à pouvoir choisir, à savoir :

Açores (Portugal), Afghanistan, Afrique du Sud, Albanie, Algérie, Allemagne, Andorre, Angola, Anguilla, Antigua et Barbuda, Arabie Saoudite, Argentine, Arménie, Aruba (Pays-Bas), Australie, Autriche, Azerbaïdjan, Bahamas (Iles), Bahreïn, Bangladesh, Barbade, Belgique, Bélize, Bénin, Bermudes (Iles des), Bhoutan, Biélorussie, Bolivie, Bosnie-Herzégovine, Botswana, Brésil, Brunéi, Bulgarie, Burkina Faso, Burundi, Caïmans (Iles), Cambodge, Cameroun, Canada, Cap-Vert (Iles du), Chili, Chine, Chypre, Colombie, Comores, Congo, Cook (ILES), Corée du Nord, Corée du Sud, Costa Rica, Côte d'Ivoire, Croatie, Cuba, Danemark, Djibouti, Dominique, Egypte, Emirats Arabes Unis, Equateur, Erythrée, Espagne, Estonie, Etats-Unis, Ethiopie, Falkland (Iles), Fidji (Iles), Finlande, France, Gabon, Gambie, Georgie, Ghana, Gibraltar, Grèce, Grenade, Groenland, Guadeloupe, Guam, Guatémala, Guinée, Guinée-Bissau, Guinée-Equatoriale, Guyana, Guyane, Haïti, Honduras, Hong Kong, Hongrie, Inde, Indonésie, Iran, Iraq, Irlande, Islande, Israël, Italie, Jamaïque, Japon, Jordanie, Kazakhstan, Kenya, Kirghizistan, Kiribati, Koweït, La Réunion (Île De), Laos, Les Seychelles, Lesotho, Lettonie, Liban, Liberia, Libye, Liechtenstein, Lituanie, Luxembourg, Macédoine, Madagascar, Malaisie, Malawi, Maldives (Iles), Mali, Malte, Mariannes du Nord (Îles Des), Maroc, Marshall (Iles), Martinique, Maurice (Ile), Mauritanie, Mexique, Micronésie, Moldavie (Rép. de), Monaco, Mongolie, Mozambique, Myanmar, Namibie, Nauru, Népal, Nicaragua, Niger, Nigéria, Niue, Norvège, Nouvelle-Calédonie, Nouvelle-Zélande, Oman, Ouganda, Ouzbékistan, Pakistan, Palau (Iles), Panama, Papouasie-Nouvelle-Guinée, Paraguay, Pays-Bas, Pérou, Philippines, Pologne, Polynésie française, Porto Rico, Portugal, Qatar, République Centrafricaine, République Dominicaine, République Tchèque, Roumanie, Royaume-Uni, Russie (Fédération de), Rwanda, Sahara Occidental, Saint-Christopher et Nevis, Sainte-Lucie, Saint-Marin, Saint-Vincent et les Grenadines, Salomon (Iles), Salvador (El), Samoa Occidental, Sao Tome et Principe, Sénégal, Sierra Leone, Singapour, Slovaquie, Slovénie, Somalie, Soudan, Sri Lanka, Suède, Suisse, Surinam, Swaziland, Syrie, Tadjikistan, Taïwan, Tanzanie, Tchad, Thaïlande, Togo, Tonga (Ile), Trinité-et-Tobago, Tunisie, Turkménistan, Turks et Caïcos (ILES), Turquie, Tuvalu (Iles), Ukraine, Uruguay, Vanuatu, Vatican (Cité) (Saint-Siège), Venezuela, Vierges Américaines (Iles), Vierges Britanniques (Iles), Viêt-Nam, Yémen, Yougoslavie, Zaïre, Zambie, Zimbabwe

Ah oui... Ca fait pas mal !

Oui. Donc, comme nous ne pouvons pas faire aisément une liste déroulante locale, ce que nous allons faire, c'est carrément une table des pays, qui va contenir la liste exhaustive de tous les pays du monde (cette liste ci dessus en fait). Et une fois que nous aurons construit cette table supplémentaire, nous verrons comment l'assistant liste de choix va aller puiser dans cette nouvelle table

Marche à suivre

La première chose à faire est de créer cette fameuse nouvelle table. Vous savez comment on crée une nouvelle table, vous allez donc créer une nouvelle table que vous appellerez T_Pays, avec un seul champ : Pays : . Lancez cette table en mode saisie de données, et mettez les pays suivants :

Mais... Vous avez mis 2 fois la France... C'est normal ???

Qu'est-ce que vous en pensez ?

Eh bien, je dirais que non ! Si cette liste doit servir de base à la liste déroulante dans la table T_Client pour choisir le pays du client, je pense qu'il faudrait qu'il y ait une seule fois chaque pays...

Vous pensez bien. Donc ?

Donc... Il faut faire attention à ne pas mettre 2 fois le même pays, évidemment !

Oui, Là c'est facile : Nous avons 5 pays, c'était vraiment simple de voir qu'il y avait 2 fois la France... Mais s'il y avait déjà 80 ou 100 pays, comment pourriez-vous être sûr de ne pas entrer 2 fois le même ?

Ah mais oui ! La clé primaire ! évidemment !

Voilà : Le champ pays est la clé primaire

On ne rajoute pas de NuméroAuto, qui serait une clé primaire , comme dans T_Client ?

Surtout pas ! Sinon, vous auriez ceci : . 2 fois la France avec 2 numéros différents... C'est idiot !

D'accord ! Pigé ! Donc c'est l'unique champ pays qui est aussi une clé primaire !

Absolument :

Ah ! OK. Hem... Bon, comme j'avais mis 2 fois la France, évidemment, maintenant, il ne me laisse plus mettre une clé primaire. Laissez moi 5 minutes pour régler le problème...

Prenez votre temps... N'oubliez pas donc qu'il faut d'abord enlever la clé, lancer la table en mode saisie de données, enlever la 2ème France, revenir en mode création, et remettre la clé. Si vous avez un peu de peine, refaites la leçon sur la clé primaire.

OK. J'y suis. Je rentre tous les pays du monde dans T_Pays ?

Pas comme ça, non. Sinon, vous allez en avoir pour 3 heures. Laissez simplement Suisse, France, Belgique et Italie.

Maintenant, c'est fini. Quittez la table T_Pays, et retournez dans T_Client en mode Création. Ajoutez un champ PaysOrigine : . A la place de texte, choisissez l'assistant liste de choix

C'est maintenant que ça change : Dans cette boîte de dialogue, choissez la première option : . Cliquez sur Suivant.

Dans cette boîte de dialogue, vous allez justement choisir la table qui contient tous les pays : C'est facile, c'est la seule table (A part T-Client). Cliquez dessus : , et cliquez sur Suivant.

Dans cette boîte, vous devez cliquer sur la petite flèche pour déplacer le champ pays de gauche à droite .

Ca sert à quoi ça ?

C'est dans le cas ou la table T_Pays aurait contenu plusieurs champs : Par exemple, en plus du champ Pays, nous aurions pu avoir d'autres champs comme : NomDuChefDEtat, ProduitNationalBrut, Superficie, NombreHabitant, etc. C'est à dire des champs précisant des données sur chaque pays. Alors, dans ce cas, pour notre liste déroulante, nous aurions seulement pris le nom du pays, car les autres champs ne nous auraient pas intéressés

Vous cliquez donc ensuite sur Suivant, et vous avez la représentation de votre table T_Pays : . La seule chose que vous puissiez faire ici n'est pas très importante, c'est simplement d'élargir ou rétrécir la liste :

Cliquez sur Suivant, vous arrivez à la dernière étape :

Cliquez sur Terminer.

Cette boîte de dialogue apparaît. . Répondez TOUJOURS TOUJOURS TOUJOURS TOUJOURS TOUJOURS TOUJOURS "NON" à cette question !

Pourquoi ?

Parce que si vous dites Oui, Access va faire une relation entre la table T_Client et T_Pays à votre place, et, je ne veux pas qu'il le fasse, parce que dans une prochaine leçon, nous allons voir les relations, et il est mille fois préférable de les faire soi-même que de laisser Access nous prendre par la main pour faire le travail à notre place. Nous n'avons pas encore vu ça, mais en plus, si vous aviez déjà créé une relation entre T_Client et T_Pays, Access vous l'aurait détruite pour en ajouter une de son cru si vous aviez répondu Oui. Pour l'instant c'est un peu du chinois, mais on aura l'occasion de longuement y revenir.

Bien. Pour voir ce que ça donne, lancez la table en mode Saisie de données, et essayez de choisir un pays pour le premier client : . Et voilà. Ca marche !

ATTENTION : Quand vous avez dans une table (Par exemple T_Client) un champ qui n'a pas le même nom que le champ dans une autre table (Je m'explique : Par exemple, vous avez PaysOrigine dans T_Client, mais il va puiser dans T_Pays, qui elle, contient un champ Pays - Vous voyez : Pays lié à PaysOrigine), Access va constater ceci, est va parfois insidieusement lors de la création de la liste déroulante par l'assistant remplacer le champ PaysOrigine par Pays dans votre table T_Client, pour que les champs des 2 tables aient le même nom. C'est un petit magouilleur, cet Access !!! Parce que nous, on ne veut pas changer le nom de notre champ, même s'il est lié à une autre table. N'hésitez donc pas à bien vérifier qu'il ne vous change donc pas les libellés de vos champs, et s'il le fait, contrez-le en RENOMMANT encore le champ avec le libellé que VOUS voulez ! Non mais ! Il ne va pas non plus faire trop la loi, celui-là !!! Soyez attentif parce qu'il fait sa petite affaire très discrètement !!!

Oui, mais le premier client, c'est Clunton. Il vient des USA, pas d'Italie...

Exactement. C'est ici que se montre la puissance de la liste déroulante basée sur une autre table : Voici comment ajouter USA à la liste :

  1. Fermez T_Client
  2. Ouvrez T_Pays
  3. Ajoutez USA
  4. Fermez la table T_Pays
  5. Rouvrez la table T_Client en mode saisie de données
  6. Et voilà : Vous pouvez choisir maintenant USA pour Clunton :

C'est puissant ! Et donc, si on supprime un pays de T_Pays, on ne le verra plus apparaître dans la liste Pays de T_Client ?

Oui, bien entendu. Il sera absent.

On peut résumer la marche à suivre ?

Oui. Et pour bien comprendre, nous allons faire le résumé sous forme d'exercice. Nous allons dire que chaque client habite actuellement dans une ville, et nous allons choisir la ville dans laquelle il habite dasn une liste déroulante qui va se baser sur une table externe : T_Ville

  1. Quitter T_Client
  2. Créer une nouvelle table
  3. Y installer un champ Ville
  4. NE PAS choisir liste de choix, mais laisser en texte
  5. Mettre ce champ Ville en clé primaire
  6. Lancer cette table en mode saisie de données
  7. Lors de l'enregistrement de la table, lui donner son nom : T_Ville
  8. Ecrire les villes suivantes :
    Genève
    Paris
    New-York
    Athènes
  9. Fermer cette table T_Ville
  10. Rouvrir la table T_Client
  11. Inséser un champ Ville juste en dessous du prénom
  12. MAINTENANT, chosisir "Assistant liste de choix"
  13. Choisir la première option "Je veux que la liste de choix recherche les valeurs dansune table ou requête"
  14. Cliquer sur Suivant
  15. Cliquer sur T_Ville
  16. Cliquer sur Suivant
  17. Clqiuer sur la petite flèche > pour balancer le champ ville de gauche à droite
  18. Cliquer sur Suivant
  19. Cliquer sur Suivant
  20. Cliquer sur Terminer
  21. A la question "La table doit être enregistrée afin que les relations puissent être créees", répondez NON

C'est terminé. Lancez la table T_Client en mode saisie de données, et voilà : Vous pouvez dès à présent choisir la ville pour chaque client.

Impeccable ! Ca marche.

Oui. Mais ATTENTION : Lorsque vous changez quelque chose dans la table T_Ville, il est nécessaire que la table T_Client soit fermée. Je m'explique : Certains utilisateurs connaissent bien Windows, et savent très bien qu'il est possible d'ouvrir 2 tables à la fois :

MAIS... Si vous faites comme ça (que vous travaillez sur 2 tables en même temps), vous allez avoir des surprises : Ne faites le petit exercice suivant que si vous êtes un de ces utilisateurs qui aimez bien travailler avec plusieurs fenêtres en même temps :

  1. Ouvrez la table T_Ville et T_Client : Mettez les côte à côte comme dans l'exemple ci-dessus
  2. Ajoutez une ville dans la table T_Ville : San Fransisco
  3. Allez dans la table des clients, et essayez de choisir San Fransisco pour un des clients (n'importe qui)
    Oh Surprise : San Fransisco n'est PAS dans la liste...
  4. Fermez la table T_Client, et rouvrez-là
  5. Essayez à nouveau de choisir San Fransico : Ca marche cette fois !

ça marche parce que c'est seulement lors de l'ouvertiure de la table T_Client que la liste se rafraîchit

Comment avez-vous fait pour avoir les 2 tables côte à côte ?

Je ne vais pas vous l'expliquer pour 2 raisons :

  1. Ca ne fait pas partie du cours Access
  2. ce n'est JUSTEMENT pas recommandé...

Nous allons maintenant observer la différence au niveau de la table T_Client. T_Client contient donc 2 listes locales : Titre et EtatCivil, et 2 listes déroulantes basées sur une autre table : ce sont Pays et Ville. Comparons les options de Titre et Pays : -

Vous constatez que dans "Origine Source", Titre contient "Liste Valeurs", et dans Pays "Table/Requête". C'est la première différence.

Ensuite, dans "Contenu", Titre est égal à : "Madame";"Mademoiselle";"Monsieur";"Maître", tandis que Pays vaut SELECT [T_Pays].[Pays] FROM T_Pays;

On peut facilement comprendre cette ligne SQL (Structured Query Language) : On sélectionne le champ ]Pays] de la table [T_Pays]. Même si vous ne la comprenez pas parfaitement, vous voyez l'essence même de cette commande : C'est un appel Dynamique de T_Pays, et pas une simple liste toute bête Madame,Mademoiselle, Monsieur.

D'accord ! Mais en fait, ma table T_Pays n'est pas du tout complète... Je dois la remplir à la main ?

Non. En fait, je tiens à votre disposition la table complète des pays, mais comme il s'agit d'un autre sujet (importation de données en provenance d'autres bases de données), je remet cette question à plus tard.

En faisant quelques tests, j'ai constaté que je pouvais, dans T_client, dire que des clients viennent de "YoupiLand" par exemple (c'est à dire que je n'ai pas choisi dans léa liste déroulante, mais j'ai directement écrit ça : ). C'est normal

Oui. C'est parce que vous n'avez pas limité à liste : Oui :

Ah oui ! Je me souviens ! Exactement comme dans les listes déroulantes locales, en fait ?

Oui, ça, ça ne change pas. Ce n'est pas parce que votre liste de choix va chercher les valeurs dans une autre table que ça change...

OK. Mais alors, je pense à un truc : Si jamais j'avais déjà entré pas mal de clients, et que je leur avait attribué un pays, jusqu'au moment ou je pense à Limiter la liste : Oui, il y a peut-être plein d'erreurs dans la saisie des noms de pays !

Oui. C'est pourquoi il est nécessaire de Limiter à liste : Oui. Mais en fait, il y a même avec Access la possibilité de "lier très fortement" T_Client et T_Pays de façon à être absolument certain que tous les pays qui sont saisis dans T_Client soient bel et bien répertoriés dans T_Pays. Ce sont les relations. Nous y reviendrons très prochainement.

 

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

La liste déroulante rend de précieux services : C'est une des pierres angulaires d'Access. Il est INDISPENSABLE de bien les maîtriser car c'est vraiment la clé de voûte d'une base de données. Elle permet de chosir dans une liste une valeur plutôt que de la saisir manuellement. Il y a deux manières de faire une liste déroulante : Locale, et basée sur une autre table. La liste déroulante locale est destinée à proposer quelques choix (disons au maximum une dizaine, comme par exemple l'état civil), tandis que la liste déroulante basée sur une autre table est plus difficile à mettre en oeuvre, mais est beaucoup plus puissante : Elle est utilisée quand elle propose beaucoup de choix (La ville ou le pays dans notre exemple).

Avez-vous bien compris ?

  1. J'ai une table T_VoitureOccasion qui contient plusieurs champs, dont un champ Couleur qui peut contenir environ 7 ou 8 couleurs différentes. Comment vais-je définir ce champ ?
    a. Je vais faire une liste déroulante locale ***
    b. Je vais faire une liste déroulante basée sur une table T_Couleur
    c. Je ne fais pas de liste déroulante

  2. Je suis médecin, et j'ai une table T_Patient. Dedans, j'ai plusieurs champs, dont un champ Maladie, qui contient la maladie principale du patient. Comment vais-je définir ce champ ?
    a. Je vais faire une liste déroulante locale
    b. Je vais faire une liste déroulante basée sur une table T_Maladie ***
    c. Je ne fais pas de liste déroulante.

  3. Je suis directeur d'une agence matrimoniale, et je désire placer les deux principales qualités de chaque candidat. Par exemple : Jean Muller est Attentif ET Romantique. Jules Martin est Romantique ET Intelligent. Comment vais-je procéder ? (en sachant que la liste des qualités possible est limité à 5 : Attentif, Romantique, Intelligent, Beau et Riche)
    a. Je fais un champ Qualite, en liste déroulante, basé sur une table T_Qualite (un champ suffit)
    b. Je fais un champ Qualite, en liste déroulante locale (un champ suffit)
    c. Je fais un champ Qualite1, en liste déroulante locale, et un champ Qualite2, aussi en liste déroulante locale ***
    d. Je fais un champ Qualite1, en liste déroulante basé sur une table T_Qualite, et un champ Qualite2, en liste deroulante basé sur T_Qualite également

  4. J'ai un champ NombreEnfant dans une table T_Client. Comment vais-je le définir ?
    a. Je ne fais pas de liste déroulante *** (en effet, quel intérêt d'une liste déroulante pour stocker un simple chiffre ?)
    b. Je fais une liste déroulante locale avec les valeurs Un, Deux, Trois et Quatre
    c. je fais une liste déroulante locale avec les valeurs 1,2,3 et 4

  5. Je suis Diététicien, et j'ai créé une table T_Patient. J'ai besoin de connaître le nom du médecin généraliste de chacun de mes patients. Comment vais-je procéder ?
    a. Je crée une liste déroulante locale avec le nom de tous les médecins généralistes de la région *** (si le village du diétécicien est composé de 3 ou 4 médecins seulement)
    b. Je crée une liste déroulante basée sur une table T_MedecinGeneraliste qui elle même va contenir les noms des médecins généralistes de la région ***
    c. Je ne crée pas de liste déroulante *** (toutes les réponses sont correctes...eh oui : ça dépend du nombre de médecins. A Paris par exemple, il y en a tellement, qu'est-ce vraiment la peine de les répertorier dans une liste)

  6. J'ai un champ Titre qui est une liste déroulante basée sur une table T_Titre, et qui contient : Monsieur, Madame et mademoiselle, au lieu d'avoir une liste déroulante locale qui aurait suffi. C'est :
    a. Carrément dangereux
    b. Une bonne idée
    c. Simplement inutile ***
    d. Obligatoire

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

L'exercice consiste à créer une base de données qui s'appellera Résidence. Ce sera une base de données qui contiendra une table T_Residence, qui va contenir les renseignements suivants :

  • NomResidence (Seul champ à ne pas être une liste déroulante)
  • StyleSol (Liste déroulante : Parquet, Moquette, Linoléum)
  • Etage : (Liste déroulante : Rez-de-chaussée, premier, deuxième, troisième, attique)
  • Ville : (Liste déroulante : Cannes, Nice, St-Tropez, Marseille)
  • Orientation : (Liste déroulante : Nord, Sud, Est, Ouest)
  • EpoqueDeConstruction : (Liste déroulante : 1960, 1970, 1980, 1990)
  • CouleurPlafond : (Liste déroulante : Blanc, Blanc cassé, jaune, marron)
  • CouleurMur : (Liste déroulante avec les mêmes valeurs que pour le plafond)

Comme vous le constatez, il devrait s'agir pour la plupart de listes déroulantes locales, car le nombre de choix est vraiment restreint. Mais, pour l'exercice, je vous demanderai de bien vouloir ne faire QUE des listes déroulantes basées sur d'autres tables.

Vocii quelques données-exemples pour vous aider :

  1. MON BEAU SOLEIL : Sol en lino, 1er étatge, Nice, orienté au Sud, consruit dans les années 70, plafond jaune, murs blancs
  2. DOLCE VITA : Sol en linoléum, Rez, à Marseille, Ouest, construit dans les années 90, Plafond et murs : Blanc cassé
  3. DOUCE RETRAITE : Moquette, Attique, Cannes, construit en 1971, orienté au sud-est, On ne connait pas la couleur des murs, mais le plafond est blanc

Téléchargez la solution de l'exercice ici

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 allons voir comment lier les tables entre elles. Il y a déjà une sorte de relation entre les tables, du fait même des listes déroulantes qui se basent sur d'autres tables, mais nous verrons comment "officialiser" ces relations, et nous entrerons de plein pied dans l'architecture profonde des systèmes de gestion des bases de données (N'ayez pas peur, les termes informatiques sont souvent très pompeux, mais ne cachent souvent rien de bien méchant, du moment que c'est bien expliqué) !