Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/07/2011, 17h18   #1
Invité de passage
 
Matte Francois
Inscription : octobre 2010
Messages : 2
Détails du profil
Informations personnelles :
Nom : Matte Francois

Informations forums :
Inscription : octobre 2010
Messages : 2
Points : 0
Points : 0
Par défaut Multi critères incompréhensible

Bonjour à tous
Je tente de faire une requête multicritères et pour ce je me suis inpiré grandement de toute l'info donnée sur ce forum.

Je vous explique:
à partir de champs texte du formulaire toutes mes requêtes fonctionnent sauf un champ en multicriteres, toutefois si je lance un requête sur le même champ en critère simple cela fonctionne.

Si je vous demande de l'aide ce n'est pas sans avoir fait vérifié ma requête mais personne ne comprends
Voici donc le texte de mes requêtes

Multi


Code sql :
1
2
3
SELECT T_Cardex.DOSSIER, T_Cardex.DATE_D, T_Cardex.CLIENT, T_Cardex.MANDANT, T_Cardex.[NO], T_Cardex.RUE, T_Cardex.VILLE, T_Cardex.EMPLOYE_NO, T_Cardex.EMPRUNTEUR, T_Cardex.REFERENCE, T_Cardex.FACTURE, T_Cardex.DESCRIPTIO, T_Cardex.SECTEUR
FROM T_Cardex
WHERE (((T_Cardex.CLIENT) LIKE IIf(IsNull([Forms]![cardex98]![texte156]),[T_Cardex].[Client],'*' & [forms]![cardex98]![Texte156] & '*')) AND ((T_Cardex.MANDANT) LIKE IIf(IsNull([Forms]![cardex98]![texte129]),[T_Cardex].[Mandant],'*' & [forms]![cardex98]![Texte129] & '*')) AND ((T_Cardex.[NO]) LIKE IIf(IsNull([Forms]![cardex98]![texte143]),[T_Cardex].[NO],'*' & [forms]![cardex98]![Texte143] & '*')) AND ((T_Cardex.RUE) LIKE IIf(IsNull([Forms]![cardex98]![texte131]),[T_Cardex].[Rue],'*' & [forms]![cardex98]![Texte131] & '*')) AND ((T_Cardex.VILLE) LIKE IIf(IsNull([Forms]![cardex98]![texte133]),[T_Cardex].[Ville],'*' & [forms]![cardex98]![Texte133] & '*')) AND ((T_Cardex.EMPLOYE_NO) LIKE IIf(IsNull([Forms]![cardex98]![texte135]),[T_Cardex].[Employe_No],'*' & [forms]![cardex98]![Texte135] & '*')) AND ((T_Cardex.EMPRUNTEUR) LIKE IIf(IsNull([Forms]![cardex98]![texte139]),[T_Cardex].[Emprunteur],'*' & [forms]![cardex98]![Texte139] & '*')) AND ((T_Cardex.REFERENCE) LIKE IIf(IsNull([Forms]![cardex98]![texte137]),[T_Cardex].[Reference],'*' & [forms]![cardex98]![Texte137] & '*')) AND ((T_Cardex.FACTURE) LIKE IIf(IsNull([Forms]![cardex98]![texte146]),[T_Cardex].[FACTURE],'*' & [forms]![cardex98]![Texte146] & '*')) AND ((T_Cardex.DESCRIPTIO) LIKE IIf(IsNull([Forms]![cardex98]![texte161]),[T_Cardex].[DESCRIPTIO],'*' & [forms]![cardex98]![Texte161] & '*')) AND ((T_Cardex.SECTEUR) LIKE IIf(IsNull([Forms]![cardex98]![texte165]),[T_Cardex].[Secteur],[forms]![cardex98]![Texte165] & '*')));

Requete simple

Code sql :
1
2
3
SELECT T_Cardex.DOSSIER, T_Cardex.DESCRIPTIO, T_Cardex.DATE_D, T_Cardex.CLIENT, T_Cardex.MANDANT, T_Cardex.[NO], T_Cardex.RUE, T_Cardex.VILLE, T_Cardex.EMPLOYE_NO, T_Cardex.EMPRUNTEUR, T_Cardex.REFERENCE
FROM T_Cardex
WHERE (((T_Cardex.DESCRIPTIO) LIKE '*' & [forms]![cardex98]![Texte161] & '*'));

