Fermer DBLookupComboBox1

Utilisation d'une liste de choix pour rentrer une donnée


dernière mise à jour : samedi 13 octobre 2001

Dans les bases de données, il arrive fréquemment de vouloir que le choix de l'utilisateur se limite à un certain nombre de possibilités. Si on reprend l'exemple de notre bibliothèque, on ne souhaite pouvoir entrer dans les mouvements (entrées, sorties de livres) que des livres présents dans notre inventaire. Cela évitera par exemple de saisir Delphi deux au lieu de Delphi2

Le DBCombobox

Le DBCombobox va nous permettre de rentrer "en dur" la liste de choix par l'intermédiaire de sa propriété Items.

Reprenez la base de donnée vue à la leçon 10 ou téléchargez la. Le cas échéant, donnez lui "TEST" comme nom d'alias (cf leçon 1 pour se rappeler comment on donne un nom d'alias).

Reprenez le projet construit à la leçon 10 ou téléchargez le.

Ajoutez un DBCombobox (onglet ContrôleBD) sur la form1

 

Indiquer le contenu de la liste déroulante du DBComboBox

Il faut maintenant remplir la liste qui se déroulera. Cliquez sur les ... à droite de la propriété Items et rentrez la liste de livre de votre inventaire.

Lancez le programme (F9). Cliquez sur de votre DBComboBox. Vous voyez la liste de choix se dérouler.

A ce stade, même si vous sélectionnez une valeur, cela ne rentrera rien dans votre base de donnée car on a pas encore indiqué la table et le champ qu'il faudra modifier. Si vous sélectionnez une valeur, le DBComboBox reste vide

Il reste vide car ce qu'il affiche est justement la donnée du champ de la table concernée. Pas de table indiquée => rien d'affiché.

 

Indiquer la table et le champ à modifier

Choisissez le DataSource qui correspond à la table concernée à l'aide de la propriété DataSource du DBCombobox (ici DataSource2).
Choisissez le Champ concerné à l'aide de la propriété DataField (ici LivreEmprunte)

Lancez le programme. Déplacez-vous dans le DBGrid, vous verrez que ce qui s'affiche dans le DBCombobox est bien la valeur du champ LivreEmprunte de l'enregistrement courant.

Inversement, vous pouvez modifier la valeur en question par le biais de la liste de choix du DBCombobox.

 

La plupart d'entre vous sont en train de se dire que c'est bien gentil tout cela, mais il va falloir recompiler à chaque fois que l'on ajoute un livre dans l'inventaire !
Effectivement, la solution DBCombobox est certainement bien pour rentrer par exemple "vrai ou faux" ou "oui ou non" et encore, si on a pas de problème de langue, mais ce n'est certainement pas la bonne solution pour gérer notre bibliothèque. La bonne solution est d'afficher le contenu d'un champ d'une table.
C'est le rôle du DBLookUpComboBox.

 

Le DBLookUpComboBox ou comment remplir la liste à l'aide d'une table

Création de la table

