[SQL/ACCESS]joker pour caractere vide

[s]Salut les geeks.

Je voudrais faire un SELECT dont le critère WHERE change selon la valeur des variables que j’ai. En gros, si elles sont vides, je ne les prend pas en compte, sinon je fais un

(Clients.IDClient) Like ([VarTemp]![CurrentIDClient] &  "*")

(d’ailleurs je ne vois pas pourquoi ça ne fonctionne pas si le champ CurrentIDClient est vide, mais bref)

Donc je construit ma requête sous forme d’une String en VBA. Mais voilà, moi je veux m’en servir dans un formulaire, et apparemment le formulaire n’accepte que les « requêtes » comme source de données, impossible de lui passer par exemple ma fonction.
Peut-on utiliser le String construit pour en faire une requête ? Ou y-a-t-il un autre moyen de me servir de ma requête comme source de données du formulaire ?

J’ai vraiment besoin d’aide, google ne m’a pas du tout aidé sur ce coup :slight_smile: .[/s]

edit : bon en fait le problème a l’ai plus basique, les caractères joker * et % n’ont pas l’air de remplacer null ou vide. Existe-t-il des jokers pour eux ?

(d’ailleurs je ne vois pas pourquoi ça ne fonctionne pas si le champ CurrentIDClient est vide, mais bref)
c’est tout à fait normal.

(Clients.IDClient) Like ([NULL & “*”) ne peut pas fonctionner car NULL est absorbant.

Il faudrait que tu fasses quelques comme, de mémoire, Clients.IDClient Like iif(isnull([VarTemp]![CurrentIDClient]);"";VarTemp]![CurrentIDClient] & "")

et apparemment le formulaire n’accepte que les “requêtes” comme source de données, impossible de lui passer par exemple ma fonction

Ben tu modifies la propriété requête du formulaire, mais le mieux quand tu peux est de définir une requête dans le formulaire dont tu modifies uniquement le paramètre [VarTemp]![CurrentIDClient] en vba avant de lancer ta requête.

[quote=« phili_b, post:2, topic: 48781 »]>(d’ailleurs je ne vois pas pourquoi ça ne fonctionne pas si le champ CurrentIDClient est vide, mais bref)
c’est tout à fait normal.

(Clients.IDClient) Like ([NULL & « * ») ne peut pas fonctionner car NULL est absorbant.

Il faudrait que tu fasses quelques comme, de mémoire, Clients.IDClient Like iif(isnull([VarTemp]![CurrentIDClient]);"";VarTemp]![CurrentIDClient] & "")[/quote]

Justement, mes variables ne sont pas NULL si vides, je les aies changées en «  ».

Les if sont directement acceptés dans le code SQL :crying: ?? Si oui en tout cas ça m’arrangerai beaucoup, je vais essayer

[quote=« phili_b, post:2, topic: 48781 »]>et apparemment le formulaire n’accepte que les « requêtes » comme source de données, impossible de lui passer par exemple ma fonction

Ben tu modifies la propriété requête du formulaire, mais le mieux quand tu peux est de définir une requête dans le formulaire dont tu modifies uniquement le paramètre [VarTemp]![CurrentIDClient] en vba avant de lancer ta requête.[/quote]
Je comprend pas ce que tu veux dire :slight_smile:

edit : du coup grâce à iif ça devrait pouvoir se faire juste avec une requete « simple », mais ça ne veut pas fonctionner :/.
J’ai ça :

SELECT Clients.* FROM Clients WHERE (((Clients.Type) Like (IIf(IsEmpty(VarTemp!CurrentIDClient),"*",VarTemp!CurrentIDClient & "*"))) And ((Clients.Nom ) Like (IIf(IsEmpty(VarTemp!CurrentLastName),"*",VarTemp!CurrentLastName & "*"))) And ((Clients.Prénom) Like (IIf(IsEmpty(VarTemp!CurrentFirstName),"*",VarTemp!CurrentFirstName & "*"))) ));

(j’ai 7 critères en tout)

Mais que je mette n’importe quel critère, le résultat de la requête est le même : aucune ligne. Comme si rien ne correspondait à « " :/. Je vois pas ce qui peut clocher. Le mieux serait de ne pas prendre en compte le critère s’il est vide, c’est pour ça qu’à l’origine j’essayais de construire la requête en VB.
Mais là avec "
 » si le critère est vide, ça ne revient pas au même que d’ignorer le critère ? Quelle différence ?

ralalà :crying:

[quote=« astrojojo, post:3, topic: 48781 »]Justement, mes variables ne sont pas NULL si vides, je les aies changées en «  ».[/quote]ben si: vide revient à null.

[quote=« astrojojo, post:3, topic: 48781 »]Les if sont directement acceptés dans le code SQL :slight_smile: ?? Si oui en tout cas ça m’arrangerai beaucoup, je vais essayer[/quote]En sql standard ce n’est pas accepté (sql standard: coalesce), mais en vba access pas de souci.

tsst tsst:

[quote=« astrojojo, post:3, topic: 48781 »]juste avec une requete « simple », mais ça ne veut pas fonctionner :/.
J’ai ça :

