2010-11-05 20 views
1

J'essaie de suivre Microsoft's example sur la façon d'ajouter une option "Tous" à une ComboBox dans Microsoft Access, mais leur article ne fait pas un travail adéquat de fournir des conseils, en plus de spécifier le code. Ce que j'essaye de faire est de construire un formulaire qui permet à un utilisateur de choisir une option d'un ComboBox (les options sont générées à partir d'enregistrements dans une table), puis de créer un rapport filtré basé sur l'option sélectionnée de l'utilisateur . Le ComboBox se compose de 2 colonnes: la clé primaire/ID des enregistrements et leurs noms affichables.Ajouter "Tous" option à ComboBox utilisé pour filtrer pour rapport dans MS Access

Je ne comprends pas le code VBA Microsoft fournit suffisamment d'informations pour savoir ce qui se passe, mais j'aimerais que l'option "Tous" de mon ComboBox ait une clé/ID primaire vide, ou une valeur qui = 0 Ce n'est pas le cas, car la sélection de l'option "Tous" lors de l'utilisation du formulaire entraîne le message d'erreur "La valeur que vous avez entrée n'est pas valide pour ce champ". Cela m'amène à croire que le texte "Tous" est rempli dans la colonne clé/ID primaire au lieu de la colonne d'affichage. L'exemple m'indique d'attribuer le numéro de colonne d'affichage en tant que propriété "Tag" de la zone de liste déroulante - et dans ce cas, mon numéro de colonne d'affichage est 2. Cependant, cette erreur (et presque toute autre valeur ajoutée) message.

Une idée si l'exemple de Microsoft est même applicable à mon cas, ou ai-je besoin d'ajuster leur code en quelque sorte?

Répondre

3

Vérifiez la propriété Source de contrôle de votre zone de liste modifiable. On dirait qu'il peut être lié à un champ dans la source d'enregistrement du formulaire. Si vous en faites un non lié contrôle (rien dans la propriété Source contrôle), vous devriez être en mesure de sélectionner n'importe quel élément de la source de ligne du combo sans accès se plaindre à vous.

que votre source Row combo est une requête comme ceci:

SELECT id, disp_name 
FROM YourTable 
ORDER BY disp_name; 

Vous pouvez ajouter une ligne "all" avec une requête UNION:

SELECT id, disp_name 
FROM YourTable 
UNION ALL 
SELECT TOP 1 0, "**ALL**" 
FROM AnyTable 
ORDER BY disp_name; 

uneTable peut être tout cela. S'il vous arrive d'avoir une table qui ne contient qu'une seule rangée, utilisez celle-là ... et vous n'auriez même pas besoin de la pièce TOP 1. Essayez simplement de ne pas utiliser ReallyBigTable comme AnyTable.

Modifier: En fait, certains ReallyBigTable serait bien si elle a une clé primaire ou un autre champ unique que vous pouvez utiliser dans une clause WHERE pour récupérer une seule ligne:

SELECT id, disp_name 
FROM YourTable 
UNION ALL 
SELECT 0, "**ALL**" 
FROM ReallyBigTable 
WHERE pk_field = 1 
ORDER BY disp_name; 

UNION ALL retournera tous rangées combinées. Si vous avez des lignes en double, vous pouvez les réduire en utilisant simplement UNION au lieu de UNION ALL.

+0

On dirait que ça marche! La seule chose que je me demande, c'est comment je peux garder "Tout" en premier. Si le tri alphabétique est effectué, tout ce qui précède "Tous" dans l'alphabet apparaît en premier. – Keeb13r

+0

J'ai utilisé \ * en pensant qu'il trierait avant toutes les lettres. Ça fait avec mes paramètres régionaux. Substituez un caractère différent qui sera trier avant l'une de vos entrées existantes. – HansUp

+0

Je ne sais pas pourquoi un index ferait une différence si vous n'utilisez pas réellement le champ indexé dans la requête TOP N. Certains SHOWPLANning vous permettrait de déterminer la réponse à cela. –