Problème sur access avec une textboc
Le Pingou Messages postés 12713 Date d'inscription Statut Contributeur Dernière intervention -
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.
- Problème sur access avec une textboc
- Access appdata - Guide
- Acer quick access - Forum logiciel systeme
- Désinstaller ACER QUICK ACCESS - Forum Logiciels
- Exemple base de données access à télécharger gratuit ✓ - Forum Logiciels
- [Access] creer base données client-produits - Forum Programmation
43 réponses
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.
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.
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionJ'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.
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 ...
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.
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).
Mettre la base en ZIP sur https://www.cjoint.com/ ce qui me permettra de vous aider!
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.
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.
==> 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...
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.
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 & "'" ).
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 ?
Ne désespérez pas, votre dernière version sur https://www.cjoint.com/ (en zip) et je vous fais la correction !
J'ai récupéré un ficher et le voici avec mes corrections : https://www.cjoint.com/?fbmMtm4ADX
Est-ce que cela vous convient?
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à.
Voir le document : https://www.cjoint.com/?fdnp0jqOUV
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.
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.
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
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
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 …