Il est de bon ton de se souhaiter la bonne année. Mais vous, et vous seul, pourrez faire en sorte que cette année soit bonne, meilleure que celle qui vient de s'écouler. Apprenez à ne compter que sur vous, car personne n'est plus qualifié que vous-même pour bâtir, réparer ou améliorer votre propre vie. Personne ne fera les choses à votre place. D'ailleurs, tout ce que les autres peuvent faire, c'est souhaiter que vous le fassiez. Et ne croyez pas que tout ceux qui vous entourent vous apporteront des solutions : certains font juste partie de vos problèmes. Transformez vos résolutions en actes, et dans douze mois, retournez-vous et souriez-vous fièrement : C'était long. C'était difficile. Mais ça y est : 2017 était une bonne année, merci Moi.

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

Dans cette leçon, nous allons apprendre à créer des listes déroulantes avec beaucoup de choix, et il faudra donc créer une table à part. Nous verrons comment mettre à jour ces listes, ajouter et supprimer des éléments.

Nous comparerons ces nouvelles listes avec les listes locales de la leçon précédente.

 
Sommaire

Tant que nos listes déroulantes ne proposent que quelques choix (Monsieur, Madame, Mademoiselle, Rouge, Vert, Bleu, ...), tout va bien !

Ca se gâte si nous avons un grand nombre de choix à disposition. Imaginez un champ PaysOrigine : nous allons choisir le pays d'origine du client dans une liste de choix.

Mais il y a plus de 200 pays dans le monde ! Vous imaginez faire une liste déroulante locale avec 200 choix ? Vous en avez pour des heures !

Marche à suivre de base

Pour ce faire, nous allons carrément créer une table T_Pays, dans laquelle nous aurons la liste exhaustive de tous les pays du monde. Et, dans un deuxième temps, nous construirons une liste déroulante dans la table des clients, basée sur cette nouvelle table T_Pays.

Je vous conseille de fermer votre table T_Client, si elle était ouverte.

  1. Créez une nouvelle table :
  2. Créez un champ Pays, en texte, 50 caractères maximum : (Ca m'étonnerait qu'un pays mesure plus de 50 lettres de long)
  3. Lancez cette table en mode saisie de données, et nommez-là T_Pays. A la question "Aucune clé primaire n'a été définie", répondez Non.
  4. Entrez les pays suivants . France, Belgique et Suisse (On ne va pas écrire tous les pays, sinon, vous en auriez pour la nuit) :
  5. Fermez T_Pays :
  6. Le champ dans T_Pays s'appelle Pays, car c'est un champ générique qui contient une liste de pays. Dans T_Client, par contre, ce champ s'appelle différemment : PaysOrigine, car c'est le pays de naissance. Mais nous pourrions également avoir un champ PaysTravail et même PaysHabitation, qui seraient tous deux aussi des champs liste déroulante basés sur le champ Pays de la table T_Pays.
  7. Rouvrez T_Client en mode création. Ajoutez un champ PaysOrigine sous le prenom, et définissez-le en texte de 50 caractères, comme dans la table T_Pays :
  8. Choisissez Assistant liste de choix
  9. Ici, vous devez sélectionner le champ qui vous intéresse.
    C ce n'est pas compliqué : c'est le seul qui existe !
    Mais, si dans notre table T_Pays, nous avions eu d'autres champs comme le nom du souverain, le PIB, la superficie, ou d'autres choses, on aurait plus facilement compris pourquoi il faut sélectionner un champ spécifiquement.
  10. On peut demander à ce que la liste déroulante affiche les données dans l'ordre croissant, mais ce n'est pas vraiment ce qui nous intéresse :
  11. Si jamais la largeur de la colonne ne vous semble pas correcte, c'est le moment de l'ajuster.
  12. Ne cochez pas "Autoriser plusieurs valeurs", puisqu'on a normalement qu'un seul pays d'origine :
  13. A la question : , répondez Non. C'est une question biscornue ! Soit on dit oui : la table est enregistrée, ET une relation est créée entre T_Pays et T_Client, soit on dit Non : La table n'est pas enregistrée, ET aucune relation n'est créée. Nous verrons ces fameuses relations dans le leçon 16. Pour l'instant, elles nous sont parfaitement inutiles (même si le message semble nous en faire la promotion).

 

