2010-05-19 6 views
4

Je souhaite qu'une requête de paramètre Access demande à un utilisateur une valeur (un emplacement dans ce cas). Lorsque je tape [Enter location] dans le champ Critères, cela fonctionne très bien: j'obtiens une boîte de dialogue (Entrer la valeur du paramètre) avec une zone de texte et mon texte (Entrer l'emplacement). Jusqu'ici tout va bien. Cela fonctionne (le résultat aussi). Mais maintenant je veux une liste déroulante/liste déroulante (au lieu d'une zone de texte) pour l'utilisateur de choisir un emplacement. J'ai fait un formulaire et tapez Forms![Form1]![CmbLocation] dans le champ Critères.Liste déroulante dans la requête de paramètre Access 2007

Comme ceci: http://office.microsoft.com/en-us/access/HA011170771033.aspx

Mais je reçois encore une zone de texte (avec la référence Textlabel).

Qu'est-ce que je fais mal? Quelqu'un a-t-il un conseil?

Répondre

2

Si vous avez supprimé le paramètre de votre requête, puis que vous l'avez saisi à nouveau dans le formulaire ci-dessus, il devrait fonctionner.

Ainsi, dans le générateur de requête, dans la section des critères tapez seulement

[forms]![form1]![Combo4] 

Assurez-vous que le nom de bonne forme et le nom contrôle de la zone de liste déroulante.

Vous ne devriez pas avoir besoin de taper quoi que ce soit d'autre dans le générateur de requête. Comme indiqué, supprimez l'ancienne invite de paramètre que vous aviez précédemment dans le générateur de requête.

Maintenant, ouvrez le formulaire, sélectionnez la zone de liste déroulante, et maintenant essayez d'ouvrir la requête, il devrait ouvrir sans aucune invite. Notez que cette approche signifie que le formulaire devra être ouvert et que la zone de liste déroulante aura sélectionné une valeur AVANT de tenter de lancer la requête. Donc, si vous basez un rapport sur cette requête, puis cliquez sur le bouton pour lancer le rapport sur le même formulaire que celui avec la zone de liste déroulante. Cela garantit que le formulaire sera ouvert avant d'essayer de lancer une requête ou un rapport basé sur cette requête.

+0

Merci, en ouvrant le formulaire avant d'exécuter la requête fait la différence. Mais je dois faire mon propre formulaire, ce que je vraiment, vraiment ce qui est la boîte de dialogue MS-Access "Enter Parameter Value" standard pour montrer une zone de liste déroulante au lieu d'un champ de texte. Est-ce possible? – waanders

+0

Vous pouvez accomplir cela en retournant la question. Ce paramètre est susceptible d'être utilisé pour un rapport. Alors, lancez simplement un formulaire avec la zone de liste déroulante, puis lancez le formulaire. Par exemple: docmd.OpenReport "nom de rapport", acViewPreview ,, "certains id =" & me.MyComboBox Il est donc préférable de supprimer le paramètre de la requête sinon il va énormément contrôler votre vie ici. Vous ne pouvez pas utiliser cette requête ailleurs avec ce paramètre codé en dur. Suppression de tous les paramètres de la requête augmente considérablement la flexibilité ici et vous permet de fournir n'importe quel paramètre dans votre code comme montré ci-dessus. –

+0

Je n'aime pas non plus câbler un formulaire pour ouvrir un seul rapport, mais il est assez facile d'ouvrir un formulaire en tant que boîte de dialogue à partir d'un autre emplacement et de collecter les critères dont vous avez besoin pour ouvrir le rapport. De cette façon, le formulaire n'a pas besoin de savoir quoi que ce soit d'où il est appelé ou à quoi ses critères sont utilisés. –

3

En plus de la suggestion d'Albert, vous pouvez faire en sorte que cela fonctionne dans la requête elle-même, afin qu'elle soit "bootstrappable". Pour ce faire, vous devez écrire la fonction qui renvoie la valeur choisie dans la zone de liste déroulante sur le formulaire. Ce serait quelque chose comme ceci:

Public Function ReturnMyCriterion() As Variant 
    DoCmd.OpenForm "dlgGetCriterion", , , , , acDialog 
    With Forms!dlgGetCriterion 
     If .Tag <> "Cancel" Then 
     ReturnMyCriterion = Nz(!cmbMyCombo, "*") 
     End If 
    Else 
     ReturnMyCriterion = "*" 
    End With 
    Close acForm, "dlgGetCriterion" 
    End Function 

(lors de l'ouverture d'un formulaire avec le commutateur acDialog, le code fait une pause aussi longtemps que la forme est ouverte ou visible, pour obtenir la valeur de la zone de liste déroulante, vous devez Définissez la propriété .Visible du formulaire sur False Vous pouvez le faire dans l'événement AfterUpdate de la zone de liste déroulante ou dans le bouton OK. Vous souhaitez également un bouton Annuler qui définit la propriété .Tag du formulaire sur "Annuler", puis définit la propriété .Visible du formulaire à False, ce qui est relativement une approche standard pour travailler avec des formulaires de dialogue dans Access).

Vous seriez alors faire le critère dans votre requête soit:

Like ReturnMyCriterion() 

C'est, en supposant que vous voulez renvoyer tous les enregistrements si aucune valeur est choisie dans la zone de liste déroulante.

+0

Et où dois-je placer le code ReturnMyCriterion? – waanders

+0

Le même endroit où vous mettez le paramètre que vous essayez de remplacer. –

+0

David> merci! – waanders