IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

VB6 - Syntaxe dans les clauses de filtrage des recordsets ADO


Sujet :

VB 6 et antérieur

  1. #1
    Membre habitué Avatar de MGD_Software
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 137
    Points : 139
    Points
    139
    Par défaut VB6 - Syntaxe dans les clauses de filtrage des recordsets ADO
    Bonjour.

    J'ai un souci avec la syntaxe dans les clauses de filtrage des recordsets ADO. Le problème se pose aussi bien avec la clause WHERE dans les requetes, que les méthodes Filter et Find des objets Recordset.

    Le phénomène est le suivant : Lorsque la chaine recherchée dans un champ contient des apostrophes, des points ou des slashes, la recherche échoue et ne ramène rien.

    Pour les apostrophes, j'encadre le texte avec des guillemets et cela marche. L'inverse est vrai aussi. Mais outre le fait qu'on ne peut pas savoir à l'avance le contenu du champ (sans faire une usine à gaz qui va chercher les caractères dans les chaines à rechercher), je n'arrive pas à résoudre le problème des chaines de recherche qui contiennent des guillemets ET des apostrophes.

    D'autre part, pour les points et les slashes, j'ai fait un test direct sous access en faisant un filtre par formulaire. Losque je rentre par exemple
    dans le champ de recherche, il me le transforme après validation en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [machin].[truc].[bidule]
    ce qui fait penser qu'il croit que les termes entre points sont des tables et des champs.

    Je suis arrivé à résoudre le problème dans Access en encadrant le total avec des guillemets. (Mais là encore, comment fait-on avec la recherche de "mac'in/tr"uc.bidule" ??). De plus, sous VB, j'ai beau ajouter des guillemets en tête et en queue de chaîne, le résultat est toujours nul.

    Pour être plus clair, voici un exemple concret. Soit une table contenant deux champs, l'un URL, l'autre File. Les deux champs sont destinés à contenir des URL pour la génération automatique de pages HTML. Il n'y a aucun problème pour remplir la table avec des URL du type "HTTP://mgd.software.free.fr" et des noms de fichiers du type "L'atterrissage.gif".

    Par contre, j'essaie de faire une recherche sur ces deux valeurs, qui sont respectivement dans les variables sUrl et sFile (toutes les deux de type String). Mon code est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Rs.Filter = "URL=""" & sUrl & """ AND File=""" & sDummy(i) & """"
    ce qui donne si je tape Print rs.filter la réponse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    URL="http://mgd.software.free.fr" AND File="L'atterrissage.gif"
    Bien que cette combinaison existe plusieurs fois dans la table, le recordset est toujours vide après l'application du filtre.

    Je suppose qu'il doit falloir mettre des caractères d'échappement devant les caractères spéciaux, mais lesquels ? chaque moteur de base de données a ses règles et je ne connais pas celles d'ADO (nota : je n'avais pas ce problème avec DAO !)

    Recherches dans la FAQ avec "recherche Access", "filtrage" et carrément "Access" : résultats vides. Désespérant ! Je ne doit pas savoir y faire...

    Réponses approximatives s'abstenir. Merci.

  2. #2
    Membre éprouvé Avatar de avigeilpro
    Homme Profil pro
    Ambulancier
    Inscrit en
    Janvier 2004
    Messages
    880
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Ambulancier
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2004
    Messages : 880
    Points : 971
    Points
    971
    Par défaut
    Petit exemple pour mettre des guillemet autours des caractères ' et " (je dit pas que c'est ta solution mais ca peut peut-être t'aider ) :
    Disons que tu veut rechercher la chaine suivante :
    Salut c'est moi "TOTO"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim MaChaine As String
     
    'Construction de la chaine a traiter contenant des ' et des "
    MaChaine = "Salut c'est moi " & Chr(34) & "TOTO" & Chr(34)
     
    'Remplace tous les " par """
    MaChaine = Replace(MaChaine, Chr(34), Chr(34) & Chr(34) & Chr(34))
     
    'Remplace tous les ' par "'"
    MaChaine = Replace(MaChaine, "'", Chr(34) & "'" & Chr(34))
    La connaissance seule ne suffit pas. La vraie compréhension vient de la mise en expérience.
    Règles|FAQ|Tuto

  3. #3
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    J'ai fait une petite table vite fait

    Si ca peut te mettre sur la voie, cette requete fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rs.Filter = "URL like 'http://www.dev*'" & " AND File like 'l''*'"
    Lorsqu'il y a des ', c'est un problème connu, il faut les doubler dans la requete
    Utilise un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    replace(champ, "'", "''")
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  4. #4
    Membre habitué Avatar de MGD_Software
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 137
    Points : 139
    Points
    139
    Par défaut
    ThierryAIM a écrit:
    J'ai fait une petite table vite fait

    Si ca peut te mettre sur la voie, cette requete fonctionne :

    Code :
    rs.Filter = "URL like 'http://www.dev*'" & " AND File like 'l''*'"


    Lorsqu'il y a des ', c'est un problème connu, il faut les doubler dans la requete
    Utilise un Code :
    replace(champ, "'", "''")
    Bon, Ok pour les guillemets et apostrophes, je m'en doutais un peu car c'est déjà comme ça dans les chaines VB. Je vais tester mais j'ai toutes les raisons de croire que cela va marcher.

    Par contre, je ne peux pas utiliser LIKE, car les valeurs des champs sont très proches et parfois diffèrent d'une seule lettre. De plus le critère de recherche n'est pas connu du code car il est lui-même tiré d'un fichier HTML et doit être très strict car c'est une recherche de doublon. On ne sait donc pas créer le masque spécifique à chaque fois.

    Reste le problème des points ...

    Merci quand même de faire avancer le schmilblik.
    ---------------------------------------------------------------------
    avigeilpro a écrit :
    Petit exemple pour mettre des guillemet autours des caractères ' et " (je dit pas que c'est ta solution mais ca peut peut-être t'aider ) :
    Disons que tu veut rechercher la chaine suivante :
    Citation:
    Salut c'est moi "TOTO"

    Code :
    Dim MaChaine As String

    'Construction de la chaine a traiter contenant des ' et des "
    MaChaine = "Salut c'est moi " & Chr(34) & "TOTO" & Chr(34)

    'Remplace tous les " par """
    MaChaine = Replace(MaChaine, Chr(34), Chr(34) & Chr(34) & Chr(34))

    'Remplace tous les ' par "'"
    MaChaine = Replace(MaChaine, "'", Chr(34) & "'" & Chr(34))
    Merci. Après quinze ans de pratique assidue de VB, il serait dommage que je ne sache pas ça. D'ailleurs, en lisant bien la question, on se rend compte que les guillemets sont déjà dédoublés dans le code. Le problème n'est pas contruire la chaine de requête. Il est de faire accepter le contenu des critères de recherche par Jet.

    Et pour les points et les slashes ?

  5. #5
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Je ne sais pas, comme çà....


    Avant de dire que ce n'est pas un problème d'expression de la requête, je commencerais par la lancer manuellement, juste pour voir si elle est acceptée... et suffisamment "déterminante".

    ce n'est qu'après que je m'intéresserais à la façon de l'écrire en VB, jusqu'à ce qu'un msgbox de la requête corresponde exactement à la requête qui était la bonne.

    Quant à créer une requête... dépendant des résultats ...de la requête..., je ne crois pas qu'une solution acceptable existe .

  6. #6
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    Je profite de la mi-temps

    ca me plait pas trop, ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    URL="http://mgd.software.free.fr" AND File="L'atterrissage.gif"
    on encadre les critères de filtre par ' et non par ", si ce sont des string
    tu devrais avoir (si j'ai bien compris, URL et File sont les champs de recherche)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    URL='http://mgd.software.free.fr' AND File='L''atterrissage.gif'
    soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Rs.Filter = "URL='" & sUrl & "' AND File='" & replace(sDummy(i), "'", "''")  & "'"
    je reviens à la fin du match
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  7. #7
    Membre habitué Avatar de MGD_Software
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 137
    Points : 139
    Points
    139
    Par défaut
    Pas besoin de msgbox, un point d'arrêt et un PRINT dans la fenêtre debug suffisent. Si tu as bien lu ma première contrib, tu pourras constater que le résultat est correct. Je pensais avoir été clair. Je répète le résultat de la construction de la chaîne, qui constitue la chaîne de filtrage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     URL="http://mgd.software.free.fr" AND File="L'atterrissage.gif"
    Grace à Thierry, le problème de l'apostrophe semble résolu en le dédoublant. Je n'ai plus d'erreur "expression incorrecte". Si j'enlève le premier critère de recherche, j'ai des résultats.

    Quand je ne laisse que le premier critère, je n'ai jamais de résultat, alors que la chaine existe. J'ai essayé avec des guillemets simples ou doubles, c'est pareil.

    Je répète encore : Quand je colle le critère dans une feuille de données Access mise en mode filtrage, Access me transforme cette chaine en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     URL=[http://mgd].[software].[free].[fr]
    et me demande d'entrer la valeur des paramètres http://mgd, software, free et fr. C'est donc bien un problème de syntaxe du critère et non un problème de construction de chaîne.

  8. #8
    Membre habitué Avatar de MGD_Software
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 137
    Points : 139
    Points
    139
    Par défaut
    Citation Envoyé par ThierryAIM
    on encadre les critères de filtre par ' et non par ", si ce sont des string
    tu devrais avoir (si j'ai bien compris, URL et File sont les champs de recherche)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    URL='http://mgd.software.free.fr' AND File='L''atterrissage.gif'
    soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Rs.Filter = "URL='" & sUrl & "' AND File='" & replace(sDummy(i), "'", "''")  & "'"
    je reviens à la fin du match
    Access accepte aussi la syntaxe avec les guillemets, mais c'est plus pur avec des apostrophes, je suis totalement d'accord. J'ai remis ces dernières, car ton tuyau sur le doublement des apostrophes dans la chaine fonctionne. Merci.

    Mais pour les points ??
    je pense que je ne vais pas passer 24 heures là-dessus. Quand on ne peut pas franchir le mur, on en fait le tour. Je vais trouver un caractère de remplacement des points et le placer à la fois dans la base et dans les critères de recherches. Je ne vais quand même pas me laisser emm... par trois lignes de code, non mais des fois !

    Merci à tous.
    Y'a 1-0 pour nous pour le moment

  9. #9
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    comprends pas

    j'ai inhibé la 2e partie du filtre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strg = "http://www.developpez.net"
    rs.Filter = "URL='" & strg & "'"
    et
    print rs.Filter
    URL='http://www.developpez.net'
    et sous vb6, le filtre me renvoie bien les enregistrements

    et ALLEZ LES BLEUS
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  10. #10
    Membre habitué Avatar de MGD_Software
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 137
    Points : 139
    Points
    139
    Par défaut
    Bon, y doit y avoir un truc gros comme une maison que je ne vois pas. Si ton exemple fonctionne, c'est qu'il y a autre chose, qu'il faut que j'analyse à tête reposée (programmer pendant un quart de finale de coupe du monde n'est pas très efficace )

    J'arrête là, le plus gros problème (les apostrophes) étant résolu.
    Zou, Résolu !
    Merci encore.

  11. #11
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    Citation Envoyé par MGD_Software
    (programmer pendant un quart de finale de coupe du monde n'est pas très efficace )
    Je dirais même que c'est de l'inconscience

    et on a gagné

    Blague à part, je voudrais bien comprendre d'ou vient le problème
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  12. #12
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    [QUOTE=MGD_Software]...(programmer pendant un quart de finale de coupe du monde n'est pas très efficace )
    ..[QUOTE]
    ? c'était les quarts hier ?

  13. #13
    Membre habitué Avatar de MGD_Software
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 137
    Points : 139
    Points
    139
    Par défaut
    Oui, bon, je suis meilleur en VB qu'en foot.... (enfin, j'espère !)

    ThierryAIM a écrit :
    Blague à part, je voudrais bien comprendre d'ou vient le problème
    Moi aussi . Si je trouve, je te tiens au courant.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/04/2008, 20h06
  2. Réponses: 5
    Dernier message: 10/07/2007, 12h24
  3. [Access] "Erreur de syntaxe dans la clause FROM"
    Par Marie_2116 dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 05/07/2007, 15h51
  4. Erreur de syntaxe dans la clause from
    Par shub dans le forum Access
    Réponses: 1
    Dernier message: 12/06/2006, 20h24
  5. Réponses: 2
    Dernier message: 03/06/2006, 00h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo