Recherche dans une base de données en ado

Description

Ce module permet de rechercher dans une base de données ACCES, avec Microsoft ADO Data control 6.0 (OLEDB), des données en temps réel.
Ce module utilise un listview.
N'oublier pas de changer le path pour la recherche de la base nommée Recherche.mbd

Source / Exemple :


' *******************************
' * Réalisé Sebastien CORDIER   *
' * s-cordier@libertysurf.fr    *
' *******************************

' *******************************
' * Module Acteur               *
' *******************************
Option Explicit

' * Variables globales *
Dim Con As New Connection       ' Connection au moteur ADO
Dim Cmd As New Command          ' Commande pour le moteur ADO
Dim RS As Recordset             ' Tableau resultat
Dim strQuery As String          ' Chaine de requête
Dim bSelect As Boolean          ' Flag de selection
Dim strKeySelect As String      ' Chaine de la cle selectionner
Dim bTri As Boolean             ' Tri par NOM

' *******************************
' * Ajout d'un nouvel acteur    *
' *******************************
Private Sub cmdAdd_Click()
    ' * Variables locales *
    Dim strNom As String            ' Nom de l'acteur
    Dim strPrenom As String         ' Prenom de l'acteur
    Dim intResult As Integer        ' Résultat de la combobox
    
    ' Initialisation de la saisie
    strNom = UCase(Trim(txtNom.Text))
    strPrenom = UCase(Trim(txtPrenom.Text))
    
    ' * Initialisation de la commande
    strQuery = "INSERT INTO Acteur (NOM,PRENOM,PHOTO) VALUES('%','$','?')"
    
    ' Finitialisation de la requête
    strQuery = Replace(strQuery, "%", strNom, 1, , vbTextCompare)
    strQuery = Replace(strQuery, "$", strPrenom, 1, , vbTextCompare)
    strQuery = Replace(strQuery, "?", strImage, 1, , vbTextCompare)
    
    ' Demande de confirmation de l'ajout de l'acteur
    intResult = MsgBox("Voulez-vous ajouter l'acteur : " & vbCrLf & _
                        strPrenom & " " & strNom & vbCrLf & _
                        "à la table des acteurs.", vbOKCancel, "Ajout d'un acteur")
    
    ' Si confirmation ALORS
    If (intResult = vbOK) Then
        ' Initialisation de la commande
        Cmd.CommandText = strQuery
        
        ' Execution de la commande
        Set RS = Cmd.Execute
        
        ' Libération des ressources
        Set RS = Nothing
    End If

    ' Reset des valeurs
    bSelect = False                             ' Annulation de la selection
    strKeySelect = ""
    strImage = ""

    txtNom.Text = ""                            ' Annulation de la zone de saisie
    txtPrenom = ""
    
    txtSearch.Text = txtSearch.Text & " "       ' Annulation zone de recherche
    txtSearch.Text = Trim(txtSearch.Text)
    
    ' Repositionne le focus sur la zone de recherche
    txtSearch.SetFocus

End Sub

' *******************************
' * Suppression de l'acteur     *
' *******************************
Private Sub cmdDelete_Click()

    ' * Variables locales *
    Dim strKey As String            ' Variable cle
    Dim intResult As Integer        ' Resultat combo box
    
    ' Initialisation des variables
    strKey = Replace(strKeySelect, "K", "", 1, , vbTextCompare)
    
    ' Initialisation de la requête
    strQuery = "DELETE FROM Acteur WHERE ID_ACTEUR=%"
    strQuery = Replace(strQuery, "%", strKey, 1, , vbTextCompare)
    
    ' Affichage message box
    intResult = MsgBox("Vous êtes sur le point de supprimer : " & vbCrLf & _
                        UCase(Trim(txtNom.Text)) & " " & UCase(Trim(txtPrenom.Text)) & vbCrLf & _
                        "de la table des acteurs.", vbOKCancel)
                        
    ' Test si OK
    If (intResult = vbOK) Then
        ' Préparation de la commande
        Cmd.CommandText = strQuery
        
        ' Execution de la commande
        Set RS = Cmd.Execute
        
        ' Libération des ressources
        Set RS = Nothing
    End If
    
    ' Reset des valeurs
    bSelect = False             ' Annule la selection
    strKeySelect = ""
    
    txtNom.Text = ""            ' Efface la zone de saisie
    txtPrenom = ""
    
    txtSearch.Text = ""         ' Efface la zone de recherche
    
    ' Repositionne le focus sur la zone de recherche
    txtSearch.SetFocus
    
    
