OVH Cloud OVH Cloud

expression dans la zone critère d'une requete

8 réponses
Avatar
gomi
Bonjour

Quand on met dans la zone critères d'une requête sélection le texte suivant

Comme "*" Ou Est Null

Le résultat de la sélection est la totalité des enregistrement (valeur null
ou non null).


Ce filtre n'a en apparence pas bq d'intérêt (autant ne pas mettre de
critère), pourtant lorsque j'essaie de combiner cette condition avec une
expression du type vraifaux() ou nz() access renvoie un message du type
"syntaxe incorrecte ou expression trop complexe.."

Voici ce que j'ai essayé comme critère avec CHOIX qui est une sélection dans
une liste déroulante d'un formulaire :

VraiFaux(EstNull([CHOIX]);Comme "*" Ou Est Null;[CHOIX])

Cela ne fonctionne que si CHOIX n'est pas Null

Merci de votre aide

8 réponses

Avatar
Eric
Bonsoir,

Remplaces ton 'Comme"*" Ou Est Null' par le nom du champ entre crochet
sur lequel tu mets ce critère.

Si CHOIX est la liste déroulante d'un formulaire, la syntaxe serait :
EstNull(Formulaires!NomFormulaire![CHOIX]) si je me trompe pas.

Bonjour

Quand on met dans la zone critères d'une requête sélection le texte suivant

Comme "*" Ou Est Null

Le résultat de la sélection est la totalité des enregistrement (valeur null
ou non null).


Ce filtre n'a en apparence pas bq d'intérêt (autant ne pas mettre de
critère), pourtant lorsque j'essaie de combiner cette condition avec une
expression du type vraifaux() ou nz() access renvoie un message du type
"syntaxe incorrecte ou expression trop complexe.."

Voici ce que j'ai essayé comme critère avec CHOIX qui est une sélection dans
une liste déroulante d'un formulaire :

VraiFaux(EstNull([CHOIX]);Comme "*" Ou Est Null;[CHOIX])

Cela ne fonctionne que si CHOIX n'est pas Null

Merci de votre aide





--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
gomi
Merci pour ta réponse

Effectivement, ma formule est du type

VraiFaux(EstNull(Formulaires!NomFormulaire![CHOIX]);Comme "*" Ou est Null
;Formulaires!NomFormulaire![CHOIX])

mais je voulais être plus lisible en simplifiant à CHOIX

si comme tu le suggères je remplace ' Comme "*" Ou Est Null ' par le nom du
champ concerné par le critère ([FAC]) , j'ai la liste des enregistrements ou
FAC est pas null, mais pas ceux ou FAC est null !




Bonsoir,

Remplaces ton 'Comme"*" Ou Est Null' par le nom du champ entre crochet
sur lequel tu mets ce critère.

Si CHOIX est la liste déroulante d'un formulaire, la syntaxe serait :
EstNull(Formulaires!NomFormulaire![CHOIX]) si je me trompe pas.

Bonjour

Quand on met dans la zone critères d'une requête sélection le texte suivant

Comme "*" Ou Est Null

Le résultat de la sélection est la totalité des enregistrement (valeur null
ou non null).


Ce filtre n'a en apparence pas bq d'intérêt (autant ne pas mettre de
critère), pourtant lorsque j'essaie de combiner cette condition avec une
expression du type vraifaux() ou nz() access renvoie un message du type
"syntaxe incorrecte ou expression trop complexe.."

Voici ce que j'ai essayé comme critère avec CHOIX qui est une sélection dans
une liste déroulante d'un formulaire :

VraiFaux(EstNull([CHOIX]);Comme "*" Ou Est Null;[CHOIX])

Cela ne fonctionne que si CHOIX n'est pas Null

Merci de votre aide





--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr




Avatar
Eric
re,

t'es sur car normalement tu devrais tous les avoir, Null ou pas Null !!!

Je viens de tester et j'ai *TOUS* les enregistrements quelque soit le
contenu du champ sur lequel le critère est mis.

Merci pour ta réponse

Effectivement, ma formule est du type

VraiFaux(EstNull(Formulaires!NomFormulaire![CHOIX]);Comme "*" Ou est Null
;Formulaires!NomFormulaire![CHOIX])

mais je voulais être plus lisible en simplifiant à CHOIX

si comme tu le suggères je remplace ' Comme "*" Ou Est Null ' par le nom du
champ concerné par le critère ([FAC]) , j'ai la liste des enregistrements ou
FAC est pas null, mais pas ceux ou FAC est null !


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
gomi
Je suis encore une fois mal exprimé ou pas assez précisément : on a bien tout
les enregistrements mais pas les Nulls (ceux qui ne sont pas encore crées)

Une table A (avec un champ nom : titi et toto) liée un à plusieurs avec
toute les valeur de A à une table B (avec le champ nom et val).

Si dans B titi existe pour 2 val (100 et 101) mais que toto n'est pas encore
présent dans B, le résultat d'une requête sélection avec comme critère
VraiFaux(EstNull([CHOIX]);[B];[CHOIX])
est 2 lignes pour titi