Je peux peut-être ajouté qu'avec certains mots elle sélectionne une petite quantité d'enregistrement mais la requête simple trouve tous les enregistrements.

espérant avoir été clair

Je vous remercie à l'avance
francois1234 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 18h30   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 470
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 470
Points : 7 552
Points : 7 552
Je pense que tu t'es compliqué la vie.

Essaye pour voir :

Code sql :
1
2
3
SELECT T_Cardex.DOSSIER, T_Cardex.DATE_D, T_Cardex.CLIENT, T_Cardex.MANDANT, T_Cardex.[NO], T_Cardex.RUE, T_Cardex.VILLE, T_Cardex.EMPLOYE_NO, T_Cardex.EMPRUNTEUR, T_Cardex.REFERENCE, T_Cardex.FACTURE, T_Cardex.DESCRIPTIO, T_Cardex.SECTEUR
FROM T_Cardex
WHERE T_Cardex.CLIENT LIKE '*' & [forms]![cardex98]![Texte156] & '*' AND T_Cardex.MANDANT LIKE '*' & [forms]![cardex98]![Texte129] & '*' AND T_Cardex.[NO] LIKE '*' & [forms]![cardex98]![Texte143] & '*';

Si cela ne sort pas de données quand les champs sont null met NZ([TonChampCritere],"")

ex :

Code sql :
T_Cardex.CLIENT LIKE '*' & nz([forms]![cardex98]![Texte156],"") & '*'

Attention la fonction Nz() est a utiliser avec modération car sur les nombres décimaux il arrive qu'elle fasse sauter la partie décimal ... pas cool.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 18h44   #3
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Bonjour Francois1234 et Marot_r,

Je me permets de m'immiscer...

D'un point de vue plus général, je ne suis pas certain que Access sache gérer un VraiFaux (IIf) à l'intérieur d'un WHERE...
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 19h31   #4
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 470
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 470
Points : 7 552
Points : 7 552
Richard_35, je viens de faire un test car j'avais un doute et je confirme que Access accepte le iif() dans where.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 19h51   #5
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Merci pour ton test, Marot_r.

Juste pour comprendre (simplification de la requête de Francois1234) :
Code sql :
SELECT toto, titi FROM TABLE WHERE toto LIKE iif(titi="1";"A*";"B*")
voudrait dire :
extraire tous les enregistrements de table dont toto commence par "A" si titi="1" ou toto commence par "B" si titi<>1 ?

Je n'ai pas Access sous la main mais, si Access arrive à traiter cela, alors chapeau !
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 20h40   #6
Invité de passage
 
Matte Francois
Inscription : octobre 2010
Messages : 2
Détails du profil
Informations personnelles :
Nom : Matte Francois

Informations forums :
Inscription : octobre 2010
Messages : 2
Points : 0
Points : 0
Merci à tous.

Ma façon de procéder s'appliquait au formulaire de recherche au moment ou un champ du formulaire n'est pas renseigné la recherche se fait sur les champs qui sont renseignés.

Donc 4 champs dans la table dont comme exemple
Mandant Client Ville

BBBBB RRRRR FFFFF
CCCC QQQQ YYYY
DDDD LLLLLL FFFFF
BBBBB RRRRR YYYYY

Je cherche à partir d'un formulaire ou il y a trois zone de texte
soit texte1 pour Mandant texte2 pour client et texte3 pour ville
trouver le ou les enregistrement Mandant ayant comme Mandant BB et comme Ville FF.
Tout cela fonctionne.
Je rajoute Descriptio qui est le quatrième champ de la table (champ teste)
et un quatrième champ de formulaire texte4 pour Descriptio


Mandant Client Ville Description

BBBBB RRRRR FFFFF UUUUUUU
CCCC QQQQ YYYY OOOOOO
DDDD LLLLLL FFFFF OOOOOO
BBBBB RRRRR YYYYY OOOOOO


