Petit moteur de recherche sql / vb sur base de donnees

Soyez le premier à donner votre avis sur cette source.

Vue 17 718 fois - Téléchargée 2 211 fois

Description

Les moteurs de recherche tout monde connait. Dans google ou autre je tape les mots que je recherche separés par des espaces et je tape sur Entrée.
Plus concrètement on a tous une base avec des champs de type Text ou Memo qui contiennent plusieurs dizaines de caractères (voir des centaines), et dans les exemples içi ou là, on nous montre toujours comment rechercher UN SEUL mot.

Vous avez une base access et vous etes debutant en sql et vous voulez la même chose que Google?
(heuuu modestement et toute proportion gardée....)

Voila un tout petit bout de code tres simple qui va vous faire voir la combinaison VB SQL afin de réaliser votre premier moteur de recherche.
le code source fonction en DAO.
ATTENTION si vous utiliser ADO remplacer les * par des %.

preparation:
lier une table à un controle Data ou Adodc ou meme autre apres une adaptation du code de connexion.
lier le controle à votre grille préférée.
dessinez un textbox et nommer le TxtRecherche_Avancee.
assurer vous que dans votre table le champs où se fait la recherche ne prenome :
"designation" modifier le code en cas contraire.
Lancer le Prog.
dans la zone de text, tapez autant de mot que vous le souhaitez separé par un espace (comme google) puis validez.

le moteur va afficher tous les champs contenant la série de mots rechercher.

Voilà, j'espere avoir été claire et bon prog.

Source / Exemple :


Private Sub TxtRecherche_Avancee(KeyAscii As Integer)
    On Error Resume Next

    'Le principe de la rechercher avancee est le suivant:
    'supposont que l'on recherche les mots 'cheval region alsace'
    'Dans le principe on va creer une chaine SQL sous la forme
    'Select * from matable where designation like '*cheval*' AND '*region*' AND '*alsace*'
    'donc on va dabord decouper la suite de mot et la concatener à l'aide de 'AND' afin
    'de construire une chaine SQL correct
    'ATTENTION si vous utiliser ADO remplacer les * par des %
'
If (KeyAscii = 13) Then
    chaine1 = ""
    chaine_complete = Trim(TxtRecherche_Avancee)
    lg = Len(chaine_complete)
    X = 1
    Do Until X = 0
        X = InStr(1, chaine_complete, " ")
        If X = 0 Then
            chaine1 = chaine1 & "'*" & chaine_complete & "*'"
        Else
            chaine1 = Left(chaine_complete, X - 1)
            chaine1 = "'*" & chaine1 & "*' AND designation like "
            chaine_complete = Mid(chaine_complete, X + 1, lg - X)
        End If
    Loop
    Data1.DatabaseName = App.Path & "\MaBase.mdb"
    Data1.RecordSource = "SELECT * FROM matable " & _
    "where designation like " & chaine1 & ""
    Data1.Refresh
End If

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

m2rtech
Messages postés
239
Date d'inscription
mercredi 9 octobre 2002
Statut
Membre
Dernière intervention
20 février 2012
-
connais pas bien trasact sql (mais voici ue piste)

il te suffira de créer une requete jointé (lol), et d'adresser
les champs des différentes tables de la sorte :

Champ_recherche = "Articles.référence & Articles.désignation & Fournisseurs.fournisseur"

Requete_Articles = Requete_Articles_De_base & _
" where " & Champ_recherche & " LIKE ""*" & txtRech & "*""

chez moi ça marche. j'arrive à rechercher simultanement dans plusieurs champs de plusieurs tables.
Aurel_xp
Messages postés
1
Date d'inscription
mardi 18 novembre 2003
Statut
Membre
Dernière intervention
17 mars 2006
-
Voila je cherche l' équivalent en trasact SQl , une fonction qui chercherait dans plusieur table sur une même base.
:)

Merci
m2rtech
Messages postés
239
Date d'inscription
mercredi 9 octobre 2002
Statut
Membre
Dernière intervention
20 février 2012
-
Salut,
je republie le code le cas ou, mais je confirme qu'il marchait avec plus de 2 mots clefs (donc 3, 4 etc) ET ce meme avec des fragments(google n'a qu'a bien se tenir lol) de mots et dans le désordre.
ex: vous rechercher des vis Chc zingué M12 par boite de cent :
vous tapez : vis zin boi cent

revoici le code tel qu'il tourne aujourd'hui :
Private Sub TxtRecherche_Avancee_KeyPress(KeyAscii As Integer)
On Error GoTo fin

'Le principe de la rechercher avancee est le suivant:
'supposont que l'on recherche les mots 'moteur 450Kw Triphase'
'Dans le principe on va creer une chaine SQL sous la forme
'Select * from table where designation like '*moteur*' AND '*450Kw*' AND '*Triphase*'
'donc on va dabord decouper le suite de mot et la concatener à l'aide de 'AND' afin
'de construire une chaine SQL correct
If (KeyAscii = 13) Then
Dim chaine1 As String, chaine_complete As String
Dim lg As Integer, X As Integer
chaine1 = ""
chaine_complete = Trim(TxtRecherche_Avancee)
lg = Len(chaine_complete)
X = 1
Do Until X = 0
X = InStr(1, chaine_complete, " ")
If X = 0 Then
chaine1 = chaine1 & "'*" & chaine_complete & "*'"
Else
chaine1 = Left(chaine_complete, X - 1)
chaine1 = "'*" & chaine1 & "*' AND articles.désignation like "
chaine_complete = Mid(chaine_complete, X + 1, lg - X)
End If
Loop
Data1.RecordSource = Requete_Articles_De_base & " where articles.désignation like " & chaine1 & Chaine_de_Group_BY & " ORDER BY " & Type_Tri_Sql_Articles
Data1.Refresh
End If
Exit Sub
fin:
err.description
End Sub
themioux
Messages postés
51
Date d'inscription
dimanche 29 mai 2005
Statut
Membre
Dernière intervention
14 avril 2011
-
Rectification... ce code ne marche qu'avec 2 mots clefs
Petite rectification donc...
Dim chaineTmp As String
...

If X = 0 Then
chaine1 = chaine1 & "'*" & chaine_complete & "*'"
Else
chaineTmp = Left(chaine_complete, X - 1)
chaine1 = chaine1 & "'*" & chaineTmp & "*' AND designation like "
chaine_complete = Mid(chaine_complete, X + 1, lg - X)
End If
...

voilà ^^
themioux
Messages postés
51
Date d'inscription
dimanche 29 mai 2005
Statut
Membre
Dernière intervention
14 avril 2011
-
Code génial, parfait pour faire des recherche sur plusieurs champs (après quelques modifications tout de même ;) )

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.