End Sub

' *******************************
' * Modification d'un acteur    *
' *******************************
Private Sub cmdModif_Click()
    
    ' * Variables locales *
    Dim strNom As String
    Dim strPrenom As String
    Dim strKey As String
    
    ' Initialisation des variables
    strNom = UCase(Trim(txtNom.Text))
    strPrenom = UCase(Trim(txtPrenom.Text))
    strKey = Replace(strKeySelect, "K", "", 1, , vbTextCompare)
    
    ' Initialisation de la requête
    strQuery = "UPDATE Acteur SET NOM='%',PRENOM='$',PHOTO='?' WHERE ID_ACTEUR=!"
    strQuery = Replace(strQuery, "%", strNom, 1, , vbTextCompare)
    strQuery = Replace(strQuery, "$", strPrenom, 1, , vbTextCompare)
    strQuery = Replace(strQuery, "?", strImage, 1, , vbTextCompare)
    strQuery = Replace(strQuery, "!", strKey, 1, , vbTextCompare)
    
    ' Init commande
    Cmd.CommandText = strQuery
    
    ' Execute la commande
    Set RS = Cmd.Execute
    
    ' liberation des ressources
    Set RS = Nothing
    
    ' Reinitialise les valeurs
    bSelect = False                 ' Annulation de la selection
    strKeySelect = ""
    strImage = ""
    
    txtNom.Text = ""                ' Annulation de la zone de saisie
    txtPrenom.Text = ""
    
    txtSearch.Text = ""             ' Annulation de la recherche
    
    ' Repositionne le focus
    txtSearch.SetFocus

End Sub

' ***************************
' * Chargement de la photo  *
' ***************************
Private Sub cmdPhoto_Click()

    Dim strFileName As String
    
    ' Gestion du cancel error
    On Local Error GoTo MyErr
    
    ' Init boite de dialogue
    cdlgPhoto.CancelError = True
    cdlgPhoto.Filter = "Fichiers Images |*.jpg;*.gif;*.bmp;*.ico"
    cdlgPhoto.FilterIndex = 1
    cdlgPhoto.ShowOpen
    strFileName = cdlgPhoto.FileName
    
    ' Affichage de la photo
    Set imgPhoto.Picture = Nothing
    
    On Local Error GoTo ErrImg
    
    Set imgPhoto.Picture = LoadPicture(strFileName)
    
    strImage = UCase(Trim(strFileName))
    
    Exit Sub
    
MyErr:
    Exit Sub
    
ErrImg:

    stbInfo.Panels("info").Text = "Erreur de chargement de l'image"
    
End Sub

' *******************************
' * Chargement de la feuille    *
' *******************************
Private Sub Form_Load()
    ' Definition de la chaine de connection
    ' c'est ici qu'il faut modifier le chemin à la base de donnée : Data Source=
    Con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\Programmation\Projets\Recherche.mdb;Persist Security Info=False"
    
    ' Connection à la base de donnée
    Con.Open
    
    ' Affectation des commandes à la connection active
    Cmd.ActiveConnection = Con
   
    ' Affectation des collones list view
    lsvResult.ColumnHeaders.Add , , "Nom", (lsvResult.Width * (3 / 6)), lvwColumnLeft
    lsvResult.ColumnHeaders.Add , , "Prénom", (lsvResult.Width * (3 / 6)), lvwColumnLeft
    lsvResult.View = lvwReport
    
    ' Init du trie
    bTri = False
    stbInfo.Panels("info").Text = "Recherche par Nom"
          