Créons une nouvelle table pour notre base de données nommées Livres.db (voir Leçon 1) :
Respectez les indications suivantes. Commencez à la remplir. Pour gagner du temps, vous pouvez la télécharger. Placez bien ce fichier dans le même dossier que les autres tables utilisées pour ce tutorial (L'alias reste ainsi valide pour cette table)

 

 

La liste déroulante du DBLookUpComboBox va être remplie à l'aide d'un champ de la table livre.

  • Placez un TTable (qui se nommera Table3) et un DataSource (DataSource3) sur notre DataModule.
  • Connectez Table3 à la Base TEST en choisissant la Table Livre
  • Connectez le DataSource3 à Table3 par l'intermédiaire de sa propriété DataSet.
  • Mettez la propriété Active du Table3 à True.

 

Placez un DBLookUpComboBox (onglet ContrôleBD) sur la Form1. Ce composant est l'équivalent d'un DBComboBox, mais il permet de remplir la liste déroulante à partir d'une table.

 

Indiquez le contenu de la liste déroulante du DBLookUpComboBox.

  • Indiquez au DBLookUpComboBox qu'il doit remplir sa liste à l'aide des données que lui fournira le DataSource3 : Modifiez la propriété ListSource du DBLookUpComboBox
  • Indiquez le ou les champ à afficher dans la liste déroulante à l'aide de sa propriété ListField. Ici, par exemple, on verra les champ NumLivre et NomLivre. (Séparer les champ par un ";").
  • Il faut maintenant indiquer quel champ sera transmis suite à la sélection par l'utilisateur d'un élément dans la liste déroulante :

Indiquez la table et le champ de cette base qui doivent être modifiés suite au choix dans cette liste déroulante.

  • Exactement de la même façon que pour le DBCombobox, indiquez quel champ de quelle Table doit recevoir cette donnée..
    Le champ pointé par DataField doit être du même type que le champ pointé par KeyField.

Lancez le programme, testez.

Actuellement, la liste déroulante apparaît ainsi :

On voit bien, dans la liste, les champs NumLivre et NomLivre.
Ce qui s'affiche dans le DBLookUpComboBox est le premier des champs décrits par la propriété ListField et donc le champ NumLivre. Il est probable que vous préféreriez voir le nom du livre et non un simple numéro.

  • La propriété ListFieldIndex permet d'indiquer lequel des champs pointés par ListField doit s'afficher dans cette partie. 0 affichera le premier (ici NumLivre) 1 affichera le 2° (ici NomLivre) etc... Pour continuer l'exemple, entrez 1 dans cette propriété ListFieldIndex.

 

Quelle valeur s'affiche dans le DBLookUpCombobox ?

Ce qui est affiché dans est l'élément de la liste déroulante qui a une valeur telle que, pour l'enregistrement en cours, son champ pointé par KeyField est égal à la valeur du champ pointé par ListField. En d'autres termes, si vous vous déplacez dans votre DBGrid, vous ne verrez une valeur s'afficher dans que si le nom du livre contenu dans l'enregistrement en cours du DBGrid existe dans la liste déroulante du DBLookUpComboBox.

Petite expérience : si vous avez suivi le cours depuis le début sans rien modifier, vous avez la possibilité de rentrer dans la table "Livres" des noms de livres de 30 caractères alors que dans le champ "LivreEmprunte" de la table "Mouvements", vous êtes limité à 15 caractères. Lancez le programme, et sélectionnez dans la liste déroulante un nom de livre supérieur à 15 caractères. Seulement les 15 premiers caractères du nom sont pris par la table "LivreEmprunte" et donc seulement les 15 premiers caractères apparaissent dans le DBGrid. Résultat, on a pas la même chaîne de caractère dans "NomLivre" que dans le champ "LivreEmprunte". On ne verra donc pas de valeur s'afficher dans le DBLookUpComboBox

Il est évident que pour un cas réel, il aurait fallu que le nombre de caractères autorisés pour LivreEmprunte et NomLivre soit le même.

Il aurait même mieux valu, dans le champ LivreEmprunte, non pas stocker le nom du livre mais un numérique correspondant au champ NumLivre de la table Livres. On aurait alors mis NumLivre dans la propriété KeyField du DBLookUpComboBox avec toujours LivreEmprunte dans la propriété DataField.

 

Trier, filtrer, la liste de choix

Pour trier la liste de choix, il suffit d'utiliser un index. Créez par exemple un index secondaire nommé IndexNomLivre indexant le champ NomLivre (cf leçon 6) affectez IndexNomLivre à la propriété IndexName de table3. Si vous relancez le programme, la liste de choix est triée par ordre alphabétique.

Pour des filtres / tris plus subtils, vous pouvez utiliser un Query au lieu de la table3. Pour plus d'explications et mieux comprendre les Query : cf Leçon 11

Source du programme


Leçon suivante

Retour au sommaire