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

VB 6 et antérieur Discussion :

Problème de recherche dans msflexgrid avec deux ou plusieurs textbox


Sujet :

VB 6 et antérieur

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 32
    Points : 27
    Points
    27
    Par défaut Problème de recherche dans msflexgrid avec deux ou plusieurs textbox
    Bonjour,

    Je développe une petite application dont l'utilité est de simplifier ma recherche dans une base de données :
    J'ai une table base de données nommé Tiers (Ref, Nom, Prenom, MatFisc, etc.)
    et j'ai une forme en VB6 qui extraite les données du table tiers et les mettre dans un msflexgrid.
    ce que je veux faire c'est d'ajouter trois textbox dans ma forme chaque textebox correspond à un champs du table tiers (c-à-d txtRef, txtNom, txtPrenom), puis si par exemple j'écris un caractère "a" dans txtRef et un caractère "h" dans txtNom je veux que le msflexgrid m'affiche la ligne ou les lignes dont la reference contient la lettre "a" et le nom contient la lettre "b".

    j'espère que vous comprendrez cet explication et s'il y a une autre méthode de recherche dans un msflexgrid merci de m'informer
    merci d'avance

  2. #2
    Membre actif
    Inscrit en
    Janvier 2011
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 112
    Points : 209
    Points
    209
    Par défaut
    _ Ia ora na.
    _ Pour rester dans les généralités, on pourrait écrire l'équivalent de
    Pour chaque ligne L de la grille (de 0 au nombre total de lignes - 1)
    _____ Si (contenu cellule {ligne L, colonne Référence} = txtRef.Text) et (contenu cellule {ligne L, colonne Nom} = txtNom.Text) alors
    __________Afficher toutes les cellules de la ligne L

    _ Mais il est difficile de répondre de façon plus concrète quand on ne connaît
    - ni le nom de la grille,
    - ni quelle colonne de la grille contient les renseignements correspondants à chaque zone de texte,
    - ni le nombre de zones de texte à prendre en compte (votre exemple en donne deux ; en va -t-il toujours ainsi ou faut-il prévoir le cas où un nombre de zones différent est renseigné ?),
    - (accessoirement_1) ni si la recherche doit respecter la casse (MAJ <> min),
    - (accessoirement_2) ni si elle doit porter sur l'intégralité de ce qui est dans la zone de texte ( X identique à XX ) ou seulement détecter sa présence dans une cellule de la grille ( XX figure dans X ) ; certes, il n'est pas facile de distinguer nettement l'un de l'autre en français, mais la formulation
    [une cellule] dont la reference contient la lettre "a"
    peut correspondre aussi bien à "=" qu'à "InStr" (ou même peut-être à "Left") ;
    - ni la façon dont vous souhaitez précisement afficher les résultats :
    je veux que le msflexgrid m'affiche la ligne ou les lignes [...]
    >> s'agit-il de réduire la grille pour qu'elle ne contienne plus que les lignes retenues (solution a priori peu économique, puisqu'il faudra tout recommencer à zéro si l'on veut effectuer un autre filtrage) ? ou de distinguer ces lignes (fond coloré) en laissant les autres en place ? ou de les afficher dans une autre grille annexe où elles apparaîront seules ? ou dans une zone de texte, une liste, une boîte de message ?
    _ Une ébauche de votre code serait assurément utile et bienvenue.
    _ Bon courage et bonne chance pour la suite de votre projet.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Bonjour,

    Tout d'abord, merci pour votre réponse, c'est trés bien organisé et encadre l'idée,
    Ce que je veux c'est ne pas compliquer la méthode de recherche, c-à-d ne pas respecter la casse, mes textbox ne dépasse pas 6, etc.
    Voici le code que j'ai utilisé :
    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
     
    Private Sub txtRef_Change()
     
        req = "select * from Tiers where Reference like '%" & txtRef.Text & "%'"
        rst.Open req, con
     
        TierGrid.Cols = 5
        TierGrid.Rows = 1
        TierGrid.FixedCols = 1
        i = 0
        While Not rst.EOF
            TierGrid.TextMatrix(i, 1) = rst!Reference
            TierGrid.TextMatrix(i, 2) = rst!Nom
            TierGrid.TextMatrix(i, 3) = rst!Prenom
            TierGrid.TextMatrix(i, 4) = rst!MatFisc
     
            TierGrid.Rows = TierGrid.Rows + 1
     
            rst.MoveNext
            i = i + 1
        Wend
     
        TierGrid.Rows = TierGrid.Rows - 1
     
        rst.Close
     
        If TierGrid.Rows <> 0 Then
            TierGrid.Col = 1
            TierGrid.Sort = flexSortGenericAscending
        End If
     
    End Sub
    avec ce code, ça marche bien avec mon idée mais juste pour un seul textbox (txtRef), mais si je met la lettre "b" dans txtNom je veux qu'il fait un autre recherche sur les ligne obtenue du premier recherche du txtRef et me donner les lignes résultante du premier et du deuxième recherche, alors le code du txtNom sera comme ceci :

    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
     
    Private Sub txtNom_Change()
     
        req = "select * from Tiers where Reference like '%" & txtRef.Text & "%' and Nom like '%" & txtNom.Text & "%'"
        rst.Open req, con
     
        TierGrid.Cols = 5
        TierGrid.Rows = 1
        TierGrid.FixedCols = 1
        i = 0
        While Not rst.EOF
            TierGrid.TextMatrix(i, 1) = rst!Reference
            TierGrid.TextMatrix(i, 2) = rst!Nom
            TierGrid.TextMatrix(i, 3) = rst!Prenom
            TierGrid.TextMatrix(i, 4) = rst!MatFisc
     
            TierGrid.Rows = TierGrid.Rows + 1
     
            rst.MoveNext
            i = i + 1
        Wend
     
        TierGrid.Rows = TierGrid.Rows - 1
     
        rst.Close
     
        If TierGrid.Rows <> 0 Then
            TierGrid.Col = 1
            TierGrid.Sort = flexSortGenericAscending
        End If
     
    End Sub
    ici s'expose le problème, c'est que si je fais une recherche sur les noms, une erreur s'affiche dans la requete c'est que la reference ne contient rien !!
    et ce problème s'agrandi si j'ai 4 textBox !!
    j'espère que mon prob soit compris et merci

    < Désolé pour le français >

  4. #4
    Membre actif
    Inscrit en
    Janvier 2011
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 112
    Points : 209
    Points
    209
    Par défaut
    _ Ia ora na.
    Citation Envoyé par Smilossss Voir le message
    < Désolé pour le français >
    Rassurez-vous : nous connaissons tous la difficulté de s'exprimer dans une langue qu'on ne maîtrise pas entièrement ; pour moi, la difficulté n'est pas là, mais dans la façon de traiter le problème : dans votre message initial, vous écriviez
    Citation Envoyé par Smilossss Voir le message
    j'ai une forme en VB6 qui extraite les données du table tiers et les mettre dans un msflexgrid
    _ Je pensais donc que
    1) vous placiez toutes les données de votre table dans une grille (TierGrid, apparemment),
    2) vous faisiez ensuite les recherches dans la grille.
    _ Pour cela, je pensais pouvoir vous aider, de la façon que j'avais commencé à indiquer, à l'aide des fonctions natives de VB (If, InStr, =, et AND pour une recherche sur plusieurs critères simultanés).
    _ Mais il semble que vous souhaitez
    1) prodéder critère par critère :
    si je met la lettre "b" dans txtNom je veux qu'il fait un autre recherche sur les ligne obtenue du premier recherche du txtRef
    2) utiliser les fonctions de votre base de données pour sélectionner les éléments à retenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    req = "select * from Tiers where Reference like '%" & txtRef.Text & "%'"
    _ Cette façon de procéder est sans doute plus logique et plus puissante, mais elle sort de mon (petit) domaine de compétence ; je ne peux donc que passer le relais, en espérant que vous serez guidé rapidement vers une solution correspondant à votre attente.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Bonjour,

    ça fait plaisir de discuter un problème avec des gens comme vous, une trés bonne explication, un trés bon encadrement du problème, etc. merci

    pour l'algorithme que t'as donner, ça marche bien avec un seul textBox mais le même problème s'expose lorsque on utilise 4 textBox dans la recherche..

    en tous cas merci pour vos réponses et si j'arrive à la solution je vais le poster tout de suite en attendant les réponses des autres..

    Cordialement

  6. #6
    Membre actif
    Inscrit en
    Janvier 2011
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 112
    Points : 209
    Points
    209
    Par défaut
    _ Ia ora na.
    Citation Envoyé par Smilossss Voir le message
    ça fait plaisir de discuter un problème
    _ Le plaisir est tout-à-fait partagé : c'est le même pour moi.
    Citation Envoyé par Smilossss Voir le message
    pour l'algorithme que t'as donner, ça marche bien avec un seul textBox mais le même problème s'expose lorsque on utilise 4 textBox dans la recherche..
    _ En utilisant AND, il devrait fonctionner pour plusieurs zones de texte (txtRef + txtNom) - à condition que le choix de ces zones soit fixe.
    _ Si l'on veut filtrer selon un nombre de zones de texte (TextBox) variable, il faudrait ajouter une condition du genre
    SI (txtRef.Text non renseigné OU contenu cellule {ligne L, colonne Référence} = txtRef.Text)
    ____ ET (txtNom.Text non renseigné OU contenu cellule {ligne L, colonne Nom} = txtNom.Text)
    ____ ET (txtPrénom non renseigné OU contenu cellule {ligne L, colonne Prénom} = txtPrénom.Text)
    ____ ET (txtMatFisc non renseigné OU contenu cellule {ligne L, colonne MatFisc} = txtMatFisc.Text) ALORS

    sachant que txtRef.Text non renseigné correspond à
    _ Cela étant, je suppose que l'on peut, avec un algorithme comparable, créer une requête unique prenant ou ne prenant pas en compte chaque zone de texte selon qu'elle est renseignée ou vide.
    si j'arrive à la solution je vais le poster tout de suite en attendant les réponses des autres.
    _ Nous l'attendons. Bon courage d'ici là.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Bonjour,

    J'ai trouvé la solution avec ma requête grâce à votre algorithme et voici la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    req = "select * from Tiers where (Reference like '%" & txtRef.Text & "%' or Reference='') and (Nom like '%" & txtNom.Text & "%' or Nom='') and (Prenom like '%" & txtPrenom.Text & "%' or Prenom='') and (MatFisc like '%" & txtMatFisc.Text & "%' or MatFisc='')"
    et on met la même requête et le même traitement dans les fonctions des textBox
    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
     
    Private Sub TxtRef_Change()
    'Requête
    'Traitement
    End sub
     
    Private Sub TxtNom_Change()
    'Requête
    'Traitement
    End sub
     
    Private Sub TxtPrenom_Change()
    'Requête
    'Traitement
    End sub
     
    Private Sub TxtMatFisc_Change()
    'Requête
    'Traitement
    End sub
    Merci infiniment pour vous et à toute

  8. #8
    Membre actif
    Inscrit en
    Janvier 2011
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 112
    Points : 209
    Points
    209
    Par défaut
    _ Ia ora na.
    _ Merci à vous d'avoir signalé que vous étiez arrivé à une solution, et d'avoir indiqué cette solution, qui pourra certainement être utile à d'autres.
    _ Le seul point qui sur lequel je m'interroge se trouve dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub TxtRef_Change()
    'Requête
    'Traitement
    End sub
    _ Pas de problème pour 'Requête et 'Traitement, que vous avez programmés ; mais la procédure TxtRef_Change va se déclencher à chaque caractère entré : si la référence est a1234, la procédure va établir une requête et effectuer le traitement successivement pour
    >> txtRef = "a",
    >> txtRef = "a1"
    >> txtRef = "a12"
    >> txtRef = "a123"
    >> txtRef = "a1234" - la seule qui soit pertinente ;
    et on recommencera éventuellement pour txtNom, txtPrénom et txtMatFisc.
    _ Il est tout-à-fait possible que le temps consacré à ces recherches intermédiaires soit négligeable, ou même que ce soit l'effet recherché (comme dans certaines listes qui se réduisent au fur et à mesure que se précise le morceau de texte à rechercher ; mais ce mécanisme ne concerne normalement que des listes à un seul critère) ; si ce n'était pas le cas, il serait possible d'ajouter un bouton (CommandButton, appelé ici btTrier) pour déclencher une seule recherche, une fois tous les txt remplis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub btTrier_Click()
    'Requête
    'Traitement
    End sub
    _ Quand vous jugerez que ce problème a trouvé sa solution, vous pourrez éditer votre premier message pour ajouter le tag [Résolu].
    _ D'ici là et après, bon courage pour votre travail.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Bonjour,

    Merci à vous et je vais expliquer comment cette recherche et plus pertinente que de mettre un bouton :

    avec la fonction txtRef_Change() à chaque caractère saisie il fait une recherche sur ce caractère :

    >> txtRef = "a", ===> cherche toute les mots qui contient "a" dans référence et les affiche (avec leur nom, prenom et matfisc biensure dans le traitement)
    >> txtRef = "a1" ====> cherche toute les ocuurence à "a1" dans référence et les affiche
    >> txtRef = "a12" ====> cherche toute les ocuurence à "a12" dans référence et les affiche
    >> txtRef = "a123" ====> cherche toute les ocuurence à "a123" dans référence et les affiche
    >> txtRef = "a1234" ====> cherche toute les ocuurence à "a1234" dans référence et les affiche

    ==> donc tout sont pertinent et cette fonction pour un seul textBox bien sur
    mais la requête que j'ai donnée contient aussi les autre (txtNom,txtPrenom,txtMatfisc) donc on revenant à votre exemple :

    >> txtRef = "a" ===> cherche toute les ocuurence à "a" dans référence et les affiche à condition que les autre sont vides ou si par exemple on ajoute à txtPrenom deux caractère "b1" alors le résultat de ma requete devient <<cherche toute les ocuurence à "a" dans référence et toute les occurence à "b1" dans Prénom et les affiche>>
    >> txtRef = "a1" ====> cherche toute les ocuurence à "a1" dans référence et les affiche (même principe)
    >> txtRef = "a12" ====> cherche toute les ocuurence à "a12" dans référence et les affiche (même principe)
    >> txtRef = "a123" ====> cherche toute les ocuurence à "a123" dans référence et les affiche (même principe)
    >> txtRef = "a1234" ====> cherche toute les ocuurence à "a1234" dans référence et les affiche (même principe)

    ==> et j'ai met à chaque textbox le même traitement et la même requete car on peut débuter la recherche par Les nom ou les prénom ou les matFisc pas forcément je débute par les références

    alors ici si je met un bouton, la recherche devient trés lourd et ennuyeux car si j'ai une base qui contient plus que 100 milles personnes et je cherche par exemple le nom "ahmed" or dans la base de données elle est écrit "ahmad" alors avec le bouton je ne le trouve jamais car je vais saisir surement "ahmed" et je clique sur le bouton.. mais avec ma rechrche à chaque caractere il va me filter alors si j'écrit juste "ahm" alors toute les "ahmed et ahmad" s'affiche. ok, si j'ai 10 mille ahmed alors je passe à un autre critère de rechrche c'est la date de naissance par exemple. alors j'ai dans le txtNom "ahm" et ce personne est néé à l'année "1990" par exemple alors j'écris dans txtDateNaiss juste "1990" et enfin je le trouve tout simplement..

    Je vous remercie encore, le traitement se trouve dans mon deuxième réponse.
    comment mettre [Résolue] je connais pas ce tag..


  10. #10
    Membre actif
    Inscrit en
    Janvier 2011
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 112
    Points : 209
    Points
    209
    Par défaut
    _ Ia ora na, Smilossss.
    _ Double bravo : d'abord pour être arrivé à résoudre votre problème, et ensuite pour avoir trouvé le bouton [Résolu].
    _ Bon courage pour la fin de ce projet et pour les suivants.

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

Discussions similaires

  1. [XL-2007] Problème de recherche dans macro avec .find
    Par steelk dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 14/01/2015, 19h29
  2. Problème pour rechercher dans une liste excel avec vba
    Par hop51 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 20/03/2013, 19h00
  3. problème de recherche dans une base de donnée mysql
    Par Xini28 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 24/10/2005, 18h00
  4. problème de recherche dans une base de données
    Par bouzid_mehdi dans le forum Bases de données
    Réponses: 2
    Dernier message: 19/07/2005, 06h47
  5. Problème de recherche dans une BD
    Par ledevelopeur dans le forum Bases de données
    Réponses: 5
    Dernier message: 28/04/2004, 09h49

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