Si le critère est Comme "*" Ou Est Null => j'ai bien 3 recherché 3
enregistrements

Si le critère est une expression du type
VraiFaux(EstNull([CHOIX]);Comme "*" Ou Est Null;[CHOIX])
=> erreur aucun enregistrement


re,

t'es sur car normalement tu devrais tous les avoir, Null ou pas Null !!!

Je viens de tester et j'ai *TOUS* les enregistrements quelque soit le
contenu du champ sur lequel le critère est mis.

Merci pour ta réponse

Effectivement, ma formule est du type

VraiFaux(EstNull(Formulaires!NomFormulaire![CHOIX]);Comme "*" Ou est Null
;Formulaires!NomFormulaire![CHOIX])

mais je voulais être plus lisible en simplifiant à CHOIX

si comme tu le suggères je remplace ' Comme "*" Ou Est Null ' par le nom du
champ concerné par le critère ([FAC]) , j'ai la liste des enregistrements ou
FAC est pas null, mais pas ceux ou FAC est null !


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr




Avatar
Eric
re,

Ne serait-ce pas plutôt un problème de SQL puisque tu veux tous les noms
de la table A et les valeurs associées à ces noms dans la table B,
certains pouvant ne pas figurer dans la table B. Il faut alors une
jointure externe

Si le SQL de la requête est le suivant :

SELECT A.Nom, B.Valeur
FROM A LEFT JOIN B ON A.Nom = B.Nom
WHERE
A.Nom=IIf(IsNull([Formulaires]![NomForm]![CHOIX]),A.Nom,[Formulaires]![NomForm]![CHOIX]);

tu obtiens ce que tu désires.

Avec ton exemple, j'ai en résultat quand [Choix] n'est pas renseigné:
Nom Valeur
toto
titi 101
titi 100

ça avec titi dans CHOIX:
Nom Valeur
titi 101
titi 100

et pour toto
Nom Valeur
toto



Je suis encore une fois mal exprimé ou pas assez précisément : on a bien tout
les enregistrements mais pas les Nulls (ceux qui ne sont pas encore crées)

Une table A (avec un champ nom : titi et toto) liée un à plusieurs avec
toute les valeur de A à une table B (avec le champ nom et val).

Si dans B titi existe pour 2 val (100 et 101) mais que toto n'est pas encore
présent dans B, le résultat d'une requête sélection avec comme critère
VraiFaux(EstNull([CHOIX]);[B];[CHOIX])
est 2 lignes pour titi

Si le critère est Comme "*" Ou Est Null => j'ai bien 3 recherché 3
enregistrements

Si le critère est une expression du type
VraiFaux(EstNull([CHOIX]);Comme "*" Ou Est Null;[CHOIX])
=> erreur aucun enregistrement



re,

t'es sur car normalement tu devrais tous les avoir, Null ou pas Null !!!

Je viens de tester et j'ai *TOUS* les enregistrements quelque soit le
contenu du champ sur lequel le critère est mis.


Merci pour ta réponse

Effectivement, ma formule est du type

VraiFaux(EstNull(Formulaires!NomFormulaire![CHOIX]);Comme "*" Ou est Null
;Formulaires!NomFormulaire![CHOIX])

mais je voulais être plus lisible en simplifiant à CHOIX

si comme tu le suggères je remplace ' Comme "*" Ou Est Null ' par le nom du
champ concerné par le critère ([FAC]) , j'ai la liste des enregistrements ou
FAC est pas null, mais pas ceux ou FAC est null !


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr




--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr



Avatar
gomi
Tout d'abords merci de ta patience ! Je sens que l'on progresse.

Toujours avec la table A (2 enreg)
NOM
titi
toto

la table B (2 enreg)
NOM / VAL
titi / 100
titi / 101

Oublions le formulaire en simplifiant à CHOIX
La requête que tu proposes :

SELECT A.nom, B.val
FROM A LEFT JOIN B ON A.nom = B.nom
WHERE (((A.nom)=IIf(IsNull([CHOIX]),[a].[nom],[CHOIX])));

répond à la problématique des Nulls, mais celle que je cherche à fabriquer
(le filtre est sur VAL et non sur NOM) pose toujours pb. Qu'est ce que je
doit mettre dans [ce que je cherche] pour que le résultat soit 3 enreg ?

SELECT A.nom, B.val
FROM A LEFT JOIN B ON A.nom = B.nom
WHERE (((B.val)=IIf(IsNull([CHOIX]),[ce que je cherche],[CHOIX])));

Encore une fois MERCI



re,

Ne serait-ce pas plutôt un problème de SQL puisque tu veux tous les noms
de la table A et les valeurs associées à ces noms dans la table B,
certains pouvant ne pas figurer dans la table B. Il faut alors une
jointure externe

Si le SQL de la requête est le suivant :

SELECT A.Nom, B.Valeur
FROM A LEFT JOIN B ON A.Nom = B.Nom
WHERE
A.Nom=IIf(IsNull([Formulaires]![NomForm]![CHOIX]),A.Nom,[Formulaires]![NomForm]![CHOIX]);

