Problème sur access avec une textboc

Bonjour,

Je suis dans la création d'une base de donnée, j'essaye d'incorporer dans mon formulaire une recherche par mots clefs. (via une txtbox). Donc en mettant un mot ou un debut de mot et en tapant sur entrée, le résultat de ma recherche devrait apparaître dans une zone de résultat.

Bref j'ai besoin d'aide, tout aide sera donc la bienvenue.
Configuration: Windows XP
Internet Explorer 6.0

43 réponses

Résumé de la discussion

La problématique porte sur l’implémentation d’une recherche par mots-clefs dans un formulaire Access, avec les résultats affichés dans une zone dédiée. Les réponses préconisent que le formulaire des résultats soit alimenté par la bonne table et que les contrôles correspondent aux champs, afin de pouvoir appliquer un critère de filtrage issus de la saisie. Une solution pratique consiste à gérer l’événement IstResults_DblClick en définissant Critere = "TITRE" & "='" & Me.IstResults & "'" puis DoCmd.OpenForm "Formulairedesaisie", acNormal, , Critere. Une autre piste évoque l’utilisation d’un champ de type lien hypertexte pour référencer des documents et les exploiter via le formulaire.

Bobot (l’IA à votre service)
  1. Bonjour,
    Quelle instruction SQL avez-vous utilisez pour renseigner la zone de résultat ?
    0
    1. Private Sub chkREFERENCE_Click()

      If Me.ChkREFERENCE Then
      Me.cmbRechREFERENCE.Visible = False

      Else
      Me.cmbRechREFERENCE.Visible = True
      End If

      RefreshQuery

      End Sub

      Private Sub chkTITRE_Click()

      If Me.ChkTITRE Then
      Me.txtRechTITRE.Visible = False
      Else
      Me.txtRechTITRE.Visible = True
      End If

      RefreshQuery

      End Sub

      Private Sub chkMOTSCLEFS_Click()

      If Me.chkMOTSCLEFS Then
      Me.txtRechMOTSCLEFS.Visible = False
      Else
      Me.txtRechMOTSCLEFS.Visible = True
      End If

      RefreshQuery

      End Sub

      Private Sub cmbRechREFERENCE_BeforeUpdate(Cancel As Integer)

      RefreshQuery

      End Sub

      Private Sub IstResults_DblClick(Cancel As Integer)
      DoCmd.OpenForm "Formulairedesaisie", acNormal, , "[REFERENCE] = " & lstResults

      End Sub

      Private Sub txtRechTITRE_BeforeUpdate(Cancel As Integer)
      RefreshQuery

      End Sub

      Private Sub txtRechMOTSCLEFS_BeforeUpdate(Cancel As Integer)
      RefreshQuery
      End Sub

      Private Sub Form_Load()

      Dim ctl As Control

      For Each ctl In Me.Controls
      Select Case Left(ctl.Name, 3)
      Case "chk"
      ctl.Value = -1

      Case "txt"
      ctl.Visible = False
      ctl.Value = ""

      Case "cmb"
      ctl.Visible = False

      End Select
      Next ctl

      End Sub

      Private Sub RefreshQuery()
      Dim SQL As String
      Dim SQLWhere As String

      SQL = "SELECT TITRE,AUTEUR,EDITEUR, DATE_EDITION, MOTS_CLEFS FROM table1 "

      If Me.ChkREFERENCE Then
      SQL = SQL & "And Table1!REFERENCE = '" & Me.cmbRechREFERENCE & "*' "
      End If

      If Me.ChkTITRE Then
      SQL = SQL & "And Table1!TITRE = '" & Me.txtRechTITRE & "*' "
      End If

      If Not Me.chkMOTSCLEFS Then
      SQL = SQL & "And Table1!MOTS-CLEFS like '*" & Me.txtRechMOTSCLEFS & "*' "
      End If

      SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where") - Len("Where") + 1))
      SQL = SQL & ";"

      Me.lblStats.Caption = DCount("*", "Table1", Reference) & " / " & DCount("*", "Table1")
      Me.IstResults.RowSource = SQL
      Me.IstResults.Requery

      End Sub

      Je vous envoie tout mes codes j'arrive pas a envoyé la base.
      0
      1. Bonjour,
        Est-ce que le code produit une erreur ?
        Si oui sur quelle ligne ?
        Il me semble qu'il s'agit d'une multi-recherche ... et non d'une simple recherche, si c'est le cas il faut suivre le code pas à pas pour contrôler la bonne exécution ... !
        Au passage j'ai trouvé ceci :
        dans la procédure : [Private Sub Form_Load()], il manque les 2 instructions suivantes juste avant le End Sub:
        Me.lstResults.RowSource = "SELECT …, … , … FROM ….;"
        Me.lstResults.Requery

        Note: pour envoyer la base il faut la compacter si nécessaire puis la compresser en ZIP ou RAR et ensuite vous pouvez la mettre sur www.cjoint.com ou www.cijoint.fr
        0
        1. Merci LE PINGOU je regarde ca demain et si j'ai d'autre soucis, j'hésite pas a te recontacter.
          0
      2. Bonjour,
        Proposition : remplacer la procédure [Private Sub RefreshQuery] par celle qui suit:
        Private Sub RefreshQuery()
        Dim SQL As String
        Dim SQLWhere As String
        SQL = "SELECT TITRE, AUTEUR, EDITEUR, DATE_EDITION, MOTS_CLEFS FROM Table1 Where Table1!TITRE like'*'"
        If Not Me.ChkREFERENCE Then
            SQL = SQL & "And Table1!REFERENCE = '" & Me.cmbRechREFERENCE & "*' "
        End If
        If Not Me.ChkTITRE Then
            SQL = SQL & "And Table1!TITRE like '*" & Me.txtRechTITRE & "*' "
        End If
        If Not Me.chkMOTSCLEFS Then
            SQL = SQL & "And Table1!MOTS_CLEFS like'" & Me.txtRechMOTSCLEFS & "*' "
        End If
        SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where") - Len("Where") + 1))
        SQL = SQL & ";"
        Me.lblStats.Caption = DCount("*", "Table1", Reference) & " / " & DCount("*", "Table1")
        Me.IstResults.RowSource = SQL
        Me.IstResults.Requery
        End Sub
        0
        1. Merci je verrais ca Mardi car j'ai pas la base chez moi. Si tu as d autres conseils n'hésite pas car j'ai fais ce formulaire juste avec des cours sur internet donc niveau SQL je suis un peu à la masse.

          Merci encore, je croise les doigts pour que ca fonctionnne.
          0
      3. Merci, bonnes fêtes de Pâques.
        0
        1. Excellent, Jean-Pierre. Je te remercie tu me sauve la vie. Peut être pas quand même.
          J'ai juste encore une question, en espérant ne pas t'embêter. La recherche sur les mots clefs se fait uniquement sur le premier mot, est-il possible de la faire sur l'ensemble des mots.

          De plus, dans référence et titre quand je choisi (ref ou titre), j'aimerais quand tapant Entrée, ma selection apparaît dans la boite de résultat.

          PS : Je vais pouvoir avoir une bonne note a mon projet et ainsi obtenir ma licence.
          0
      4. Merci Mickael1461,
        Merci.
        Pour tenir compte de vos remarques, il faut encore remplacer 2 lignes dans la procédure [Private Sub RefreshQuery] par celles qui suivent:
        SQL = SQL & "And Table1!TITRE like '*" & Me.txtRechTITRE & "*' "
        SQL = SQL & "And Table1!MOTS_CLEFS like'*" & Me.txtRechMOTSCLEFS & "*' "
        Avec ces 2 corrections la recherche d'un mot complet ou partiel se fait n'importe ou dans la chaine.

        Dernier point; pour la zone de liste déroulante [txtRechTITRE] la mention [Procédure événementielle] manque pour l'événement [Avant MAJ].

        Note: si j'ose me permettre, ce n'est pas la note qui est importante mais le fait d'avoir appris et compris quelque cose de plus ...
        0
        1. La Note (bas de votre message) n'est en soit pas fausse, cependant sans la note (cette fois ci, celle que j'aurais à mon projet et non celle de votre message), l'obtention de ma licen ce pourrait être bien compromise.
          Donc à cet effet je préfère pas tous comprendre, surtout que je ne fais pas une licence en informatique.

          Ceci dit tout à l'air de bien fonctionner mais si vous avez des propositions afin d'améliorer cette petite base sans prétention, je suis preneur.
          Et sinon encore merci pour cette aide précieuse.
          0
      5. Merci Mickael1461, de rien.
        Voir MP !
        0
        1. Bonjour,

          Donc ma question concerne le formulaire que j'ai fait et qui n'enregistre pas les nouveaux enregistrements. Ce formulaire apparait quand on clique sur une ligne dans les résultats (n'importe laquelle). Il permettrait de faire de nouveaux enregistrements sans passer par la table. (plus accessible pour les futurs utilisateurs).
          0
          1. Bonjour,
            Mettre la base en ZIP sur https://www.cjoint.com/ ce qui me permettra de vous aider!
            0
            1. Modérateur
              Salut
              Mickael1461 n'a pas bien saisi le fonctionnement du forum...
              Tu trouveras sa réponse ici...
              http://www.commentcamarche.net/forum/affich 12152019 base?

              je te recopie ici :
              Mickael1461, le vendredi 24 avril 2009 à 08:50:01
              Voila le lien : https://www.cjoint.com/?ezwB1DQQJd 
              
              Ce n'est pas la dernière version.

              En espérant que tu arriveras a le remettre sur les rails
              Bonne journée.
              0
          2. Bonjour baladur13,
            Merci pour l'information, c'est très gentil de votre part.
            J'espère qu'il va corriger le tir ...
            Bonne fin de semaine.
            0
            1. Qu'est ce que je dois corriger ("J'espère qu'il va corriger le tir ... ") expliquez moi ce qui ne va pas.
              0
          3. Modérateur
            Tu as mis ta réponse à ce topic dans un nouveau message ici
            ==> http://www.commentcamarche.net/forum/affich 12152019 base
            comment voulais tu que Le pingou voit ta réponse ????
            Du coup j'ai recopier ta reponse au bon endroit...
            Corriger le tir cela veut simplement dire qu'à l'avenir tu ne te tromperas plus...
            0
            1. Bonjour Mickael,
              Votre formulaire [Formulairedesaisie] doit avoir comme source la table [Table1] et la source de contrôle de chaque champ doit correspondre à ceux de la table.
              Dans la procédure [Private Sub IstResults_DblClick] vous ne pouvez pas prendre le champ [REFERENCE] pour appliquer votre critère car il ne figure par dans la zone de liste [IstResults]
              Corriger votre procédure comme suit :
              Private Sub IstResults_DblClick(Cancel As Integer)
              Critere = "TITRE" & "='" & Me.IstResults & "'"
              DoCmd.OpenForm "Formulairedesaisie", acNormal, , Critere
              End Sub

              Au passage, merci baladur13.

              Bon dimanche.
              0
              1. Bonjour ou plutôt bonsoir à l'heure qu'il est,

                Dans la procédure que vous m'avez conseillé, "Critere" je dois le laisser comme tel je ne dois pas le modifier?

                Je suis désolé de vous déranger sans cesse mais votre aide m'est essentielle.

                Merci encore.
                0
            2. Bonsoir Mickael1461,
              Votre procédure :

              Private Sub IstResults_DblClick(Cancel As Integer)
              DoCmd.OpenForm "Formulairedesaisie", acNormal, , "[REFERENCE] = " & lstResults
              End Sub

              doit être remplacée par celle-ci:

              Private Sub IstResults_DblClick(Cancel As Integer)
              Critere = "TITRE" & "='" & Me.IstResults & "'"
              DoCmd.OpenForm "Formulairedesaisie", acNormal, , Critere
              End Sub

              Explication: la variable Critere est utilisée comme argument Where de l'objet OpenForm. Donc on lui attribut sa valeur avant ( Critere = "TITRE" & "='" & Me.IstResults & "'" ).
              0
              1. Oui c'est bien ce que je fais mais ca ne produit pas de changement.
                0
            3. Bonjour,
              Est-ce que cela est fait ?
              Votre formulaire [Formulairedesaisie] doit avoir comme source la table [Table1] et la source de contrôle de chaque champ doit correspondre à ceux de la table.

              La procédure, l'avez vous copier/coller ou retapée vous même ?
              0
              1. Oui je l'ai recopiée mais je n'ai pas changer la source dans formulaire de saisie. Donc l'erreur doit provenir de cela.
                0
              2. @Mickael1461Non ca fonctionne pas je crois que je vais laisser tomber le formulaire de saisie. Advienne que pourra.
                0
            4. Bonsoir Mickael1461,
              J'ai récupéré un ficher et le voici avec mes corrections : https://www.cjoint.com/?fbmMtm4ADX
              Est-ce que cela vous convient?
              0
              1. Non je comprend pas les nouveaux enregistrements ne s'enregistre pas. Je dois m'y prendre mal. Expliquez moi comment il faut s'en servir.
                Moi je vais sur le dernier enregistrement du formulaire, je double clique sur celui ci et je tape donc mon nouvel enregistrement et comme par magie ca ne marche pas... voilà.
                0
            5. Bonjour Mickael1461,
              Voir le document : https://www.cjoint.com/?fdnp0jqOUV
              0
              1. Merci Jean-pierre,

                Dernière question et après je ne vous embête plus. Mon responsable de stage va donc être l'un des utilisateurs de cette base afin de rajouter des docs au fur et à mesure. Cependant il n'a pas access, alors est t il possible de créer avec la base une page web ou il pourra y avoir accès et ou il pourra rajouter des docs. (ou autre solutions...)

                Merci.
                0
            6. Bonjour,
              Eh bien la réponse me semble très simple, s'il n'a pas le logiciel "Access" il ne peut pas accèder à votre base.
              0
              1. OK merci pour cette réponse simple mais efficace.
                0
              2. @Mickael1461Oui en fait euh... désolé j'aurais encore une question.
                Il faudrait que je crée une case a cocher pour faire apparaître les différents type de document.

                Par exemple quand je clique sur la case article de presse seulement les articles apparaissent.

                Voilà promis c'est ma dernière question
                0
            7. Bonjour,
              Sans informations plus précises, par exemple comme la case à cocher [TITRE] avec une [Procédure événementielle] sur clic et dans la procédure cette ligne de code :
              DoCmd.OpenForm "Nom du formulaire", , , "Nom du champ = 'Critère article de presse'"
              Bonne semaine
              0
              1. En fait il s'agit d'une case a cocher et qui fait apparaître les résultats concernant un type de document.

                Par exemple : prenons deux types de documents les articles ayant pour référence ART. plus un numéro et une autre s'appelant DOC.INT. plus un numéro.

                Donc en cliquant sur la case à cocher ARTICLE je veux que tous les résultat concernant des article et donc ayant comme référence ART apparaissent dans la zone de résultat.

                Voila
                0
            8. Bonjour,
              Si j’ai bien compris, la case à cocher [ARTICLE] est sur le formulaire [Formulaire1] donc :
              Sur clic la procédure :
              Private Sub cacArticle_Click()
              If Not Me.cacArticle Then
                  RefreshQuery
              End IfEnd Sub

              Et dans la procédure [RefreshQuery] juste avant la ligne : SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where") - Len("Where") + 1))
              Vous placez le code suivant :
              If Not Me.cacArticle Then
                   SQL = SQL & "And Table1!REFERENCE like'" & "ART*' "
              End If

              Je vous signale que cette procédure est similaire à celle que vous avez utilisé pour [REFERENCE], [TITRE] et [MOTS-CLEFS]. Note au passage, il y a une étrange ressemblance avec l’étude de M. Fabrice …
              0
              1. Qui est M. Fabrice
                0
            • 1
            • 2
            • 3