IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Moteur de recherche en VBA, probleme de lien ? [AC-2013]


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 53
    Points : 28
    Points
    28
    Par défaut Moteur de recherche en VBA, probleme de lien ?
    Bonjour a tous !

    Ca fais bien longtemps que je n'ai pas fourre mon nez en ces lieux, et je dois dire que j'ai pas mal perdu la main dans la programmation. Oui, je m'y remet...

    Je suis en train de coder une bdd access pour la gestion des stocks, et j'en suis à fabriquer un formulaire montrant une liste de mes produits. J'utilise pour ce faire un sous formulaire, et je cherche a implanter un moteur de recherche dans le formulaire maitre. J'utilise 4 critères de recherche, jusqu'ici, j'en ai deux qui fonctionnent correctement.
    Désignation et code barre fonctionne nickel.
    Nom : capture.jpg
Affichages : 1166
Taille : 95,3 Ko
    Je m'arrache les cheveux pour faire fonctionner le critère Secteur d'usage...
    Le critère type, quand a lui, je m'en occuperais plus tard, quand j'aurais compris le bug pour le -secteur-.

    Voici mon code VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    Private Sub Btn_Filtrer_Click() ' fonction de recherche
    On Error Resume Next
    Dim SQL_String As String
    SQL_String = "SELECT base_articles.* FROM base_articles"
    Filtre_Actif = False ' Initialisation du filtre afin de déterminer si la concaténation de la chaine commence par un where ou un and
    CF_Filtre = Me.Filtre_Designation ' Filtre désignation
    If IsNull(CF_Filtre) Or CF_Filtre = "" Then CF_Filtre = ""
    Select Case CF_Filtre
    Case Is > ""
        Select Case Filtre_Actif
        Case True
            SQL_String = SQL_String & " AND ((base_articles.MP_Cat) Like " & Chr(34) & "*" & CF_Filtre & "*" & Chr(34) & ")"
        Case False
            SQL_String = SQL_String & " WHERE (((base_articles.MP_Cat) Like " & Chr(34) & "*" & CF_Filtre & "*" & Chr(34) & ")"
        End Select
        Filtre_Actif = True
    End Select
    CF_Filtre = Me.Filtre_Code_Barre ' Filtre code barre
    If IsNull(CF_Filtre) Or CF_Filtre = "" Then CF_Filtre = ""
    Select Case CF_Filtre
    Case Is > ""
        Select Case Filtre_Actif
        Case True
            SQL_String = SQL_String & " AND ((base_articles.Code_Barre) = " & Chr(34) & CF_Filtre & Chr(34) & ")"
        Case False
            SQL_String = SQL_String & " WHERE (((base_articles.Code_Barre) = " & Chr(34) & CF_Filtre & Chr(34) & ")"
        End Select
        Filtre_Actif = True
    End Select
    CF_Filtre = Me.Filtre_Secteur ' Filtre secteur
    If IsNull(CF_Filtre) Or CF_Filtre = "" Then CF_Filtre = ""
    Select Case CF_Filtre
    Case Is > ""
        Select Case Filtre_Actif
        Case True
            SQL_String = SQL_String & " AND ((base_articles.Secteur) = " & Chr(34) & CF_Filtre & Chr(34) & ")"
        Case False
            SQL_String = SQL_String & " WHERE (((base_articles.Secteur) = " & Chr(34) & CF_Filtre & Chr(34) & ")"
        End Select
        Filtre_Actif = True
    End Select
    CF_Filtre = Me.Filtre_Type ' Filtre type
    If IsNull(CF_Filtre) Or CF_Filtre = 0 Or CF_Filtre = 0 Then CF_Filtre = 0
    Select Case CF_Filtre
    Case Is > 0
        Select Case Filtre_Actif
        Case True
            SQL_String = SQL_String & " AND ((base_articles.Type) = " & CF_Filtre & ")"
        Case False
            SQL_String = SQL_String & " WHERE (((base_articles.Type) = " & CF_Filtre & ")"
        End Select
        Filtre_Actif = True
    End Select
    Select Case Filtre_Actif ' opérateur de fin de chaine
        Case True
            SQL_String = SQL_String & ") ORDER BY base_articles.MP_Cat;"
        Case False
            SQL_String = SQL_String & " ORDER BY base_articles.MP_Cat;"
        End Select
    ' Changement du RecordSource du sous formulaire en fonction des filtres
    Me.Form![SF_liste_articles].Form.RecordSource = SQL_String
    DoCmd.Requery "SF_liste_articles"
    End Sub
    Je pense que mon probleme se pose au niveau de l'instruction SQL quand je concatene ma chaine, mais je vois pas ou est le probleme.

    Pour info, la liste deroulante Secteur va chercher ses infos dans une sous table -def_secteur-, elle retourne donc une valeur numerique...
    Le champ secteur de ma table base_article est une liste de choix qui trouve sa source dans la base def_secteur

    Merci d'avance pour votre aide

  2. #2
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    Bonsoir,

    J'ai beau regarder ton code, je n'y vois rien quant à la composition de tes "sql1" qui pourrait poser problème.

    Tu dis que le filtre "Code barre" fonctionne et, d'après l'image que tu joins il semble bien que ce soit également du numérique. Donc on pourrait comparer les deux codes (Code-Barre & Secteur) concernant la définition de sql1. La seule différence est: "base_articles.Code_Barre" et ça fonctionne, "base_articles.Secteur" et... pas là. Petite question très certainement stupide mais le champ s'écrit bien "Secteur" dans ta table... ? Tu parles de "Secteur d'usage" dans ton image...
    Cordialement.
    Nous n'héritons pas la Terre de nos ancêtres, nous l'empruntons à nos enfants, prenons-en soin !
    (proverbe amérindien)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 53
    Points : 28
    Points
    28
    Par défaut
    Bonjour Bernard,

    Oui, exactement, Code_Barre est numérique, tout comme Secteur, là encore correctement orthographié Secteur comme dans la table. -Secteur d'usage- est rien d'autre qu'un label pour le formulaire...

    je sais pas si je suis clair dans mes propos, je t'envoi un morceau de ma BDD pour que tu voie ca de plus près
    https://onedrive.live.com/redir?resi...t=file%2caccdb

  4. #4
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    Salut !

    J'ai regardé ta base de long en large et j'y ai trouvé quelques incohérences (à mon avis... qui n'engage que moi)

    Donc, je l'ai un peu remaniée et j'ai:
    • Supprimé la source de ton formulaire "Liste_Categorie_Article". S'il s'agit d'un formulaire de recherche, nul besoin d'une source
    • Supprimé la source du sous-formulaire. (tu peux en mettre une avec résultat nul sur le Redimensionnement du sous-formulaire, afin de ne pas afficher des "#Nom ?" dans ce dernier)
    • Supprimé une "relation bizarre" sur le champ "Secteur"
    • Ajouté une fonction "EstVide" que tu retrouveras dans le module "ModFonctions" (Utile pour tester le remplissage des champs divers)
    • Transformé le champ "Secteur" en "Texte court"
    • Modifié le RowSource de ta liste "Secteur" en ne gardant que "categorie" et en reformatant sur une colonne
    • Idem pour la liste "Secteur" (sous-formulaire)


    Puis, j'ai réécrit le code du bouton, comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    Private Sub Btn_Filtrer_Click() ' Fonction attachée au bouton permettant de modifier les filtres sur la recherche d'articles
    Dim SQL_String  As String
    Dim WhereAnd    As String
     
        Me.Recalc ' Pour prendre en compte la dernière modification effectuée sur le formulaire
     
        ' Test de pertinence de la recherche
        If Estvide(Me.Filtre_Code_Barre) And Estvide(Me.Filtre_Designation) And Estvide(Me.Filtre_Secteur) And Estvide(Me.Filtre_Type) Then
            MsgBox "Veuillez renseigner - au moins - un champ pour effectuer une recherche."
            Exit Sub
        End If
     
        ' Initiation de la variable principale
        SQL_String = "SELECT * FROM base_articles WHERE "
     
        ' >> Traitement de "Désignation"
                                                                                    ' Chr(34) = " (guillemet)
        SQL_String = SQL_String & IIf(Estvide(Me.Filtre_Designation), "", "MP_Cat = " & Chr(34) & Me.Filtre_Designation & Chr(34) & " ")
     
        ' >> Traitement de "Type"
        If Not Estvide(Me.Filtre_Type) Then
            If Right(SQL_String, 2) = "' " Then
                WhereAnd = "AND "
            Else
                WhereAnd = ""
            End If
            SQL_String = SQL_String & WhereAnd & "Type = " & Chr(34) & Me.Filtre_Type & Chr(34) & " "
        End If
     
        ' >> Traitement de "Secteur"
        If Not Estvide(Me.Filtre_Secteur) Then
            If Right(SQL_String, 2) = "' " Then
                WhereAnd = "AND "
            Else
                WhereAnd = ""
            End If
            SQL_String = SQL_String & WhereAnd & "Secteur = " & Chr(34) & Me.Filtre_Secteur & Chr(34) & " "
        End If
        Debug.Print Me.Filtre_Secteur
     
        ' >> Traitement de "Code Barre"
        If Not Estvide(Me.Filtre_Code_Barre) Then
            If Right(SQL_String, 2) = "' " Then
                WhereAnd = "AND "
            Else
                WhereAnd = ""
            End If
            SQL_String = SQL_String & WhereAnd & "Code_Barre = " & Chr(34) & Me.Filtre_Code_Barre & Chr(34) & " "
        End If
     
        ' Opérateur de fin de chaine
        SQL_String = SQL_String & "ORDER BY MP_Cat;"
     
        ' Changement du RecordSource du sous formulaire en fonction des filtres
        Me.Form![SF_liste_articles].Form.RecordSource = SQL_String
        Me.Form![SF_liste_articles].Form.Requery
     
    End Sub
    Je te joins mon "oeuvre" afin que tu puisses tester tout cela !

    Cordialement.
    Nous n'héritons pas la Terre de nos ancêtres, nous l'empruntons à nos enfants, prenons-en soin !
    (proverbe amérindien)

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 53
    Points : 28
    Points
    28
    Par défaut
    Ton code est propre, simple, clair, précis, concis. Faut vraiment que je mette un coup dans les commentaires...
    Je me suis vraiment compliqué la vie je pense, avec mes trucs...
    Je regarde plus en profondeur et je te reviens. Merci d'avance, mais j'ai l'impression que je peux d'ores et déjà basculer ce topic en résolu...

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 53
    Points : 28
    Points
    28
    Par défaut
    J'ai regardé en détail ton code mais je n'ai rien intégré pour l'instant dans mon projet final, je viens de voir que tu a remanié ma table, sur secteur notamment. De numerique a texte court.
    Même si ton code fonctionne parfaitement je ne peux pas m'en inspirer en l'état, la table n'est plus utilisable avec les autres (j'ai plus de 30 tables, et c'est pas fini, je dois aussi inclure toutes mes requêtes), et je ne me vois pas recommencer l'analyse au complet
    Du coup, je vais tenter de modifier ton idée avec ma table d'origine, mais je crois savoir pourquoi ma première solution n'a pas fonctionné :
    le champ est de type numérique, et j'utilisais un champ retournant de l'alpha... j'ai bon ?

  7. #7
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    Ok... alors, avec Secteur en numérique, cela donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    Private Sub Btn_Filtrer_Click() ' Fonction attachée au bouton permettant de modifier les filtres sur la recherche d'articles
    Dim SQL_String  As String
    Dim WhereAnd    As String
     
        Me.Recalc ' Pour prendre en compte la dernière modification effectuée sur le formulaire
     
        ' Test de pertinence de la recherche
        If Estvide(Me.Filtre_Code_Barre) And Estvide(Me.Filtre_Designation) And Estvide(Me.Filtre_Secteur) And Estvide(Me.Filtre_Type) Then
            MsgBox "Veuillez renseigner - au moins - un champ pour effectuer une recherche."
            Exit Sub
        End If
     
        ' Initiation de la variable principale
        SQL_String = "SELECT * FROM base_articles WHERE "
     
        ' >> Traitement de "Désignation"
                                                                                    ' Chr(34) = " (guillemet)
        SQL_String = SQL_String & IIf(Estvide(Me.Filtre_Designation), "", "MP_Cat = " & Chr(34) & Me.Filtre_Designation & Chr(34) & " ")
     
        ' >> Traitement de "Type"
        If Not Estvide(Me.Filtre_Type) Then
            If Right(SQL_String, 2) = "' " Then
                WhereAnd = "AND "
            Else
                WhereAnd = ""
            End If
            SQL_String = SQL_String & WhereAnd & "Type = " & Chr(34) & Me.Filtre_Type & Chr(34) & " "
        End If
     
        ' >> Traitement de "Secteur"
        If Not Estvide(Me.Filtre_Secteur) Then
            If Right(SQL_String, 2) = "' " Then
                WhereAnd = "AND "
            Else
                WhereAnd = ""
            End If
            SQL_String = SQL_String & WhereAnd & "Secteur = " & Me.Filtre_Secteur & " "
        End If
        Debug.Print Me.Filtre_Secteur
     
        ' >> Traitement de "Code Barre"
        If Not Estvide(Me.Filtre_Code_Barre) Then
            If Right(SQL_String, 2) = "' " Then
                WhereAnd = "AND "
            Else
                WhereAnd = ""
            End If
            SQL_String = SQL_String & WhereAnd & "Code_Barre = " & Chr(34) & Me.Filtre_Code_Barre & Chr(34) & " "
        End If
     
        ' Opérateur de fin de chaine
        SQL_String = SQL_String & "ORDER BY MP_Cat;"
     
        ' Changement du RecordSource du sous formulaire en fonction des filtres
        Me.Form![SF_liste_articles].Form.RecordSource = SQL_String
        Me.Form![SF_liste_articles].Form.Requery
     
    End Sub
    Mais n'oublies pas d'intégrer la fonction "EstVide"
    Cordialement.
    Nous n'héritons pas la Terre de nos ancêtres, nous l'empruntons à nos enfants, prenons-en soin !
    (proverbe amérindien)

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 53
    Points : 28
    Points
    28
    Par défaut
    Ok mon ami, j'y suis presque !
    J'ai décortiqué ton code et je l'ai bien compris, j'ai d'ailleurs résolu tout mes problèmes grâce a ton aide.
    Par contre, je viens de voir un bug, la recherche multi critère me donne une erreur de compilation dans la chaine SQL
    Je viens de voir où est le probleme, et ca concerne toute les conditions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    If Not Estvide(Me.Filtre_Type) Then
            If Right(Chaine_SQL, 2) = "' " Then
                Commutateur = "AND "
            Else
                Commutateur = ""
            End If
            Chaine_SQL = Chaine_SQL & Commutateur & "Type = " & Chr(34) & Me.Filtre_Type & Chr(34) & " "
        End If
    En fait, avec un seul critère tout fonctionne a merveille.
    Mais dès lors qu'on en choisis deux...

    J'essaye de bidouiller ca de mon côté et je te reviens.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 53
    Points : 28
    Points
    28
    Par défaut Resolu
    Salut bernard,

    J'ai résolu tout les problèmes concernant le multicritère.

    Je te met en pièce jointe ma bdd pour que tu puisse en profiter.

    Bien cordialement !

    N.b. c'est un fichier 7zip, je sais pas pourquoi mais ca bug quand je veux attacher ma bdd en piece jointe
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Création d'un moteur de recherche en VBA
    Par Djules dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 06/12/2012, 14h32
  2. [XL-2003] Créer un moteur de recherche sou VBA excel
    Par punkisnotdead dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/08/2009, 13h52
  3. Aide pour réaliser un moteur de recherche en Vba Excel
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 22/01/2009, 12h12
  4. Probleme vba pour moteur de recherche ACCESS
    Par sylvaindenisbe dans le forum Modélisation
    Réponses: 1
    Dernier message: 10/05/2007, 14h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo