Nouvelle version :
Pour ajouter "[Tous]" (ou tout autre texte) en premier choix d'une zone de liste (déroulante ou pas), il est possible d'utiliser une requête UNION dans la propriété
Contenu (RowSource) du contrôle.
Imaginons que l'on veuille afficher et trier toutes les valeurs du champ
Champ1 de la table
Table1, mais faire précéder ces valeurs par la mention "[Tous]", le SQL notre requête pourrait être :
1 2 3 4 5
| Select A.Champ1
From (Select B.Champ1, 1 As IndexTri From Table1 AS B
Union
Select TOP 1 "[Tous]", 0 From Table1 AS C) AS A
Order By A.IndexTri, A.Champ1 |
Remarque : pour optimiser les performances on peut, le cas échéant, créer une table permanente (appelons la
TableListe) avec les deux champs suivants :
- EnTête (Type : String; Null Interdit : Oui; Chaine vide autorisée : Non; Index : Sans doublon),
- IndexTri (Type : Byte; Null Interdit : Oui; Valeur par défaut : 0; Valide Si : =0)
On utilise cette table en créant un enregistrement pour chaque valeur d'entête que l'on veut rendre disponible dans sa base, par exemple :
[Tous]
[Toutes]
[Aucun]
...
Ensuite, le SQL de notre requête Union servant pour la source de nos listes ressemblera à :
1 2 3 4 5
| Select A.Champ1
From (Select B.Champ1, 1 As Position From Table1 AS B
Union
Select TableListe.Entête, TableListe.IndexTri From TableListe WHERE TableListe.Entête="[Tous]") AS A
Order By A.IndexTri, A.Champ1 |
A noter aussi, concernant les performances, que d'une manière générale, pour les requêtes complexes ou ciblant plusieurs dizaines ou centaines de milliers d'enregistrements, il est préférable d'enregistrer sa requête plutôt que d'exécuter à la volée son équivalent SQL (si les tables sources bénéficient d'indexes). Dans ce dernier cas, on n'écrira plus l'instruction SQL dans la propriété RowSource de la zone de liste, mais simplement le nom de la requête enregistrée.
Partager