Lancez la table en mode saisie de données, et constatez que votre liste déroulante fonctionne parfaitement. Choisissez France pour Edith Piaf et Suisse pour Steven Spielberg (même si ce n'est pas son pays)

L'avant-dernier champ s'appelle VilleHabitation, et vos clients habitent différentes villes. Genève, Lausanne, Neuchâtel, Nyon et Fribourg. Installez dans ce champ une liste déroulante basée sur une table T_Ville, qui contiendra : Genève, Lausanne, Paris et Bruxelles.

Ce ne sont pas exactement les mêmes villes que celles qui étaient déjà en place, mais peu importe.

Comparer liste locale / liste basée sur autre table

Comparons une liste déroulante locale avec une liste basée sur une autre table. Déplaçons Civilite juste au dessus de PaysOrigine, et dans Civilite, définissez Autoriser la modification de la liste de valeurs à Oui, et Limiter à Liste à Non.

Comparons les propriétés de l'onglet Liste de choix de ces deux champs : Toutes les propriétés sont identiques, sauf Origine Source et Contenu.

Dans le cas d'une liste déroulante locale (Civilite), c'est Liste valeur, alors que PaysOrigine, c'est Table/requête (Table T_Pays en l'occurrence).

Origine source SQL

SELECT [T_Pays].[Pays] FROM T_Pays;

