3 Caractères et plus pour la recherche [Résolu]

Signaler
Messages postés
863
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
21 août 2015
-
Sinsitrus
Messages postés
863
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
21 août 2015
-
Salut !

J'ai ce bout de code que je voudrais éditer. Il me donne = à 3 et me fait rien à 4 caractères ou plus. Je voudrais que si dans la zone de texte T_Rech j'entre plus de 3 caractères alors il exécute tout de même la commande.

Dim SQL As String
Dim I As Integer

If T_Rech <> "" Then
SQL "select * from Articles where left(Code, 3) '" & T_Rech & "' order by Code"
Set RS = BAZ.OpenRecordset(SQL)

If Not (RS.BOF And RS.EOF) Then
RS.MoveLast
RS.MoveFirst
Tablo.Rows = RS.RecordCount + 1
I = 1
Do While Not RS.EOF

If IsNull(RS!Famille) Then
Tablo.TextMatrix(I, 0) = ""
Else
Tablo.TextMatrix(I, 0) = RS!Famille
End If

If IsNull(RS!Code) Then
Tablo.TextMatrix(I, 1) = ""
Else
Tablo.TextMatrix(I, 1) = RS!Code
End If

I = I + 1
RS.MoveNext
Loop
Else
Tablo.Rows = 1
End If
End If

SQL "select * from Articles where left(Code, 3) '" & T_Rech & "' order by Code"
Éditer de sorte à avoir > à 3 donc la recherche comprise entre 3 et +

Merci d'avance pour votre aide.
----------
OS : Windows XP SP3 et Vista 32
Platforme : VB 6.0 + SP6
Ok VB6.0 c'est pas net !

21 réponses

Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
*BAZ n'a pas de NEW
*on ne sait pas si OPENDATABASE vient d'ailleurs...
*tout çà en DAO?
*RS public n'a pas de NEW
*RS du LOAD non plus, et comme il est privé il ne sert à rien
*RS du _Change est toujours NULL puisque c'est le privé (sans NEW) qui a reçu le open

et une procédure Main sert au démarrage du projet. c'est un mot clé. si tu l'appelles depuis la form, soit le code doit être dans la form, soit il faut changer le nom de cette procédure

récap : utilise ADO (et non DAO) avec une class propre, ou même un module, en instanciant correctement tes objets

un exemple de classe LITE ici :
http://www.codyx.org/snippet_connexion-base-donnees-access_107.aspx#1907

++
Messages postés
60
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
6 septembre 2012
2
Salut,

regarde du côté de la fonction LEN() qui te retourne le nombre de caractères d'une chaine
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
217
Pas sûr d'avoir compris tes "explications" !
A tout hasard : int&éresse-toi donc à l'opérateur Like :
Like "ta_chaine*"
concerne tout ce qui commence par le contenu de la variable ta_chaine , quelle que soient la suite (*)

____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
salut,

attention
vb6 => like *
sql => like %

if len(T_Rech.text)>=3 then
  SQL = "select * from Articles Code LIKE '" & T_Rech.text & "%' order by Code" 
'...


NB : attention s'il y a déjà une apostrophe dans la chaîne à chercher. utilise replace
++
[hr]
Messages postés
863
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
21 août 2015

Merci à tous.

PCPT, il me fait une erreur sur ce bloc de lignes :
If IsNull(RS!Famille) Then
Tablo.TextMatrix(I, 0) = ""
Else
Tablo.TextMatrix(I, 0) = RS!Famille
End If

Variable objet ou variable bloc with non définie.
Si j'ajoute le WHERE, il m'envoie cette erreur-ci :
Erreur de syntaxe dans la clause FROM

Mon code se résume donc à ceci :

Dim SQL As String
Dim I As Integer

If Len(T_Rech.Text) >= 3 Then
SQL = "select * from Articles WHERE Code LIKE '" & T_Rech.Text & "%' order by Code"

If IsNull(RS!Famille) Then
Tablo.TextMatrix(I, 0) = ""
Else
Tablo.TextMatrix(I, 0) = RS!Famille
End If

If IsNull(RS!Code) Then
Tablo.TextMatrix(I, 1) = ""
Else
Tablo.TextMatrix(I, 1) = RS!Code
End If

End If

Tableau utilisé MSFlexFrid
Connexion au RS
[i]Public RS As Recordset

Sub Pied()
CHM1 = App.Path & "\BaseDonnee.mdb"
Set BAZ = OpenDatabase(CHM1)
End Sub/i


Merci

----------
OS : Windows XP SP3 et Vista 32
Platforme : VB 6.0 + SP6
Ok VB6.0 c'est pas net !
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
normal, tu n'exécutes pas ta requête sql...
Messages postés
863
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
21 août 2015

Le code d'ereur à sauté, il n'apparait plus. Seulement, il n'affiche plus rien dans le tableau dès que je tape les 3 premiers caractères.
As tu besoin du code qui exécute ma requête ?

Merci encore pour ton temps.

----------
OS : Windows XP SP3 et Vista 32
Platforme : VB 6.0 + SP6
Ok VB6.0 c'est pas net !
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
... donne tout le code nécessaire oui, et vérifie qu'il soit complet dans ce cas

dans ton précédent post, la variable SQL reçoit la bonne requête, mais aucun EXECUTE, donc normal que ton RS soit null, ce qui concordait avec le message d'erreur indiqué
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
63
Salut
Pas Execute pour un Select, mais RS.Open
+ la gestion de la boucle standard de relecture des enregistrements dans ton RS que tu trouveras dans n'importe quelle source qui parle de SQL.

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)
Messages postés
863
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
21 août 2015

Salut !

Merci encore pour votre aide.

Objets utilisé :
Zone de texte = T_Rech (TextBox)
Tableau d'affichage = Tablo (MSFlexGrid)

Private Sub T_Rech_Change()
Dim SQL As String
Dim I As Integer

If Len(T_Rech.Text) >= 3 Then
SQL = "select * from Articles where Code like '%" & T_Rech.Text & "%' order by Code"

Set RS = BAZ.OpenRecordset(SQL)

If Not (RS.BOF And RS.EOF) Then
RS.MoveLast
RS.MoveFirst
Tablo.Rows = RS.RecordCount + 1
I = 1
Do While Not RS.EOF

If IsNull(RS!Code) Then
Tablo.TextMatrix(I, 0) = ""
Else
Tablo.TextMatrix(I, 0) = RS!Code
End If

If IsNull(RS!Designation) Then
Tablo.TextMatrix(I, 1) = ""
Else
Tablo.TextMatrix(I, 1) = RS!Designation
End If

I = I + 1
RS.MoveNext
Loop
Else
Tablo.Rows = 1
End If
End If
End Sub
-----------------------------------------------------------------------
Sub Main()
CHM1 = App.Path & "\BaseDonnee.mdb"
Set BAZ = OpenDatabase(CHM1)
End Sub
-----------------------------------------------------------------------
Private Sub Form_Load()
Dim RS As Recordset
Main
Set RS = BAZ.OpenRecordset("select * from Articles")
End Sub

Merci

----------
OS : Windows XP SP3 et Vista 32
Platforme : VB 6.0 + SP6
Ok VB6.0 c'est pas net !
Messages postés
863
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
21 août 2015

Et dans un module :

Public RS As Recordset
Public BAZ As Database
Public SQL As String
Public CHM1 As String

Sub Main()
CHM1 = App.Path & "\BaseDonnee.mdb"
Set BAZ = OpenDatabase(CHM1)
End Sub
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
Option Explicit
Private BAZ As clsADO

Private Sub Form_Load()
    Set BAZ = New clsADO
    BAZ.DBConnect App.Path & "\BaseDonnee.mdb"
    
    BAZ.RSExecute "SELECT * FROM Articles;" 'ah bon? tu ne l'utilises pas?.... 
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Set BAZ = Nothing
End Sub

