Pb avec SQL LIKE [Résolu]

Signaler
Messages postés
89
Date d'inscription
dimanche 13 janvier 2019
Statut
Membre
Dernière intervention
10 juin 2020
-
Messages postés
89
Date d'inscription
dimanche 13 janvier 2019
Statut
Membre
Dernière intervention
10 juin 2020
-
Bonjour à tous !

J'utilise le petit code suivant :
Private Sub bt_mots_Click()
If zone = "" Then Exit Sub
w = "%" & zone & "%"
'w = "*" & zone & "*"
Set tb = db.OpenRecordset("SELECT * FROM mots WHERE mots LIKE  'w'")
tb.MoveFirst
R = tb("mots")
End Sub



Où zone est une textbox. J'ai toujours l'erreur 3021 Pas d'enreg. courant sur la commande tb.Movefirst. Ce qui indique que la requête n'a pas fonctionné. J'ai lu sur CCM (https://codes-sources.commentcamarche.net/forum/affich-10014027-requete-sql-avec-like-inefficace) le commentaire suivant :
"Il faudrait nous dire si tu utilises bien ADODB pour attaquer ta base Access.
DAO est obsolète et certaines fonctions ne fonctionnent pas (notamment les Find) "

J'utilise DAO 6.0. Je veux bien tester avec ADODB mais je ne sais pas comment faire.
Un petit coup de main serait grandement apprécié !

Merci

Notpa

7 réponses

Messages postés
2160
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
22 juin 2020
109
Bonjour
Le % signifie des caractères quelconques . Or ce % est un opérateur dans la fonction LIKE . Garde-t-il cette fonction si cet opérateur est inclus dans un chaine de caractères comme tu le fais ?
De plus je me souviens qu'une TextBox prend par défaut la propriété Text mais il est plus que recommandé de la spécifier . Si un jour tu passes à VB Net tu me diras merci .
A tout hasard teste ceci
Private Sub bt_mots_Click()

    If zone.Text = "" Then Exit Sub
    Set tb = db.OpenRecordset("SELECT * FROM mots WHERE mots LIKE  '% & zone.Text & %'")
    tb.MoveFirst
    R = tb("mots")

End Sub


Pour ADODB j'ai trouvé un tuto mais les bases de données ne sont pas mon fort ( j'ai jamais eu besoin d'en utiliser dans mes programmes ) : https://drq.developpez.com/vb/tutoriels/ADO/

Messages postés
89
Date d'inscription
dimanche 13 janvier 2019
Statut
Membre
Dernière intervention
10 juin 2020
1
Bonjour vb95 !
J'avais déjà testé ça : pareil. Même chose si je colle le % en dur : LIKE '%textàtrouver%'.
Merci pour le lien. Je teste ADODB dés que je peux.

A+
Notpa
Messages postés
28751
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 juin 2020
332
Bonjour,

En concaténant correctement... cela devrait fonctionner

Dans le premier code :
Set tb = db.OpenRecordset("SELECT * FROM mots WHERE mots LIKE  '" & w & "'")


Et dans le code de VB95
Set tb = db.OpenRecordset("SELECT * FROM mots WHERE mots LIKE  '%" & zone.Text & "%'")

Messages postés
89
Date d'inscription
dimanche 13 janvier 2019
Statut
Membre
Dernière intervention
10 juin 2020
1
Hello !

Désolé, mais dans les 2 cas, aucun enreg. sélectionné.

Merci quand même !

Notpa
Messages postés
2160
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
22 juin 2020
109
Bonjour
Et que donne ceci à tout hasard ?
Private Sub bt_mots_Click()

    If zone.Text = "" Then Exit Sub
    Dim LikeSTring as String = "%" & zone.Text & "%"
    Set tb = db.OpenRecordset("SELECT * FROM mots WHERE mots LIKE 'LikeString'")
    tb.MoveFirst
    R = tb("mots")

End Sub

Messages postés
28751
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 juin 2020
332
Bonjour,
Comme ça tu veux dire
Set tb = db.OpenRecordset("SELECT * FROM mots WHERE mots LIKE '" & LikeString & "'")
Messages postés
28751
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 juin 2020
332 >
Messages postés
28751
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 juin 2020

Et sinon, si au lieu de mettre une variable, tu écrivais directement la requête avec une "vraie" valeur...histoire de vérifier si le souci vient de la syntaxe ou bel et bien du driver ?
Set tb = db.OpenRecordset("SELECT * FROM mots WHERE mots LIKE '%unevraievaleurdetabdd%')
Messages postés
89
Date d'inscription
dimanche 13 janvier 2019
Statut
Membre
Dernière intervention
10 juin 2020
1
Re,

C'est bien le LIKE qui merdouille. La preuve :

Set tb = db.OpenRecordset("SELECT * FROM mots WHERE mots =  'abrasif'")
Set tb = db.OpenRecordset("SELECT * FROM mots WHERE mots LIKE '%abrasif%'")


Le premier SELECT trouve bien l'enreg. contenant abrasif, mais pas le deuxième.
Messages postés
28751
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 juin 2020
332
et juste pour voir si c'est le like qui pose problème, peux tu essayer ces deux la et nous dire ce que ça donne ?
Set tb = db.OpenRecordset("SELECT * FROM mots WHERE mots LIKE 'abrasif'")
Set tb = db.OpenRecordset("SELECT * FROM mots WHERE mots LIKE '*abrasif*'")
Messages postés
89
Date d'inscription
dimanche 13 janvier 2019
Statut
Membre
Dernière intervention
10 juin 2020
1
Les 2 fonctionnent !!!
Et même si je code *abra*, j'ai un résultat.

Le problème venait du pattern % comme indiqué dans pratiquement tous les forums SQL. Mais en VB, avec Access, il faut utiliser l'astérisque et pas le % !

Je passe en Résolu.

Merci à tous pour votre aide.

Au plaisir

Notpa