Ma prochaine recherche dans texte4 j'inscris UUU les autres texte1 texte2 et texte3 ne sont pas renseignés alors j'exécute et aucun enregistrement ne sort
par contre si j'inscris OOO alors j'obtient

BBBBB RRRRR YYYYY OOOOOO

Je n'obtient pas les 2 autres soit

CCCC QQQQ YYYY OOOOOO
DDDD LLLLLL FFFFF OOOOOO

je n'y comprend vraiment rien

un détail: pour être certain qu'il n'y avait pas un bogue avec le la zone de texte, je l'ai recré plusieurs fois, j'ai changé son nom (remplacé Texte161 par varie)

J'ai essayé la solution proposée mais il faut que le champ texte du formulaire soit renseigné ou non

Encore une fois merci pour votre aide
francois1234 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 21h19   #7
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 470
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 470
Points : 7 552
Points : 7 552
Code :
J'ai essayé la solution proposée mais il faut que le champ texte du formulaire soit renseigné ou non
Désolé francois1234 je ne comprends pas, peux-tu poster ce que tu as testé comme SQL ? As-tu essayé avec le NZ() ? Cela devrait gérer correctement les champs vides. Quand tu mets *[TonChamp]* c'est la même chose logiquement que **, c-à-d pas de critère sur ce champ.

Une autre solution consiterai à générer le SQL à la volée avec seulement les champs nécessaires. Tu peux voir le tutorial à ce sujet sur le site.

Richard_35, oui, j'ai fait un test très semblable à celui que tu proposes et Access est capable de traiter le iif() dans la clause Where.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 03h00   #8
Invité de passage
 
Inscription : septembre 2009
Messages : 4
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 4
Points : 1
Points : 1
Par défaut Sans issu que je crois

D'abord un très grand MERCI pour votre aide.

Je ne crois pas qu'il puisse y avoir une solution dans l'immédiat et comme je serai en vacance pour les 3 prochaines semaines et que cette petite BD doit être livrée demain en fin de journée (je suis québécois donc il me reste environ 8h) j'ai pensé refaire la table, y transférer les données sans utiliser de requête (faire du copier/coller) et refaire le formulaire. Reprendre la requête d'un bout à l'autre et tester.
Croyez-le ou non ça fonctionne. Alors il ne me reste qu'à réaliser à nouveau tout le travail de présentation du formulaire, les boutons et tout sera complété. À mon retour je tenterai de faire quelques tests, entre autre en remplaçant l'ancienne table et tenté de résoudre. C'est pourquoi je ne met pas encore la mention "Résolu" car j'aimerais y voir plus clair et aussi pour vous informer, si je trouve

Pour répondre à Marot_r, j'ai copié ton script SQL "tel quel" en modifiant simplement les noms de mes textbox pour adapter. J'avais comme résultat tous les enregistrements de ma table. Malheureusement je n'ai pas conservé ce test. Je te remercie bien gros pour tout(ta disponibilité, tes tests et tes explications...etc,) et aussi pour les réponses que tu as données aux autres intervenants. BRAVO
Je n'ai malheureusement plus le temps de vérifier ce qui a pu se passer mais ici nous étions 4 programmeurs à chercher et aucun ne comprend.
J'aimerais avant de quitter ajouter que souvent on s'imagine que ACCESS ne peut faire certaine chose alors que de version en version il étonne.

Encore une fois MERCI
lemouth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 10h44   #9
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Bonjour à tous,

Confirmation du bon fonctionnement de l'imbrication du IIF dans la clause WHERE :
Code sql :
SELECT toto, titi FROM Table_test WHERE toto LIKE IIf(titi="1" , "A*" , "B*")
Provoque, si titi="1" :
Code sql :
SELECT toto, titi FROM Table_test WHERE toto LIKE "A*"
si titi<>"1" :
Code sql :
SELECT toto, titi FROM Table_test WHERE toto LIKE "B*"

Puissant, je trouve.
Merci Marot_r.
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h58.


 
 
 
 
Partenaires

Hébergement Web