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
|