Private Sub T_Rech_Change()
    Dim i As Integer
    
    If Len(T_Rech.Text) >= 3 Then
        If BAZ.RSExecute("SELECT * FROM Articles WHERE Code LIKE '%" & T_Rech.Text & "%' ORDER BY Code;") Then
            BAZ.RS.MoveFirst
            Tablo.Rows = BAZ.RS.RecordCount + 1
            
            i = 1
            Do While Not .EOF
                If IsNull(.Fields("Code")) Then
                    Tablo.TextMatrix(i, 0) = ""
                Else
                    Tablo.TextMatrix(i, 0) = BAZ.RS!Code
                End If
                
                If IsNull(.Fields("Designation")) Then
                    Tablo.TextMatrix(i, 1) = ""
                Else
                    Tablo.TextMatrix(i, 1) = BAZ.RS!Designation
                End If
                
                i = i + 1
                BAZ.RS.MoveNext
            Loop
        Else
            Tablo.Rows = 1
        End If
    Else
        Tablo.Rows = 1
    End If
End Sub
Messages postés
863
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
21 août 2015

Erreur Private BAZ As clsADO
Erreur de compilation:
Type défini par l'utilisateur non défini.

Voici l'erreur que j'ai en recopiant ton code. Dois-je à ton avis activer une Préférence ? J'ai supprimé tout l'ancien code que j'avais pour tester le nouveau.

Préférence actives
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
clsADO est une nouvelle classe à ajouter, qui comportera le code du lien indiqué au dessus

et alors oui il faudra évidemment cocher les références, elles aussi indiquées dans le lien
Messages postés
863
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
21 août 2015

J'ai activé les classes dans la référence :
- Microsoft ActiveX Data Objects 2.5 Library
- Microsoft ADO Ext. 2.7 for DLL and Security

Mais pareil. Je ne penses pas avoir bien compris ton explication, ce sont les seules classe mentionnées en commentaire à copier dans un module (comme indiqué dans le lien).
Tu penses que je dois copier le lien dans un module ?
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
çà dépend
tu veux continuer d'avoir un message d'erreur?

c'est écrit :

COPIEZ LE CODE CI-DESSOUS DANS UN MODULE DE CLASS, VOUS AVEZ ACCES AUX OBJETS DB ET RS

j'suis pas certain mais çà doit vouloir dire, non pas de COPIER LE LIEN DANS UN MODULE, mais de COPIER LE CODE DANS UNE CLASSE

enfin.... j'crois

classe que tu nommeras clsADO, pour le code que je t'ai indiqué au dessus

code que tu n'exécuteras qu'après avoir coché les références indiquées :
[b]
' msado25.tlb (Microsoft ActiveX Data Objects 2.5 Library)
' msadox.dll (Microsoft ADO Ext. 2.7 for DLL and Security)/b
Messages postés
863
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
21 août 2015

Looool, oui c'est ce que je voulais dire, pas le lien mais le code :p
Je l'ai fais, mais j'ai pas nommé en clsADO
Attends j'essaie...
Effectivement, il y a une erreur (la même) sur :
Public RS As New Recordset

Voici mon tableau de référence

Les deux classes sont mentionnées.
Puis le code que tu m'as donné est dans une Form et dans le module de classe nommé clsADO les codes du lien.

Sauf erreur de ma part, il y a un cafard :s :$
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
nan mais si tu décoches pas tes références DAO alors que les références ADO ont le même nom on va jamais s'en sortir

nouveau test donc tu fais un nouveau projet!!

et "Les deux classes sont mentionnées" NON c'est des références, des DLL, pas des classes...

(comment veux-tu qu'on s'y retrouve si on prend un mot pour un autre )
Messages postés
863
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
21 août 2015

Nouveau projet :

Form : T_Rech + MSFlexGrid + Bouton (lien)
Module de classe : clsADO (lien)
Référence : - Microsoft ActiveX Data Objects 2.5 Library
- Microsoft ADO Ext. 2.8 for DLL and Security (lien)
Formulaire exécuté : (lien)

Exécution projet : No problem
Erreur rencontré lors de la recherche : Erreur de compilation :
Référence incorrecte ou non qualifiée
sur la ligne Do While Not .EOF

Voilà où j'en suis. J'ai mis le .8 en rouge car dans la classe c'est plutot le .7
Je ne penses pas que ça a à voir grand chose mais quand même.
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
bin ouai... y'a pas de WITH

à précéder de BAZ.RS donc
(c'est dur hein??)

eh faut se sortir les doigts un peu hein !!!

pour ma part j'arrête là, faut pas abuser
bye
1 2