tu obtiens ce que tu désires.

Avec ton exemple, j'ai en résultat quand [Choix] n'est pas renseigné:
Nom Valeur
toto
titi 101
titi 100

ça avec titi dans CHOIX:
Nom Valeur
titi 101
titi 100

et pour toto
Nom Valeur
toto



Je suis encore une fois mal exprimé ou pas assez précisément : on a bien tout
les enregistrements mais pas les Nulls (ceux qui ne sont pas encore crées)

Une table A (avec un champ nom : titi et toto) liée un à plusieurs avec
toute les valeur de A à une table B (avec le champ nom et val).

Si dans B titi existe pour 2 val (100 et 101) mais que toto n'est pas encore
présent dans B, le résultat d'une requête sélection avec comme critère
VraiFaux(EstNull([CHOIX]);[B];[CHOIX])
est 2 lignes pour titi

Si le critère est Comme "*" Ou Est Null => j'ai bien 3 recherché 3
enregistrements

Si le critère est une expression du type
VraiFaux(EstNull([CHOIX]);Comme "*" Ou Est Null;[CHOIX])
=> erreur aucun enregistrement



re,

t'es sur car normalement tu devrais tous les avoir, Null ou pas Null !!!

Je viens de tester et j'ai *TOUS* les enregistrements quelque soit le
contenu du champ sur lequel le critère est mis.


Merci pour ta réponse

Effectivement, ma formule est du type

VraiFaux(EstNull(Formulaires!NomFormulaire![CHOIX]);Comme "*" Ou est Null
;Formulaires!NomFormulaire![CHOIX])

mais je voulais être plus lisible en simplifiant à CHOIX

si comme tu le suggères je remplace ' Comme "*" Ou Est Null ' par le nom du
champ concerné par le critère ([FAC]) , j'ai la liste des enregistrements ou
FAC est pas null, mais pas ceux ou FAC est null !


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr




--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr






Avatar
Eric
re,

Je ne vois pas comment en mettant le critere sur le champ VAL de la
table B tu pourrais obtenir tous les enregistrements de la table B et
ceux de la table A non présents dans la table B. Et ce quelle que soit
le type de jointure.
En utilisant une requête Union, tu aurais ce que tu veux dans le *seul*
cas où le critère est Null

J'ai du mal à cerner ton problème.
Pourrais-tu donner un exemple 'frappant' de ce que tu cherches à obtenir ?

Tout d'abords merci de ta patience ! Je sens que l'on progresse.

Toujours avec la table A (2 enreg)
NOM
titi
toto

la table B (2 enreg)
NOM / VAL
titi / 100
titi / 101

Oublions le formulaire en simplifiant à CHOIX
La requête que tu proposes :

SELECT A.nom, B.val
FROM A LEFT JOIN B ON A.nom = B.nom
WHERE (((A.nom)=IIf(IsNull([CHOIX]),[a].[nom],[CHOIX])));

répond à la problématique des Nulls, mais celle que je cherche à fabriquer
(le filtre est sur VAL et non sur NOM) pose toujours pb. Qu'est ce que je
doit mettre dans [ce que je cherche] pour que le résultat soit 3 enreg ?

SELECT A.nom, B.val
FROM A LEFT JOIN B ON A.nom = B.nom
WHERE (((B.val)=IIf(IsNull([CHOIX]),[ce que je cherche],[CHOIX])));




--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
gomi
Pas grave, puisque dans une même requete je ne sais pas gérer les 2 (comme
"*" ou null) je me suis résolu à gérer les modifs de VAL (comme * ) dans un
formulaire différent des ajouts (est null).

Merci quand même !



re,

Je ne vois pas comment en mettant le critere sur le champ VAL de la
table B tu pourrais obtenir tous les enregistrements de la table B et
ceux de la table A non présents dans la table B. Et ce quelle que soit
le type de jointure.
En utilisant une requête Union, tu aurais ce que tu veux dans le *seul*
cas où le critère est Null

J'ai du mal à cerner ton problème.
Pourrais-tu donner un exemple 'frappant' de ce que tu cherches à obtenir ?

Tout d'abords merci de ta patience ! Je sens que l'on progresse.

Toujours avec la table A (2 enreg)
NOM
titi
toto

la table B (2 enreg)
NOM / VAL
titi / 100
titi / 101

Oublions le formulaire en simplifiant à CHOIX
La requête que tu proposes :

SELECT A.nom, B.val
FROM A LEFT JOIN B ON A.nom = B.nom
WHERE (((A.nom)=IIf(IsNull([CHOIX]),[a].[nom],[CHOIX])));

répond à la problématique des Nulls, mais celle que je cherche à fabriquer
(le filtre est sur VAL et non sur NOM) pose toujours pb. Qu'est ce que je
doit mettre dans [ce que je cherche] pour que le résultat soit 3 enreg ?

SELECT A.nom, B.val
FROM A LEFT JOIN B ON A.nom = B.nom
WHERE (((B.val)=IIf(IsNull([CHOIX]),[ce que je cherche],[CHOIX])));




--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr