3 Caractères et plus pour la recherche

Résolu
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015 - 16 janv. 2010 à 16:38
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015 - 18 janv. 2010 à 09:40
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

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 janv. 2010 à 13:27
*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

++
3
fohaf Messages postés 60 Date d'inscription vendredi 14 novembre 2003 Statut Membre Dernière intervention 6 septembre 2012 2
16 janv. 2010 à 16:47
Salut,

regarde du côté de la fonction LEN() qui te retourne le nombre de caractères d'une chaine
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 janv. 2010 à 16:54
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.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
16 janv. 2010 à 17:11
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]
0

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

Posez votre question
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015
16 janv. 2010 à 18:40
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 !
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
16 janv. 2010 à 18:56
normal, tu n'exécutes pas ta requête sql...
0
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015
17 janv. 2010 à 01:03
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 !
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 janv. 2010 à 01:08
... 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é
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
17 janv. 2010 à 02:59
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)
0
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015
17 janv. 2010 à 13:10
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 !
0
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015
17 janv. 2010 à 13:14
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
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 janv. 2010 à 13:47
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
0
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015
17 janv. 2010 à 18:26
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
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 janv. 2010 à 18:34
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
0
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015
17 janv. 2010 à 19:09
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 ?
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 janv. 2010 à 19:15
çà 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
0
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015
17 janv. 2010 à 19:20
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 :$
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 janv. 2010 à 19: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 )
0
Sinsitrus Messages postés 849 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 21 août 2015
17 janv. 2010 à 20:08
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.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 janv. 2010 à 20:39
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
0
Rejoignez-nous