J'ai une base de données qui suit le contrôle qualité des employés. J'aimerais pouvoir effectuer une recherche par un seul membre du personnel, une équipe entière ou une unité. J'ai trois contrôles qui correspondent à ces champs et un seul peut avoir une valeur à la fois. Dans ma question, j'aimerais avoir trois expressions qui limiteront mes résultats par l'un de ces trois champs. J'ajoute juste un pour commencer et j'ai rencontré un problème.
J'ai trouvé ça https: //www.acuitytraining .co.uk / microsoft-training-courses / access / if-statements / qui semble faire ce que je veux. Voici le code que j'essaye.
IIf(IsNull([Forms]![MainMenu]![btnManagersMenu].[Form]![cmbStaffSelect]), [UserLogin] Like "*",[UserLogin]=[Forms]![MainMenu]![btnManagersMenu]. [Form]![cmbStaffSelect])
Ce qui fonctionne bien si le contrôle a une valeur. (la condition est fausse) Si la liste déroulante n'a aucune valeur (la condition est vraie), je n'obtiens aucun résultat. Je soupçonne que le problème vient du Like "*" sur mon champ UserLogin. Voici mon assistant de requête et l'assistant de construction pour l'expression IIF
Quelqu'un peut-il voir pourquoi je n'obtiens aucun résultat pour le contrôle déroulant être vide. À mon avis, cela devrait me donner une liste de résultats non filtrée. J'ai revérifié mes données et il y a 137 enregistrements qui devraient apparaître si je ne suis pas limité par la sélection du personnel.
La version courte de ceci est si cmbStaffSelect a une valeur, je veux que mes enregistrements soient limités par cette valeur. Si cmbStaffSelect est vide, je veux obtenir tous les enregistrements.
3 Réponses :
Peut-être que votre IsNull ([Forms]! [MainMenu]! [btnManagersMenu]. [Form]! [cmbStaffSelect]) renvoie toujours false car cmbStaffSelect peut être égal à une chaîne vide?
Essayez quelque chose comme ceci: IIf (Trim ([Forms]! [MainMenu]! [BtnManagersMenu]. [Form]! [CmbStaffSelect] & "") = "", [UserLogin] Comme "*", [UserLogin] = [Forms]! [MainMenu]! [BtnManagersMenu]. [Formulaire]! [CmbStaffSelect])
Ceci vérifie si cmbStaffSelect est "" ... si cmbStaffSelect est nul - il le convertit en "" en ajoutant un "" à la valeur nulle.
Gardez à l'esprit que la fonction En tant que tel, si les arguments then ou else ont le potentiel d'erreur lors de l'évaluation (quel que soit le résultat de l'évaluation de l'expression de test), alors l'expression Comme alternative, vous pouvez utilisez la fonction iif
évaluera toujours à la fois les puis et else , avant de renvoyer la valeur appropriée en fonction de la valeur renvoyée lors de l'évaluation de l'expression de test fournie. iif
a le potentiel d'erreur. Nz
pour obtenir le même résultat: [UserLogin] LIKE Nz([Forms]![MainMenu]![btnManagersMenu].[Form]![cmbStaffSelect],"*")
Pour certains autres, cela pourrait arriver - j'ai également eu un problème avec cmbStaffSelect étant = "" au lieu d'être NULL. Une fois, j'ai corrigé que cette méthode fonctionnait un régal. Merci beaucoup pour la méthode alternative.
Je pense que votre intuition est tout à fait correcte. Si vous souhaitez que le résultat de votre requête renvoie le symbole * pour le champ UserLogin; puis modifiez votre déclaration IIF comme suit: [UserLogin] = "*"
Je ne veux pas qu'il renvoie le * comme critère, je veux qu'il n'y ait aucun critère du tout si le contrôle est vide. Ce que je veux, c'est pouvoir parfois sélectionner une équipe en particulier lorsque je vois les enregistrements. D'autres fois, je veux voir l'ensemble de données. Mon problème est que si j'ai une valeur dans cmbStaffSelect, cela fonctionne bien, je ne vois que ce membre de l'équipe. S'il n'y a aucune valeur dans cmbStaffSelect, je n'obtiens aucun résultat. Ce que je veux obtenir, ce sont TOUS les résultats, illimités par le nom du personnel.
Eh bien, un «champ calculé» renvoie une valeur dans ce champ. Ainsi, votre déclaration IIF ne peut renvoyer qu'une valeur de CECI ou CELA.
Je pensais que c'était un «champ calculé» qui renvoie une valeur dans ce champ. Si à la place vous essayez une déclaration IIF dans les critères - essayez ceci à la place: je l'appellerai le champ X qui a les critères. Avoir ce champ deux fois dans la requête (le second doit avoir un nom d'alias) Dans le premier, mettez vos critères: [Forms]! [MainMenu]! [BtnManagersMenu]. [Form]! [CmbStaffSelect] ), [UserLogin] ------------------------- Dans le deuxième champ Critères X, dans la ligne de critères suivante (ce qui signifie qu'il s'agit d'une instruction OR) - laissez les critères Vide. Voyez si cette approche vous donne ce que vous recherchez.
Utilisez plutôt une clause WHERE dans votre requête. Comme
WHERE [UserLogin] = [Forms]! [MainMenu]! [BtnManagersMenu]. [Form]! [CmbStaffSelect] OR [Forms]! [MainMenu]! [BtnManagersMenu]. [Form]! [CmbStaffSelect] Is Null
J'ai peur de ne pas vraiment connaître SQL. Est-ce que je mettrais toute cette instruction en tant qu'expression dans le générateur de requêtes, ou est-ce que je la mettrais en tant que deux critères sous le champ UserLogin?