[Déplacé VB6 --> VBA] code vba pour trouver touts les mots dans access à partir

otakurom Messages postés 120 Date d'inscription jeudi 2 août 2007 Statut Membre Dernière intervention 11 juin 2010 - 29 déc. 2009 à 22:30
otakurom Messages postés 120 Date d'inscription jeudi 2 août 2007 Statut Membre Dernière intervention 11 juin 2010 - 30 déc. 2009 à 20:24
Bonjour
Je veux faire une fonction Recherche dans un userform. Je n'arrive qu'à trouver les mots exacts.
Set re bds.OpenRecordset("SELECT `Dénomination` FROM `Produits` WHERE `Dénomination` '" & UCase(Textbox1) & "' ;")


Il faut mettre des étoiles "*" mais je ne sais pas où...
Si vous pouviez m'aider^^ Merci

23 réponses

cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
30 déc. 2009 à 01:03
Salut
Le langage SQL utilise des % et non des * et, dans ce cas, il faut utiliser Like et non =.
"... WHERE `Dénomination` Like '%
" & UCase(Textbox1) & "%
'")

+ Pas de ` dans l'encadrement des noms de champ. D'où sors-tu cette idée ?
Si le nom du champ (ou table) possède des caractères spéciaux (accents, espaces, ...), il faut encadrer ces noms avec des crochets [ et ]
"... WHERE [Dénomination] Like '%" & UCase(Textbox1) & "%'")

Attention à l'utilisation de UCase qui peut masquer certains résultats.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
otakurom Messages postés 120 Date d'inscription jeudi 2 août 2007 Statut Membre Dernière intervention 11 juin 2010
30 déc. 2009 à 02:23
Je ne comprends pas, ça ne marche toujours pas.
En tout cas merci pour toutes ces précisions car je débute et suis un peu perdu^^"
Petite question: quels résultats peuvent être masqués par UCase?
Ça m'embêterait de me faire avoir.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
30 déc. 2009 à 08:56
quels résultats peuvent être masqués par UCase?


si tu as dans ta base :

DRAGON
Dragée
Rat

et que tu cherche %RA%
tu ne recevra que le premier tuple (DRAGON)

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
30 déc. 2009 à 10:18
"ça ne marche pas" n'est pas une explication valable.
Comment sais-tu que ça ne marche pas ?
As-tu une erreur ou bien le RecordSet ne compte aucun résultat ?
Que vaut ta TextBox1 au moment du test ?
As-tu vérifier qu'il existe bien au moins une donnée correspondante ? exemple

Copie/colle ton code afin de vérifier que tu as bien corrigé ton code
Copie/colle aussi la définition (Dim) de tes object comme 're'

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
otakurom Messages postés 120 Date d'inscription jeudi 2 août 2007 Statut Membre Dernière intervention 11 juin 2010
30 déc. 2009 à 12:21
Donc voici ma ligne avec les %:

Set re = bds.OpenRecordset("SELECT [Dénomination] FROM [Produits] WHERE [Dénomination] LIKE '%" & Textbox1 & "%';")

J'ai un message d'erreur: "Aucun enregistrement trouvé"

Dans ma base, j'ai les produits lou et loulou.
Si j'enlève les %, le code marche et je trouve les noms exacts.
Si je tape lou dans la textbox1, j'obtiens lou dans ma listbox or je voudrais obtenir lou et loulou.

Pour les déclarations:
Dim re As Recordset, re2 As Recordset

Merci!
0
otakurom Messages postés 120 Date d'inscription jeudi 2 août 2007 Statut Membre Dernière intervention 11 juin 2010
30 déc. 2009 à 12:25
J'ai oublié: quelle fonction mettre pour obtenir DRAGON,Dragée et Rat?
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
30 déc. 2009 à 12:39
Bonjour

Je crois que tu viens de trouver loulou c'est moi! malheureusement cela ne t'apporte pas la solution

Ta requete me semble bien avec les %

Le code 'loulou' n'est t'il pas dans un deuxième champ de la table 'Produits' autre que le champ 'désignation' (ex: code_produit)

Si tu produisais la structure de la table et de ses enregistrements, cela enlèverai une ambiguité
La base de données c'est Access, SQL Server, My SQL , ...?
0
otakurom Messages postés 120 Date d'inscription jeudi 2 août 2007 Statut Membre Dernière intervention 11 juin 2010
30 déc. 2009 à 12:51
^^ Ba je trouve lou et loulou sans les % donc ils sont bien présents dans champ Dénomination tous les 2. La base de données est sur Access.
Je n'ai pas compris ce que tu entends par produire le structure de la table et de ses enregistrements.



Voila.
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
30 déc. 2009 à 13:01
sachant aussi que c'est une base access

select [Dénomination] FROM [Produits] WHERE UCase([Dénomination]) LIKE '" & Ucase(Textbox1.Text) & "';")

avec ou sans les % je ne connais pas la réaction d'access je travaille sur SQL Server

la fonction de mise en majucule est UPPER alors que cà a l'air d'etre UCase pour access
Alors la condition Where que je verrai est

Ucase(Champ)= UCase(champ de formulaire saisi) comme ci-dessus
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
30 déc. 2009 à 13:15
Ca devrait fonctionner.

"J'ai un message d'erreur: "Aucun enregistrement trouvé" " Sur quelle ligne ? Quel code d'erreur (n°) ?
Si c'est un MsgBox perso, comment fais-tu pour l'afficher, quel test ?

Quel est ta définition de 're', quel 'Dim' as-tu fais ?

Pour être sûr que ta syntaxe est bonne, tu vas nous montrer la requète telle qu'elle sera présentée à l'instruction lorsque tu mets 'lou' dans ta TextBox :
Dim sTemp As String
sTemp = "SELECT [Dénomination] FROM [Produits] WHERE [Dénomination] LIKE '%" & Textbox1 & "%'"
Debug.Print sTemp  ' Colle nous le texte généré dans la fenêtre de debug)
Set re = bds.OpenRecordset(sTemp)
0
otakurom Messages postés 120 Date d'inscription jeudi 2 août 2007 Statut Membre Dernière intervention 11 juin 2010
30 déc. 2009 à 13:46
Erreur 3021: aucun enregistrement trouvé
Il m'indique que l'erreur est à la ligne "re.MoveFirst"
Même chose avec sTemp.
Dim re As Recordset


Set bds = OpenDatabase("F:\Users\Romain\Desktop\Management\Base de données.mdb")
Set re = bds.OpenRecordset("SELECT [Dénomination] FROM [Produits] WHERE [Dénomination] LIKE '%" & Textbox1 & "%';")

re.MoveFirst
n = 0

Do While Not re.EOF
    ListProd.AddItem re.Fields("Dénomination").Value
    re.MoveNext
    n = n + 1
Loop
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
30 déc. 2009 à 14:17
effectivement la requete ne passe pas

vérifier que les objets sont bien déclarés
Dim dbs as DAO.Database
dim re as DAO.Recordset

avant de faire un movefirst tester si l'objet Recordset est bien initialisé
if not re is nothing then
'movefirst and movenext
end if

mettre un traitement d'exception dès le début
ON Error goto etiquette
....traitement
etiquette:
MsgBox err.Description
0
otakurom Messages postés 120 Date d'inscription jeudi 2 août 2007 Statut Membre Dernière intervention 11 juin 2010
30 déc. 2009 à 14:35
Avec etiquette j'ai le message "Aucun enregistrement en cours"

J'ai aussi essayer:
If Not re Is Nothing Then
    re.MoveFirst
    n = 0
Else
    Message = MsgBox("Il n'y a aucun résultat.", vbExclamation + vbOKOnly, "Résultats")
    re.Close
    Exit Sub
End If


Du coup j'ai le message "Il n'y a aucun résultat."

C'est quand même incroyable ça devrait marcher.
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
30 déc. 2009 à 14:46
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
30 déc. 2009 à 14:53
tu as bien mis les déclarations DAO et pas ADO

si Activex Data Object est une librairie chargé peux tu l'enlever de ton projet et réexécuter


Si tu executes

Set bds = OpenDatabase("F:\Users\Romain\Desktop\Management\Base de données.mdb")
Set re = bds.OpenRecordset("Produits", dbOpenTable)

Observes si tu éxécutes le MoveFirst normalement?

il y a d'autres paramètres à OpenDatabase et OpenRecordset : regardes le tutorial
0
otakurom Messages postés 120 Date d'inscription jeudi 2 août 2007 Statut Membre Dernière intervention 11 juin 2010
30 déc. 2009 à 15:25
Alors, en mettant Set re = bds.OpenRecordset("Produits", dbOpenTable)
Ma Listbox m'affiche tous mes produits.
Le MoveFirst fonctionne donc.
Il ne reconnait plus bds si je désactive Microsoft Activex Data Object
Merci pour ton aide
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
30 déc. 2009 à 15:57
Remettons les choses dans l'ordre et, par pitié, répond aux questions qu'on te pose (à porpos des Dim); on va pas y passer le réveillon ! (bien placé, non ?)

La base de données est sous Access. Ok.
Mais confirme-nous que tu travailles dans le VBA de Access, parce que tu n'en as rien dit.
Cela peut changer les méthodes.

Le test avec sTemp n'était pas pour faire fonctionner la requète, mais pour que tu nous montres la tête de la requète telle qu'elle est soumise au moteur.

Avant de faire un .MoveFirst ou tout autre ordre, il faut tester .RecordCount, d'où l'erreur.

Comme tu ne nous dis toujours pas comment sont dimensionnées tes variablesdbs comme re, on va supposer que tu utilises DAO.
DAO est obsolète, dépassé, périmé.
Il faut utiliser ADO, par exemple ADODB.
C'est le moteur qui te permettra d'interfacer avec tes données. Autant utiliser un moteur performant et compatible avec les systèmes Windows modernes !
Si besoin, ajouter la référence à "Microsoft ActiveX Data Objects 2.8 Library".

Exemple d'un RecordSet ADODB :
    Dim monRS As ADODB.Recordset
    Set monRS = New ADODB.Recordset
    With monRS
        .CursorLocation = adUseClient
        .Open "Select * From maTable", , adOpenStatic, adLockReadOnly
        If .RecordCount > 0 Then
            .MoveFirst
            Do While Not .EOF
                Debug.Print .Fields(0).Name, .Fields(0).Value
                .MoveNext
            Loop
        End If
        .Close
    End With

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
otakurom Messages postés 120 Date d'inscription jeudi 2 août 2007 Statut Membre Dernière intervention 11 juin 2010
30 déc. 2009 à 16:47
Alors je travail dans le VBA de Excel. (Je dois remplir des tableaux)

Je vous copie mes déclarations:
Dim bds As DAO.Database
Dim re As DAO.Recordset, re2 As DAO.Recordset
Dim champ As Field


Du coup comment je dois déclarer bds en ADO. Parce que j'ai mis "Dim bds As ADODB.Database"
Et il me met le message erreur : "Type défini par l'utilisateur non défini"

Mon code entier:

Private Sub Rechercher_Click()

  Dim bds As ADODB.Database

  Dim monRS As ADODB.Recordset
  
  Set bds = OpenDatabase("F:\Users\Romain\Desktop\Management\Base de données.mdb")

    Set monRS = New ADODB.Recordset
    With monRS
        .CursorLocation = adUseClient
        .Open "Select * From Produits", , adOpenStatic, adLockReadOnly
        If .RecordCount > 0 Then
            .MoveFirst
            Do While Not .EOF
                Debug.Print .Fields(0).Name, .Fields(0).Value
                .MoveNext
            Loop
        End If
        .Close
    End With


End Sub


"Le test avec sTemp n'était pas pour faire fonctionner la requète, mais pour que tu nous montres la tête de la requète telle qu'elle est soumise au moteur."
Là, je ne comprends pas ce que je dois montrer...un code vba?
Je débute je suis donc un peu lent^^"

Je vous remercie pour votre patience
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
30 déc. 2009 à 17:42
Non, tu n'as qu'une connexion à faire à ta base Access.

Dim maConnexion As ADODB.Connection
Set maConnexion =  New ADODB.Connection
maConnexion.ConnectionString = _
   "Provider=Microsoft.Jet.OLEDB.4.0;" & _
   "Persist Security Info=False;" & _
   "Data Source=" & "C:\mon répertoire\monFichier.MDB"
maConnexion.Open ' Ouvre la connexion.


Ensuite, les fonctions comme monRS.Open auront besoin de connaitre le nom de l'objet de connexion, exemple :
monRS.Open "Select * From maTable", maConnexion , adOpenStatic, adLockReadOnly

Vala
Jack, =fr MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
30 déc. 2009 à 17:46
Pour sTemp :
Je t'ai fait rajouter une ligne Debug.Print sTemp
Cela recopie le contenu de la variable dans la fenêtre de debug (Ctrl-G)
Je voulais simplement que tu recopie ce texte ici : Ce sera ta requète, incluant le texte de la TextBox, histoire de vérifier qu'il n'y a pas de problème de ce côté là.
Mais Loulou69 (que je salue au passage) à donné l'info principale : Cela ne semble pas fonctionner chez lui non plus. Le problème vient donc du moteur de connexion.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0