End Sub

' *******************************
' * Dechargement de la feuille  *
' *******************************
Private Sub Form_Unload(Cancel As Integer)
    ' Fermeture de la connection
    Con.Close
End Sub

' *******************************
' * Selection d'une item        *
' *******************************
Private Sub lsvResult_ItemClick(ByVal Item As MSComctlLib.ListItem)
    ' * variables locales *
    Dim strKey As String            ' chaine de la cle
    
    ' Gestionnaire d'erreur
    On Local Error GoTo Err
    
    If (Not bTri) Then
        ' Affichage du nom de l'acteur
        txtNom.Text = Item.Text
    
        ' Affichage du prénom de l'acteur
        txtPrenom.Text = Item.SubItems(1)
    Else
        ' Affichage du nom de l'acteur
        txtNom.Text = Item.SubItems(1)
    
        ' Affichage du prénom de l'acteur
        txtPrenom.Text = Item.Text
    End If
    
    ' Info selection
    'stbInfo.Panels("info").Text = "Selection : " & UCase(Trim(txtNom.Text)) & " " & UCase(Trim(txtPrenom.Text))
        
    ' test si deja selectionner
    If (strKeySelect = Item.Key) Then Exit Sub
    
    ' Mémorisation de la cle
    strKeySelect = Item.Key
     
    ' Sortie de la routine
    Exit Sub
    
MyErr:
    ' Desaffectation de la gestion erreur
    On Local Error GoTo 0
    
    ' Libération des ressources
    Set RS = Nothing
        
     Exit Sub
    
Err:
    ' Desaffectation de la gestion erreur
    On Local Error GoTo 0
        
    ' Libération des ressources
    Set RS = Nothing
    
End Sub

' ***************************
' * Recherche par prenom    *
' ***************************
Private Sub mnuPrenom_Click()
    
    ' Bascule le mode checked et not checked
    mnuPrenom.Checked = Not mnuPrenom.Checked
    
    ' Bascule le flag flip/flop
    bTri = Not bTri
    
    ' Reinit des valeurs
    txtNom.Text = ""                ' Zone de saisie
    txtPrenom.Text = ""
    
    bSelect = False                 ' Selection
    strKeySelect = ""
    
    lsvResult.ColumnHeaders.Clear   ' en-tête de colonne
    
    If (Not bTri) Then
        ' Affectation des collones list view
        lsvResult.ColumnHeaders.Add , , "Nom", (lsvResult.Width - 5) / 2
        lsvResult.ColumnHeaders.Add , , "Prénom", (lsvResult.Width - 5) / 2
        lsvResult.View = lvwReport
        stbInfo.Panels("info").Text = "Recherche par Nom"
    Else
        ' Affectation des collones list view
        lsvResult.ColumnHeaders.Add , , "Prenom", (lsvResult.Width - 5) / 2
        lsvResult.ColumnHeaders.Add , , "Nom", (lsvResult.Width - 5) / 2
        lsvResult.View = lvwReport
        stbInfo.Panels("info").Text = "Recherche par Prenom"
    End If
    
    ' Reinit recherche
    txtSearch.Text = txtSearch.Text & " "
    txtSearch.Text = Trim(txtSearch.Text)

End Sub

' ***************************
' * Procédure de quitter    *
' ***************************
Private Sub mnuQuitter_Click()
    Unload Me
End Sub

