VB6

dannymortier Messages postés 11 Date d'inscription samedi 18 septembre 2004 Statut Membre Dernière intervention 16 janvier 2010 - 1 août 2009 à 17:54
dannymortier Messages postés 11 Date d'inscription samedi 18 septembre 2004 Statut Membre Dernière intervention 16 janvier 2010 - 2 août 2009 à 20:18
Voila un code pour effectuer differentes recherches dans une base access et ou le resultat est envoyé dans un listbox.
Ca fonctionne, mais il y a 3 bugs ( que j'ai constaté..)

bug 1: La recherche sur une partie de la chaine fonctionne tres bien, seulement, elle s'applique aussi aux chiffres mais dans ce cas, il faudrait utiliser la recherche exacte et je n'arrive pas a faire cohabiter les 2 recherches.

bug 2: les criteres etant generes dynamiquement par programmation, le critere support apparait 2 fois. Comment faire pour en faire disparaitre 1 ??

Bug 3: Lorsque je demande de se repositionner sur le 1er enregistrement, il ne le fait pas, malgré le movefirst. Pourtant lorsque je demande le dernier, il le fait. Et je ne comprend pas pourquoi. Si vous pouviez m'aider a corriger ce code, vous m'aideriez enormement.

Merci deja a Libre_Max et a Vbsearch pour leur aide et leur patience.



Merci

Danny



Option Explicit
'----------------------------------------------------------------------------------------------

Private Sub CmdRechercher_Click()

'--lance la recherche
'--Pour ça il faut parcourir tout le fichier
'* A chaque nouvelle recherche, on doit vider la ListBox
List1.Clear
Dim cText As String
cText = Textbox1.Text

Dim cCritere As String


Dim Indx%
For Indx = 0 To OptionCritere.Count - 1
If OptionCritere(Indx).Value Then cCritere = OptionCritere(Indx).Caption
Next Indx


'**** Dans cecas, il faut déclarer : cText As Variant et non pas As String _
car le type Variant comprend, entre autres, les chaînes et les nombres *****
With frmGestion.AdoGestion.Recordset
.MoveFirst

'---TRES IMPORTANT !
'---ETANT DONNE QUE DANS LA CASSE EST TRES IMPORTANTE? ON VA METTRE
'---LE CONTENU EN MAJUSCULE

cText = UCase(cText)

'---ET POUR UNE RECHERCHE PARTIELLE ON A BESOIN DE LA LONGUEUR DUTEXTE ENTRE.
Dim xLenText As Integer
xLenText = Len(cText)

Dim trouv As Boolean
Dim entreetxt As String
Dim entreechiffre As Integer
Do While Not .EOF







If UCase(Mid(.Fields(cCritere), 1, xLenText)) = cText _
Or InStr(1, UCase(.Fields(cCritere)), cText) Then


trouv = True
' Exit Do 'pour arrêter quand je trouve si on ne veut q'un résultat

' **** Pour avoir tous les résultats, on doit les affecter à la ListBox =>
'===> List1.AddItem .Fields(cCritere)
' Mieux encore, on peut affecter à la ListBox, tous les champs d'un enregistrement _
comme suit :
Dim Ind%, strRet$
strRet = ""
For Ind = 0 To .Fields.Count - 1
strRet = strRet & .Fields(Ind) & " "
Next Ind
List1.AddItem strRet


End If

.MoveNext
Loop
End With
If trouv = False Then
' Cette ligne servait juste a afficher le msgbox Trouvé inutile. je le laisse au cas ou....
'If trouv Then
' MsgBox "trouvé !"
' Else
MsgBox "non trouvé !"
frmGestion.AdoGestion.Recordset.MoveFirst
End If





End Sub



'----------------------------------------------------------------------------------------------

Private Sub Command1_Click()
frmRecherche.Hide
frmGestion.AdoGestion.Recordset.MoveFirst 'Je replace le curseur sur la 1ere position de la base de données
frmGestion.Show
End Sub

Private Sub Command2_Click()
List1.Clear ' Rafraichissement du listbox et du textbox pour une nouvelle recherche
Textbox1.Text = ""

frmGestion.AdoGestion.Recordset.MoveFirst
'Je replace le curseur sur la 1ere position de la base de données
End Sub

Private Sub Form_Load()
'Si à un moment donné, on veut ajouter d'autres champs, les boutons d'option seront crées dynamiquement _
(par le code), par exemple en utilisant un groupe de contrôles : _
on definit une variable compteur : Dim Cont As Integer _
Bien sûr, on doit placer un seul bouton d'option sur la feuille auquel on donne l'index 0(zéro) _
puis on crée les autres et on les positionne :


Dim Cont As Integer
For Cont = 1 To frmGestion.AdoGestion.Recordset.Fields.Count - 1
Load OptionCritere(Cont)
OptionCritere(Cont).Move OptionCritere(Cont - 1).Left, OptionCritere(Cont - 1).Top + OptionCritere(Cont - 1).Height + 5
OptionCritere(Cont).Visible = True
OptionCritere(Cont).Caption = frmGestion.AdoGestion.Recordset.Fields(Cont).Name
Next Cont
OptionCritere(3).Value = True
End Sub



dan

3 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
2 août 2009 à 04:11
Salut
Pas clair
"seulement, elle s'applique aussi aux chiffres" ça veut dire quoi ?
Sais-tu qu'on n'a aucune idée de ce que renferme tes champs ni du genre de texte que tu recherches
Il serait peut-être bon de donner un exemple.

"les criteres etant generes dynamiquement" : Moi, je ne vois que Textbox1.Text comme critère.

"le critere support apparait 2 fois" : "Le critère" déjà, je suis pas sur quon parle de la même chose, mais un "critère support", ma foi, je ne vois pas trop ce que c'est. Alors, s'il apparaît 2 fois (dans quoi ? où ?), on verra après.

PS : Merci d'utiliser les balises [Code] pour insérer du ... code, parce que le texte classique ne peut pas avoir d'espace en tête (du code sans indentation n'est pas facile à lire) + il colorise les mots clés.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
dannymortier Messages postés 11 Date d'inscription samedi 18 septembre 2004 Statut Membre Dernière intervention 16 janvier 2010
2 août 2009 à 15:07
Desole pour le manque de clarté. Les champs sur lesquels se font les recherches sont Titre,Acteur principal,acteur secondaire Remarque,qualite,support et Disque qui lui seul retourne des valeur numerique et non du texte. LE probleme est que si je fais une recherche pour connaitre le contenu de l'Archive disque 1 par exemple, il me renvoie une tonne de resultat avec toutes les archives dont 1 fait partie de la numerotation alrs qu'Avec la recherche precise
If UCase(Mid(.Fields(cCritere), 1, xLenText)) = cText Then

trouv = True
la, il me renvoie juste le bon resultat.

Par contre, sur les recherche sur les chapms aux données alphabetiques, j'ai absolument besoin de la recherche partielle

If UCase(Mid(.Fields(cCritere), 1, xLenText)) = cText _ Or InStr(1, UCase(.Fields(cCritere)), cText) Then


trouv = True

J'ai pensé a utiliser 2 boutons d'option pour permettre de basculer entre les 2 recherches. Mais il faut croire que je ne les place pas a la bonne place..

Ca c'est pour expliquer pourquoi j'ai besoin de deux differents mode de recherche.


Pour ce qui est du deplacement du curseur dans la base de données, c'Est encore plus bizarre car le code est tout simple et mieux encore provient d'un cours de VB6 officiel.
Pour voir comment le curseur se deplace dans les données, j'ai rajoutté un champs numeroté de 1 < 11 dans la base de données ( N enregistrement) Et le curseur se deplace suivant cet ordre
7-8-1-9-2-3-4-5-6-10-11 qui n'a evidemment aucune logique. La seule chose fonctionnant est le movelast qui s'arrete bien au dernier enregistrement.


Ce sont vraiment ces problemes qui me font tourner en rond depuis deja un bon moment.

Je sais que les evidences qui semblent inconnues aux néophites ont tendance a facher les gens qui possedent la connaissance et l'experience. Mais je peux jurer que sur base de ce cours que je possede, ce qui parait evident a un professionnel doit au moins etre montre une fois au neophite pour que cela puisse devenir une evidence pour lui aussi car l'auteur de ce cours semble avoir ecrit ce cours pour des gens ayant deja une connaissance et non pas pour ceux qui debute dans l'apprentissage.

En esperant avoir ete un peu plus clair et surtout en esperant pouvoir trouver une solution a ces 2 problemes, le 3 eme n'etant vraiment qu'accessoire.

Il va de soit que je serai heureux de pouvoir publier le code des qu'il sera fonctionnel afin de venir aider d'autres personnes pateaugeant comme moi..

Merci

Danny





dan
0
dannymortier Messages postés 11 Date d'inscription samedi 18 septembre 2004 Statut Membre Dernière intervention 16 janvier 2010
2 août 2009 à 20:18
Voila ou j'en suis : comme solution, j'ai créer deux procedures differentes Recherchepartielle et recherexacte que j'ai lié a 2 boutons de commande simple et j'appelle les differentes procedure avec Call. Ce n'Est peut-être pas trés éléguant, mais ca marche.
Pour ce qui est du bug avec le double affichage du critere support, c'est réglé aussi ; juste une reeur d'inattention. Ca ne pardonne pas en prog...


Mais il me reste toujours le probleme de postionner le curseur sur le premier enregistrement de la base de donnée et de parvenir a les faire deplacer dans l'ordre.
Il semble que pour Vb ce soit cet ordre qui soit logique car a chaque redemarrage de l'application, il revient ce meme 7-8-1-9-2-3-4-5-6-10-11 . J'ai beau essayé de comprendre ou est sa logique . J'ai verifié dans toutes les colonne s'il y avait le moindre tri alphabetique ou autre, des fois qu'il prenne son ordre dans une autre colonne; mais rien du tout. Aucune logique et je n'y comprend rien du tout. Si au moins pour ce point vous pouviez m'aider. C'est tellement stupide que je ne vois vraiment pas...

Merci

Danny

dan
0
Rejoignez-nous