SELECT Clients.* FROM Clients WHERE (((Clients.Type) Like (IIf(IsEmpty(VarTemp!CurrentIDClient),"*",VarTemp!CurrentIDClient & "*"))) And ((Clients.Nom ) Like (IIf(IsEmpty(VarTemp!CurrentLastName),"*",VarTemp!CurrentLastName & "*"))) And ((Clients.Prénom) Like (IIf(IsEmpty(VarTemp!CurrentFirstName),"*",VarTemp!CurrentFirstName & "*"))) ));[/quote]
A moins que je n’ai pas compris ta demande: Tu veux que les 4 critères soient remplies au même moment où tu veux une réponse pas forcément à tout tes critères ? Dans ce cas là il faut mettre des OR entre tes tests d’égalité.

[quote=« astrojojo, post:3, topic: 48781 »]>Ben tu modifies la propriété requête du formulaire, mais le mieux quand tu peux est de définir une requête dans le formulaire dont tu modifies uniquement le paramètre [VarTemp]![CurrentIDClient] en vba avant de lancer ta requête.

Je comprend pas ce que tu veux dire unsure.gif[/quote]
La propriété en question dans la propriété du formulaire que tu peux atteindre en double-cliquant sur le carré noir quand tu ouvres le formulaire. ça correspond à .RecordSource en VBA.

Le plus propre est de rajouter à l’exemple du lien une requête avec un paramètre expliqué et . On appelle cela aussi le databinding. En gros au lieu d’écrire « select * from Clients where Clients.Nom= »& VariableNomClient tu écris « select * from Clients where Clients.Nom=[VariableNomClient ] » où le nom de la variable n’a pas d’importance mais son ordre l’a. Et tu fais la subsitution en VBA sans modifier ta requête par Parameters(0).Value = « toto ».

hein ? Par exemple ans mon code VBA il veut pas que je passe de null en paramètre d’une fonction, mais «  » passe très bien, les deux sont différents :slight_smile: . Une chaine vide ben elle ne contient rien, une chaine (ou une variable null), elle n’est pas initialisée (après en pratique la variable null est peut-être initialisée par le compilateur mais c’est autre chose). Ou alors tu veux dire que dans le WHERE on demande un critère null il nous sortira aussi les lignes ou il vaut «  » et vice-versa ?

Oui j’ai testé c’est bien pratique

Je veux pas forcément tout les critères. En fait je n’en veut pas si le critère est null ou vide. Le problème avec des OR, c’est qu’il va me faire une jointure et toutes les lignes correspondantes à un seul des critères apparaitront dans le résultat. Donc il faut mettre un AND pour que tout les critères soient remplis, mais pour je ne sais quelle raison je n’ai aucune ligne dans mon résultat :crying: .

Plus simplement j’ai des champs de recherche remplis par l’utilisateur, et je veux faire apparaitre les lignes correspondant aux critères correspondants à ces champs (une recherche quoi).

[quote=« phili_b, post:4, topic: 48781 »]La propriété en question dans la propriété du formulaire que tu peux atteindre en double-cliquant sur le carré noir quand tu ouvres le formulaire. ça correspond à .RecordSource en VBA.

Le plus propre est de rajouter à l’exemple du lien une requête avec un paramètre expliqué et . On appelle cela aussi le databinding. En gros au lieu d’écrire « select * from Clients where Clients.Nom= »& VariableNomClient tu écris « select * from Clients where Clients.Nom=[VariableNomClient ] » où le nom de la variable n’a pas d’importance mais son ordre l’a. Et tu fais la subsitution en VBA sans modifier ta requête par Parameters(0).Value = « toto ».[/quote]

Je vais regarder ça merci.

edit : j’utilise acces 2007, je vois pas de carré noir. Mais bon je garde la piste .Recordsource

Je crois que j’ai identifié le problème. Si dans ma table le champ est vide, ça ne le prend pas dans les résultats, comme si * ou % impliquaient la présence d’un caractère (ne remplacent pas null ou “”).
Est-ce qu’il y a un joker pour inclure null et “” ?

Personne ? Je n’ai rien trouvé (* est pour une chaine de n caractères, mais apparemment avec n>0).

Je ne crois pas qu’il existe de joker pour null.
Deux solutions :

  • rajouter une clause “or la_colonne is null”
  • modifier ta clause avec : nz( la_colonne, ‘valeur par défaut’)

et pourquoi tu veux absolument mettre une recherche sur ta colonne alors que tu n’en as pas besoin ?

Merci pallastunturi :). Je regarde avec isnull et Nz, mais bon c’est pas gagné (car forcément ça me sort aussi les lignes où le critère est vide quand je n’en veut pas avec isnull).

coccobill : Je peux en avoir besoin. Si le critère à comparer est vide, je n’en ai pas besoin, mais s’il ne l’est pas (vide) il est nécessaire. C’est pour ça qu’à la base je partais pour créer ma requête sql dans une String selon les critères choisis (afin de pas mettre mon critère dans la condition WHERE si j’en avais pas besoin). Mais si je peux tout faire directement en sql sans passer par du VB ça m’arrange.

Je sais pas si je suis très clair, désolé. Pourtant ça doit être courant ce genre de requête :/.

Edit : bon effectivement ça passe tout de suite mieux avec Nz(), merci beaucoup pallastunturi :crying: !!

(je met pas résolu tout de suite, on ne sais jamais )