est une ligne de commande SQL (Structured Query Language (Langage de requête structuré). C'est une sorte langage de programmation, comme le C++ ou le Visual Basic, mais qui ne s'utilise que dans le cas de recherches dans des bases de données.

En l'occurrence, ça veut dire :

Sélectionne le champ [Pays] de la table T_Pays (Mets dans la liste déroulante tous les Pays de la  table T_Pays, en gros).

Autoriser modification plusieurs valeurs inopérant

 

Maintenant, attention ! Vous souvenez-vous de la propriété Autoriser les modifications de la liste de valeurs ? C'est cette petite icône qui permet d'ajouter manuellement de nouveaux éléments.

Eh bien dans le cas d'une liste déroulante basée sur une autre table, vous aurez beau mettre la propriété Autoriser la liste de valeurs sur Oui, cette petite icône n'apparaîtra pas, et vous ne pourrez donc rien ajouter.

Du coup, on se demande bien pourquoi cette propriété est accessible dans ce cas !

Pour modifier le contenu de votre liste déroulante, il vous sera nécessaire de vous rendre dans T_Pays, et d'ajouter, modifier ou supprimer les pays voulus.

Modification données source

  1. En mode création, déplacez PaysOrigine juste en dessous de Prenom
  2. Choisissez quelques PaysOrigine, comme suit :
  3. Fermez la table T_Client
  4. Ouvrez la table T_Pays : Supprimez la Belgique Correctement, et remplacez Suisse par Switzerland :
  5. Fermez la table T_Pays
  6. Rouvrez la table T_Client en mode saisie de données, et choisissez Switzerland pour Steven Spielberg :

Constatez les choses suivantes :

Il règne donc un certain désordre que nous apprendrons à mieux gérer par la suite !

Rafraîchissement de la liste déroulante

J'ai bien insisté pour que vous fermiez T_Client avant d'aller trifouiller dans T_Pays . D'une manière générale, je vous conseille vraiment de travailler dans une table à la fois. Voici une marche à suivre qu'il ne faut pas faire, mais qu'on est tenté de faire :

Ne pas faire - Ne pas faire - Ne pas faire - Ne pas faire - Ne pas faire - Ne pas faire - Ne pas faire - Ne pas faire

Vous êtes dans T_Client, et vous voudriez créer le pays U.S.A, afin de pouvoir le sélectionner dans la liste pour Chaplin.

  1. Ne fermez pas T_Client, et ouvrez, en plus, T_Pays, et ajoutez-y U.S.A :
  2. Ne fermez pas T_Pays, mais cliquez simplement sur l'onglet T_Client, et essayez de sélectionner U.S.A : Il n'est pas dans la liste.
Bref : Travaillez avec un seul objet à la fois (Une table, une requête, un formulaire, un  état), et prenez soin de fermer les autres objets afin d'éviter ce genre de désagréments. Il y aura des cas ou il sera nécessaire d'avoir plusieurs objets ouverts en même temps, mais pas maintenant.

 

C'est peut-être parce que U.S.A n'a pas été sauvegardé dans T_Pays (il y a encore le petit crayon) : essayez de le sauvegarder, et même de fermer T_Pays, vous constaterez que la liste dans T_Client n'est toujours pas à jour. En fait, la liste déroulante se met à jour juste au moment ou vous ouvrez la table.

Fin de ce qu'il ne fallait pas faire - Fin de ce qu'il ne fallait pas faire - Fin de ce qu'il ne fallait pas faire

Access nous interdit de modifier la source de la liste avec Autoriser les modification de la liste de valeurs lorsque notre liste déroulante dépend d'une autre table, et nous oblige à aller manuellement dans la table source T_Pays.

Formulaire de modification des éléments de liste

Nous disposons d'une autre propriété : Formulaire modifier les éléments de liste :

Nous n'avons pas encore étudié les formulaires, mais nous allons y faire une brêve incursion.

Un formulaire permet de remplir les tables de manière plus conviviale. Il peut y mettre des couleurs, agencer les champs comme on veut, et leur maîtrise demande plusieurs leçons, mais dans le cas présent, nous allons nous contenter d'un petit formulaire automatique. Suivez la marche à suivre qui suit, et vous allez comprendre l'utilité de cette fameuse propriété :

  1. Fermez T_Client

  2. Cliquez une fois sur T_pays, puis allez dans le ruban Créer / Plus de formulaires / Plusieurs éléments

  3. Fermez immédiatement ce formulaire nouvellement créé, acceptez d'enregistrer, mais, comme nom de formulaire, mettez F_Pays au lieu de T_Pays. Prenons l'habitude de commencer tous nos noms de table par T, et nos formulaires par F, comme ça, aucune confusion possible.

Vous êtes désormais l'heureux propriétaire d'un formulaire. Si vous cliquez deux fois dessus, vous l'ouvrez, et vous verrez que son fonctionnement ressemble à s'y méprendre à une table. On peut y ajouter des Pays, les modifier et les supprimer, tout pareil. Remplacez Switzerland par CH, et fermez ce formulaire.

Si vous allez dans T_Client ensuite, vous verrez le CH dans la liste :

  1. Dans T_Client, dans le champ PaysOrigine, dans la propriété Formulaire modifier les éléments de liste choisissez F_Client.

  2. Nous allons attribuer Espagne à Edith Piaf (oui, je sais, c'est un peu fantaisiste, mais vous me connaissez, maintenant) : lancez la table en mode saisie de données, et cliquez sur le petit icône que vous connaissez, car vous l'avez vu à la leçon précédente :

  3. Surprise : Nous n'avons plus une simple petite liste comme dans la leçon précédente, mais Access ouvre le formulaire F_Pays (que nous avons défini tout à l'heure - Et il ne ferme pas l'onglet de la table T_Client, ce qui n'est pas bien, si on se fie à ce que je vous ai dit un peu plus haut) dans un nouvel onglet. Ajoutez Espagne, et fermez ce formulaire.
  4. Bonne surprise : bien que la table T_Client n'a pas été fermée, vous pouvez immédiatement choisir Espagne pour Edith Piaf !

Et voilà à quoi sert la propriété Formulaire modifier les éléments de liste. Je trouve juste regrettable qu'on doive absolument utiliser un formulaire, et qu'on ne puisse pas directement sélectionner la table T_Pays .

Dans la leçon précédente, on a vu qu'on pouvait empêcher l'affichage du petit icône qui permet d'ajouter et de modifier les éléments de la liste, gâce à la propriété Autoriser les modifications de la liste de valeurs.

Eh bien, sachez que dans le cas d'une liste déroulante basée sur une autre table, si vous avez défini un formulaire avec la propriété Formulaire modifier les éléments de liste, vous aurez de toute façon ce petit icône qui vous permet de modifier la liste, même si Autoriser les modifications de la liste de valeurs est défini à Non. C'est sans doute un bug , ou une erreur de jeunesse de cette nouvelle fonctionnalité.

Résumé comparatif...

... d'une liste déroulante locale et une liste déroulante basée sur une autre table

 

Dans cette leçon, nous avons appris à créer des listes déroulantes de grande taille.

Nous avons vu comment ces listes interagissent avec d'autres tables grâce au langage SQL (Origine source).

Nous avons constaté qu'à partir d'un certain nombre de choix possible, la table externe s'impose.

Nous avons comparé les listes locales avec ces listes basées sur d'autres tables, et avons débusqué quelques ambiguïtés (notamment la propriété Formulaire modifier les éléments de liste). 

Exercice

L'exercice consiste à créer une nouvelle base de données que vous nommerez ExerciceLecon014.accdb.

Nous allons gérer une agence de vente immobilière. Nous allons stocker les divers biens immobiliers.

Créez une table T_Objet, et installez les champs suivants :

  • Description (Texte, 255 caractères)
  • Etage (Texte, 20 caractères)
  • Ville (Texte, 50 caractères)
  • AgrementProximite (Texte, 255 caractères)
  • ActuelProprietaire (Texte, 50 caractères)

Précisions :

Description

Description est un simple champ texte.

Etage

Etage une liste déroulante locale qui contient les données suivantes :

  • Cave
  • Rez
  • 1er
  • 2ème
  • 3ème

On doit pouvoir modifier cette liste avec la petite icône .

Ville

Ville est une liste déroulante basée sur une table T_Ville, qui contiendra un seul champ Ville dans lequel il y aura les données suivantes (une cinquantaine de villes, mais je ne vous en fait rentrer que 3, parce que je suis bon avec vous) :

  • Genève
  • Lausanne
  • Neuchâtel

Il ne doit pas y avoir d'icône permettant de modifier ces villes via un formulaire, car on estime que cette liste est inamovible.

AgrementProximité

AgrementProximité est une liste déroulante basée sur une table T_Agrement, dans laquelle il y a un champ Agrement, avec les données suivantes :

  • Grand magasin
  • Station essence
  • Ecole maternelle
  • Parc

On devra pouvoir accéder à un formulaire F_Agrement en cas de besoin, avec la petite icône .

On devra pouvoir sélectionner plusieurs éléments pour un seul objet.

ActuelPropriétaire

ActuelProprietaire est une liste déroulante basée sur une table T_Proprietaire, dans laquelle il y a 2 champs : PrenomNom et Telephone, avec les données suivantes :

  • Norbert Chadollin - 079.332.68.90
  • Huguette Mirat - 022.780.12.32
  • Ville de Genève - 022.791.00.00

La liste déroulante contiendra le PrenomNom et le Telephone, mais elle ne mémorisera que le PrenomNom. On devra pouvoir accéder à un formulaire F_Proprietaire en cas de besoin, avec la petite icône .

 

Une fois que vous avez créé les champs, que vous avez construit les listes déroulantes, les tables sattelites et les formulaires nécessaires, entrez les données suivantes dans T_Objet :

Premier objet :

  • Description : Appartement spacieux, 5 pièces, lumineux
  • Etage : 3ème
  • Ville : Genève
  • AgrementProximite : Parc, Ecole Maternelle
  • ActuelProprietaire : Ville de Genève

Deuxième objet :

  • Description : Place de parking couverte, fermée
  • Etage : 2ème sous-sol
  • Ville : Neuchâtel
  • AgrementProximite : Etang
  • ActuelProprietaire : Joseph Chacret, 079.880.12.89 ou 022.344.56.90

Quizz
1. Quelle est la propriété qu'il faut remplir pour permettre une modification aisée des éléments contenus dans une Liste déroulante basée sur une autre table ?
Formulaire modifier les éléments de liste
Autoriser les modifications de la liste de valeurs
Modification de liste autorisée
Ajout-suppression-modification activés
2. Est-il possible de créer une liste déroulante multi-choix, basée sur une autre table
Oui
Non
Oui, si la propriété "Multi-choix de table concordante activé" est à Oui
3. Que peut-contenir la propriété Formulaire modifier les éléments de liste ?
Une table
Une table ou une requête
Une table, une requête ou un formulaire
Un formulaire
Un formulaire ou un état
4. L'icône permet :
D'ajouter de nouveaux éléments dans une liste de choix
D'ajouter et de supprimer des éléments dans une liste de choix
D'ajouter, de supprimer ou de modifier des éléments dans une liste de choix