Leçon 13
 
Listes déroulantes locales

Dans cette leçon, nous allons apprendre à concevoir les listes déroulantes : plutôt que d'écrire du texte dans les champs, pourquoi pas choisir les valeurs possible dans une liste ?

Nous verrons qu'il est possible de choisir une seule valeur, mais aussi plusieurs à la fois pour le même enregistrement.

Liste de choix, liste déroulante, liste modifiable : ce sont des synonymes.

 
Sommaire

Pourquoi utiliser une liste déroulante ?

Nous allons ajouter le titre de civilité (Monsieur, Madame, Mademoiselle) à nos clients.

Ouvrez votre base de données, et la table T_Client en mode création. Créez un nouveau champ tout à gauche que vous nommerez Civilite.

Lancez la table en mode saisie de données, et recopiez les civilités, comme ceci (La faute d'orthographe est voulue) :

Comme vous le constatez, non seulement on peut se tromper (Monssieur), mais on peut aussi écrire M.

Evidemment, lorsque nous allons rechercher tous les Monsieur, il nous manquera Michael Jackson et Steven Spielberg.

Création d'une liste déroulante

 

Aussi, plutôt que de laisser la saisie libre, nous allons nous faire épauler par une liste déroulante qui va se présenter comme ceci :

Pour ce faire :

  1. Choisissez Assistant liste de choix dans Civilite :
  2. Cochez Je taperai les valeurs souhaitées, et suivant :
  3. Remarque pour la suite : N'appuyez pas sur ENTER après avoir écrit Monsieur, mais appuyez plutôt sur Tabulation, sinon, c'est comme si vous cliquiez sur Suivant.
    Ecrivez Monsieur, Madame, Mademoiselle, comme ceci, et Suivant :
  4. Cliquez sur Terminer :

La liste déroulante n'est pas un type de données

Constatez que le champ est revenu à Texte.

La liste de choix n'est donc pas un type de données particulier, mais un assistant pour remplir les données. Si votre liste de choix avait dû choisir entre des données numériques (Choisir le pourcentage de rabais 2,3,5,10,15 ou 30% par exemple), il aurait fallu définir le champ comme Numérique avant de re-choisir par dessus : Assistant liste de choix.

On peut ouvrir une liste déroulante sans utiliser la souris, grâce au raccourci-clavier . On peut ensuite descendre dans la liste avec simplement la touche , et on peut valider son choix avec

Lancez la table en mode saisie de données,et il vous suffit de cliquer dans le champ Civilité de n'importe quel client pour faire apparaître la flèche qui vous permettra d'accéder au choix Monsieur, Madame, Mademoiselle.

Constatez que le M. et Monssieur sont toujours présents. Ils n'ont pas été effacés ou remplacés par Monsieur. Je dis ça car si vous êtes en présence d'une grosse table qui contient déjà des milliers de civilités, et qu'une liste déroulante est déjà en place, rien ne prouve que les données qui s'y trouvent soient forcément des éléments de la liste !

Auto-complétion

Pour choisir une civilité, vous pouvez bien sûr cliquer sur Monsieur, madame ou mademoiselle, mais vous pouvez également taper les premières lettres dans la zone de liste : si vous écrivez m, il complète par le premier mot qui commence par m (Monsieur).

Si vous écrivez ma, il écrit Madame, et si vous écrivez made, il écrit Mademoiselle.

Ca s'appelle l'auto-complétion.

Pour le coup, nous sommes en train de prétendre que Chaplin est Mademoiselle... Laissons-le, mais c'est  une erreur...

Ici, on le fait un peu exprès, mais des erreurs humaines, dans les bases de données, vous ne pourrez jamais y échapper, gardez-le à l'esprit.

Choix d'une valeur absente de la liste

Que se passe-t-il si on essaie d'écrire une civilité qui n'est pas dans la liste ?

Admettons que Patrick Bruel soit avocat, et que nous désirions le faire maître ? Essayez, et enregistrez avec CTRL-S pour vous assurer de la validité de votre entrée.

Pas de souci !

Par contre, ce n'est pas pour ça que Maître va se retrouver dans la liste pour les prochaines fois !

Il y n'y a toujours que Monsieur, Madame ou Mademoiselle !

Ajout de nouveaux éléments dans la liste

Comment faire pour ajouter des nouveaux éléments dans la liste ?

Par exemple, imaginez que vous avez beaucoup de médecins, et que vous désiriez proposer également Docteur ? Par exemple, imaginons que Coluche soit médecin (par le rire ) :

Cliquez sur la flèche de la liste déroulante, et cliquez sur le petit icone qui apparaît en bas.

Ecrivez Docteur sous Mademoiselle,
et cliquez sur OK :

Voilà : vous pouvez maintenant choisir Docteur. ça restera disponible, même si vous fermez la base de données et que vous la rouvrez :

 

Revenez en mode création. En dessous de votre table, vous avez les propriétés des champs. Et vous avez un 2ème onglet (Liste de choix). Cliquez dessus. Regardez la propriété contenu : c'est le contenu de votre liste, et vous pouvez la modifier directement ici, comme si vous aviez utilisé le petit icone dont on vient de parler. Observez sa structure d'éléments entre guillemets séparés par des points-virgules : "Un élément";"Un autre élément";"Etc."

 

 

Exercice : supprimez Mademoiselle de la liste, car on l'utilise de moins en moins au profit de Madame, et vérifiez ensuite si, malgré cette supression, Chaplin est toujours bien Mademoiselle.

 

Interdiction d'entrer une valeur absente de la liste

Plus haut, nous avons pu écrire la civilité Maître, bien que cet intitulé ne faisait pas partie de la liste déroulante (à titre exceptionnel, si on veut bien)

Si vous voulez interdire ce genre d'exception, et exiger que toute valeur choisie soit un élément de la liste, Mettez la propriété Limiter à liste de Civilite à Oui.

Lancez la table en mode saisie de données, et essayez maintenant de préciser que Coluche est Maître.

Appuyez simplement sur ENTER, ou cliquez dans un autre champ : Il ne vous laisse plus écrire Maître comme si de rien n'était : Il vous affiche un message d'erreur, mais qui n'est pas une fin de non  recevoir : il vous propose de garnir la liste avec le Maître en plus !

Ce message d'erreur est trompeur !

Access vous laisse penser que la propriété Limiter à liste, quand elle est mise à Oui, vous interdit d'effectuer des choix non proposés dans la liste déroulante, mais vous permet d'ajouter de nouveaux choix "officiellement" (Maître, en l'occurrence).

Cliquez sur Oui.

Il vous demande d'enregistrer la structure de la table. Dites Oui.

C'est maintenant que vous êtes gratifié d'un message d'erreur Access à peu près incompréhensible :

Et vous voici revenu à la case départ !

Si vous rappuyez sur ENTER ou que vous cliquez sur un autre champ, vous aurez à nouveau ces boîtes de dialogue... Votre seul salut sera d'appuyer sur !

Constatez également que vous disposez bien du petit icone en bas de la liste pour modifier la liste, mais n'insistez pas, on ne peut pas la modifier, point barre.

En fait, lorsque vous désirez limiter la liste aux seuls choix proposés, vous devez modifier 2 propriétés en même temps : Limiter à liste : Oui, mais aussi Autoriser les modifications de la liste de valeurs : Non.

Lancez ensuite la table en mode saisie de données, et attribuez Maître à Coluche.

Vous obtenez un message d'erreur qui ne vous laisse pas le choix (normal...)

 

Et quand vous cliquez sur OK, il vous affiche simplement la liste déroulante avec les choix possibles :

Ainsi, si vous avez bien tout suivi, Access ne vous offre pas la solution intermédiaire (pourtant pertinente) qui consiste à interdire d'écrire Maître si ce n'est pas dans la liste, mais qui accepte que vous l'ajoutiez officiellement dans la liste.

Dommage.

J'insiste sur ces notions, car, lors de la construction de la liste déroulante avec l'assistant, vous aurez la possibilité de commettre facilement cette erreur.

Faisons un test :

  1. Créez un champ CivTest tout en haut de la table :
  2. Je taperai les valeurs souhaitées, Suivant :
  3. Monsieur, Madame, Mademoiselle, Suivant :
  4. Cochez la case Limiter à la liste : , et cliquez sur terminer.

Et là, vous pouvez tester vous-même : Access vient de vous imposer la situation décrite plus haut, avec tous les messages d'erreur !

testez : inscrivez Maître à Coluche, encore une fois... Ce sera donc à vous, à la main, de préciser Autoriser les modifications de la liste de valeurs : Non.

Oui, oui, je suis d'accord avec vous, c'est un peu nul !

Supprimez le champ CivTest.

Liste déroulante à plusieurs colonnes

Nous allons maintenant ajouter la couleur préférée des clients (Ce n'est pas très utile dans la vie réelle, mais ça va me permettre de vous montrer d'autres possibilités).

Admettons que votre base de données va être utilisée en réseau par des gens qui parlent français ou anglais, et qu'on aimerait une petite "description psychologique" de la couleur.

Ca se passe comme ceci :

Créez un nouveau champ CouleurPreferee, après Prenom, en assistant liste de choix (texte).

Lorsque vous arriverez à cette étape, écrivez 3 comme nombre de colonnes, et inscrivez les données suivantes :

Quand vous avez sélectionné une couleur, que voulez-vous qui soit mémorisé ? La couleur en français (col1), en anglais (col2), ou la description (col3) ? ... La couleur en français, bien sûr :

En haut, si vous écrivez Couleur préférée, il va simplement renommer votre champ... On n'a pas besoin de l'assistant pour faire ça !

Ensuite, regardez la case à cocher Autoriser plusieurs valeurs (ne la cochez pas). Elle nous permettra de choisir plusieurs valeurs de la liste pour un même client.

Lancez la table en mode saisie de données, et choisissez Jaune pour Edith Piaf et Green pour Steven Spielberg (il mettra vert) :

Personnalisation de la largeur de la liste

Ma 3ème colonne (celle des descriptions) est un peu trop étroite.

Revenez en mode création, et scrutez l'onglet liste de choix des propriétés de CouleurPréférée ce qui se passe :

Contenu contient toutes les données de notre liste. Access s'y retrouve grâce à la propriété Nbre Colonnes.

Et dans Largeurs colonnes, nous avons les largeurs, dont le total doit donner Largeur liste (je ne sais pas pourquoi il ne propose pas de le faire automatiquement ).

Ne vous inquiétez pas s'il transforme 1.5cm en 1.501cm, c'est un petit arrondissement dû au fait qu'Access est un logiciel américain, programmé pour fonctionner en pouces, et il convertit donc en CM par calcul, ce qui donne cette légère approximation.

E l a r g i s s o n s donc la 3ème colonne, et profitons pour simplifier ces valeurs et calculer le total, comme ceci :

 

Lancez ensuite en mode saisie de données. La 3ème colonne est affichée complètement :

Choisir plusieurs éléments à la fois

Comment faire pour définir 2 ou plusieurs couleurs préférées ?

Vous vous rappelez, un peu plus haut, dans l'Assistant liste de choix il y avait une case à cocher Autoriser plusieurs valeurs ?

 

 

Vous avez également cette option (apparue avec Access 2007) dans les propriétés !

Basculez-là à Oui,et vous aurez un message d'avertissement qui vous précise que vous ne pourrez plus changer d'avis par la suite (vous ne pourrez plus remettre cette propriété à Non pour la couleur préférée).

Lancez la table en mode saisie de données. Maintenant vous pouvez sélectionner plusieurs couleurs à la fois grâce à des cases à cocher.

Inconvénients du multi-choix

Maintenant, vous ne jouissez plus de l'auto-complétion : plus question d'écrire r, et de voir Rouge s'écrire automatiquement, il faut cliquer dans la case à cocher.

Quand nous étudierons les requêtes, nous constaterons que ce système de multi-choix possible rend les choses quelque peu plus délicates, et il ne faut pas utiliser cette fonction à tort et à travers. Si, sur 1000 clients, il y en a 1 ou 2 qui ont plus d'une couleur préférée, je vous déconseille ce multi-choix (mettez la 2ème couleur aimée dans un champ Remarque), car les inconvénients seraient trop importants par rapport aux avantages (par exemple l'auto-complétion inactive), mais aussi pour les tris et les filtres !

Imaginez que (dans une requête, que nous verrons plus tard), vous désiriez la liste des clients qui aiment le jaune, Access vous renverra Piaf et Spielberg. Ensuite, tous les clients qui aiment le vert, il y aura Spielberg et Jackson (2 + 2 = 4 clients, alors qu'en fait, nous ne parlons que de 3 clients en tout !

Il faudra rester toujours très vigilant !

 

 

La case à cocher occupe une certaine largeur, et il suffit d'augmenter la taille de la liste déroulante pour vous débarasser de l'ascenseur horizontal :

Il existe une propriété nommée Afficher uniquement les valeurs de la source, et je n'ai aucune idée de son utilité... Si vous comprenez son utilité, n'hésitez pas à m'en faire part !

Dans cette leçon, nous avons vu l'intérêt d'utiliser la liste déroulante mono-choix (pour la civilité) et du multi-choix (la couleur préférée).

Nous avons vu que le type de données Assistant liste de choix n'est pas un vrai type de données, mais juste une aide à la saisie, et nous avons vu que les propriétés définies dans l'assistant (Contenu, Nbre colonnes, limiter à liste, ...) sont directement accessibles dans les propriétés du champ, dans l'onglet Liste de choix (on pourrait ainsi créer une liste déroulante sans même utiliser l'assistant, en commençant par définir la propriété Contrôle de l'affichage à Zone de liste déroulante).

Nous avons vu comment autoriser ou interdire les valeurs absentes de la liste déroulante, et comment en ajouter de nouvelles, dynamiquement.

Exercice

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

Il s'afgit de la gestion des candidats pour une agence matrimoniale

Vous y créerez une table T_Candidat, avec les champs suivants :

  • PrenomNom
    Texte libre

  • Sexe
    Liste déroulante : H, F
    Impossible de choisir autre chose

  • EtatCivil
    Liste déroulante : Célibataire, Séparé(e), Divorcé(e), Veuf/Veuve
    D'autres états civils comme Marié(e) ou PACSé(e) doivent pouvoir être choisis, sans pour autant qu'ils soient obligatoirement ajoutés à la liste (On aimerait même interdire de les ajouter, mais nous avons vu que ce n'est pas possible )
  • PaysHabitation
    Liste déroulante : Suisse, France, Belgique
    Impossible de choisir autre chose
  • Qualite
    Liste déroulante : Intelligent, Fort, Romantique, Sympa
    Possibilité de choisir plusieurs qualités
    Il doit y avoir la traduction en anglais à côté (Smart, Strong, Romantic, Cool)

Voici les données à entrer :

  1. Nadine Dupont, Divorcée, Suisse, Forte et romantique
  2. Pietro Sanchez, Marié, Espagne*, Smart, young**, and cool !
    * Il faut ajouter "Espagne" en mode création avant de pouvoir continuer
    ** Il faut ajouter young (jeune) en mode création avant de continuer

Quizz
1. J'ai un champ qui contient déjà des données. Sur ce même champ, je crée une liste de choix avec l'assistant :
Ce n'est pas possible
C'est possible, mais toutes les données déjà présentes, qui ne sont pas présentes dans les choix de la nouvelle liste, seront effacées
C'est possible, et toutes les données déjà présentes, qui ne sont pas présentes dans les choix de la nouvelle liste, resteront en place

Warning: Undefined variable $Q1 in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/access/cours2010/lecon013/index.php on line 441

Deprecated: strspn(): Passing null to parameter #2 ($characters) of type string is deprecated in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/access/cours2010/lecon013/index.php on line 441

Warning: Undefined variable $Q1 in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/access/cours2010/lecon013/index.php on line 442

Deprecated: strspn(): Passing null to parameter #2 ($characters) of type string is deprecated in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/access/cours2010/lecon013/index.php on line 442
2. Est-il possible de saisir quelque chose qui n'est pas proposé dans une liste déroulante ?
Non, jamais
Oui, toujours
Oui, pour autant que la propriété Limiter à liste soit définie à non
Oui, pour autant que le type de liste soit Liste ouverte

Warning: Undefined variable $Q2 in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/access/cours2010/lecon013/index.php on line 465

Deprecated: strspn(): Passing null to parameter #2 ($characters) of type string is deprecated in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/access/cours2010/lecon013/index.php on line 465

Warning: Undefined variable $Q2 in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/access/cours2010/lecon013/index.php on line 466

Deprecated: strspn(): Passing null to parameter #2 ($characters) of type string is deprecated in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/access/cours2010/lecon013/index.php on line 466
3. Est-il possible de choisir plusieurs éléments pour un même enregistrement dans une même liste déroulante ?
Oui, toujours
Non, jamais
Oui, pour autant que la propriété Autoriser plusieurs valeurs soit définie sur oui

Warning: Undefined variable $Q3 in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/access/cours2010/lecon013/index.php on line 487

Deprecated: strspn(): Passing null to parameter #2 ($characters) of type string is deprecated in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/access/cours2010/lecon013/index.php on line 487

Warning: Undefined variable $Q3 in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/access/cours2010/lecon013/index.php on line 488

Deprecated: strspn(): Passing null to parameter #2 ($characters) of type string is deprecated in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/access/cours2010/lecon013/index.php on line 488

4. J'ai créé une liste déroulante dont la propriété contenu contient :
"un";"deux";"trois";"Quatre";"Cinq";"Six"
Et la propriété Nbre Colonnes contient 3.
(Largeur colonnes contient 2cm;2cm;2cm et largeur liste contient 6cm)
A quoi va ressembler ma liste ?






Warning: Undefined variable $Q4 in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/access/cours2010/lecon013/index.php on line 518

Deprecated: strspn(): Passing null to parameter #2 ($characters) of type string is deprecated in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/access/cours2010/lecon013/index.php on line 518

Warning: Undefined variable $Q4 in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/access/cours2010/lecon013/index.php on line 519

Deprecated: strspn(): Passing null to parameter #2 ($characters) of type string is deprecated in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/access/cours2010/lecon013/index.php on line 519
5. J'ai une liste déroulante dont la propriété Autoriser plusieurs valeurs est définie à Oui, et je voudrais mettre Non à la place.
C'est possible
C'est possible, mais il vous précisera "Les données excédentaires du champ NomDuChamp seront supprimés (OK - Annuler)
C'est impossible. Il vous faudra supprimer ce champ et le recréer si vous voulez vraiment faire ça.

Warning: Undefined variable $Q5 in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/access/cours2010/lecon013/index.php on line 541

Deprecated: strspn(): Passing null to parameter #2 ($characters) of type string is deprecated in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/access/cours2010/lecon013/index.php on line 541

Warning: Undefined variable $Q5 in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/access/cours2010/lecon013/index.php on line 542

Deprecated: strspn(): Passing null to parameter #2 ($characters) of type string is deprecated in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/access/cours2010/lecon013/index.php on line 542