' ***************************************************
' * Changement du contenu de la zone de recherche   *
' ***************************************************
Private Sub txtSearch_Change()
    
    ' * Variable locales *
    Dim strSearch As String             ' Zone texte de recherche
    Dim liItem As ListItem              ' Variable pour l'affichage du résultat
    Dim Cpt As Integer                  ' Compteur affichage
    
    ' Lecture de la valeur saisie
    strSearch = Trim(txtSearch.Text)
    strSearch = UCase(strSearch)
    
    ' Efface la zone résultat
    lsvResult.ListItems.Clear
    txtNom.Text = ""
    txtPrenom.Text = ""
    bSelect = False
    
    ' Info de Base
    stbInfo.Panels("info").Text = "0 acteurs"
    
       
    ' Test de la cohérence de la saisie
    If (txtSearch.Text = "") Then Exit Sub
    
    ' Définition de la requête
    If (Not bTri) Then
        strQuery = "SELECT * from Acteur WHERE NOM LIKE '$' ORDER BY NOM ASC"
    Else
        strQuery = "SELECT * from Acteur WHERE PRENOM LIKE '$' ORDER BY PRENOM ASC"
    End If
    
    ' Remplace les etoiles par %
    strSearch = Replace(strSearch, "*", "%", 1, , vbTextCompare)
    
    ' Test si existence d'un %
    If (InStr(1, strSearch, "%", vbTextCompare) = 0) Then
        strSearch = strSearch & "%"
    End If
    
    ' Construction de la requête
    strQuery = Replace(strQuery, "$", strSearch, 1, , vbTextCompare)
    
    ' Préparation de la commande
    Cmd.CommandText = strQuery
    
    ' Execution de la commande
    Set RS = Cmd.Execute
    
    ' Init compteur
    Cpt = 0
    
    ' Test si résultat
    If (Not RS.EOF) Then
        ' Il y a donc un résultat => Boucle d'affichage
        While (Not RS.EOF)
            ' Affichage résultat
            If (Not bTri) Then
                Set liItem = lsvResult.ListItems.Add(, "K" & CStr(RS!ID_ACTEUR), RS!NOM)
                liItem.SubItems(1) = RS!PRENOM
            Else
                Set liItem = lsvResult.ListItems.Add(, "K" & CStr(RS!ID_ACTEUR), RS!PRENOM)
                liItem.SubItems(1) = RS!NOM
            End If
           
            ' Incrémente le compteur
            Cpt = Cpt + 1
            
            ' Passe à l'élément suivant
            RS.MoveNext
            
            ' Autorise les evenements
            'DoEvents
        Wend
    End If
    
    ' Affichage du résultat
    stbInfo.Panels("info").Text = Cpt & " acteurs"
    
    ' Libération des ressources
    Set RS = Nothing

End Sub

' * Procédure recherchant si l'acteur existe
Public Function IsActeurExist(Name As String, Surname As String) As Boolean

    ' Retour par defaut
    IsActeurExist = False
    
    ' Initialisation de la requête
    strQuery = "SELECT * from Acteur WHERE NOM='%' AND PRENOM='$'"
    
    ' Finition de la requête
    strQuery = Replace(strQuery, "%", UCase(Trim(Name)), 1, , vbTextCompare)
    strQuery = Replace(strQuery, "$", UCase(Trim(Surname)), 1, , vbTextCompare)
    
    ' Préparation de la requête
    Cmd.CommandText = strQuery
    
    ' Execution de la requête
    Set RS = Cmd.Execute
    
    ' Test si existance
    If (RS.EOF) Then
        ' Libération des ressources
        Set RS = Nothing
        Exit Function
    End If
    
    ' Retour OK
    IsActeurExist = True
    
    ' Libération des ressources
    Set RS = Nothing
    
End Function

Conclusion :


lorsque vous tapez une lettre dans le texbox de recherche, le module recherche dans la base de données, tous les noms ou prénoms commencant par cette lettre, et ainsi de suite par rapport à la seconde lettre.
Vous avez la possibilité de mettre une étoile dans le champ de recherche pour tout vous afficher

Codes Sources

A voir également

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.