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

 Delphi Discussion :

Filtrage des enregistrements en delphi 7


Sujet :

Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Filtrage des enregistrements en delphi 7
    bonjour à tous chers programmeurs en delphi.
    Voilà j'ai un problème avec le filtre. J'aimerai que lors de mes recherches, quand j'entre un caractère ou une lettre correspondant à un nom dans ma base de donnée, que tous ceux dont les noms ne commencent pas par cette lettre s'effacent. Mais le hic c'est que lorsque j'entre un caractère, c'est tout qui disparait. Voici mon code source:


    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
    procedure TForm12.Edit1Change(Sender: TObject);
    var Filtre : string;
    begin
     
    // Constrcuction du Filtre avec le texte saisi dans la zone TEdit
    Filtre := 'Nom_client =''' + Edit1.Text + '*''';
    // Test si il n'y a rien dans le TEdit
    if Edit1.Text ='' then
    begin
    // Arrête le filtrage de la table
    form4.client.Filtered:=false;
    // Quitte la méthode
    exit;
    end;
    // Mise en place du filtre
    form4.client.Filter := Filtre;
    // Activation du filtre
    form4.client.Filtered := true;
    end;'
    Pourriez-vous me dire où est le problème?
    Merci de vos réponses.

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par laguesbo Voir le message
    bonjour à tous chers programmeurs en delphi.
    Voilà j'ai un problème avec le filtre. J'aimerai que lors de mes recherches, quand j'entre un caractère ou une lettre correspondant à un nom dans ma base de donnée, que tous ceux dont les noms ne commencent pas par cette lettre s'effacent. Mais le hic c'est que lorsque j'entre un caractère, c'est tout qui disparait. Voici mon code source:


    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
    procedure TForm12.Edit1Change(Sender: TObject);
    var Filtre : string;
    begin
     
    // Constrcuction du Filtre avec le texte saisi dans la zone TEdit
    Filtre := 'Nom_client =''' + Edit1.Text + '*''';
    // Test si il n'y a rien dans le TEdit
    if Edit1.Text ='' then
    begin
    // Arrête le filtrage de la table
    form4.client.Filtered:=false;
    // Quitte la méthode
    exit;
    end;
    // Mise en place du filtre
    form4.client.Filter := Filtre;
    // Activation du filtre
    form4.client.Filtered := true;
    end;'
    Pourriez-vous me dire où est le problème?
    Merci de vos réponses.

    Essai plutôt comme cela

    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
    procedure TForm12.Edit1Change(Sender: TObject);
    var Filtre : string;
    begin
      // Constrcuction du Filtre avec le texte saisi dans la zone TEdit
      Filtre := 'Upper(Nom_client) like ' + QuotedStr(UpperCase(Edit1.Text) + '*');
      // Arrête le filtrage de la table
      form4.client.Filtered:=false;
      // Test si il n'y a rien dans le TEdit
      if Edit1.Text ='' then
      begin
        form4.client.Filter := Filtre;
        // Activation du filtre
        form4.client.Filtered := true;
      end;
    end;'
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Pour Paradox, la méthode du Filter est très efficace
    Pour les DB Distantes comme Oracle, SQL Server, MySQL ... mieux vaut préférer une Query (et un nombre restreint d'enregistrement)
    L'ajout d'un index sur le champ peut améliorer les performances de l'égalité strict, pour le like l'amélioration dépend de la DB

    Sinon, attention au ' parasite en fin de bloc, on peut simplifier encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm12.Edit1Change(Sender: TObject);
    begin  
      // Arrête le filtrage de la table
      form4.client.Filtered:=false;
      // Test si il n'y a rien dans le TEdit
      if Trim(Edit1.Text) = '' then
      begin
        // Construction du Filtre avec le texte saisi dans la zone TEdit
        form4.client.Filter := 'Upper(Nom_client) like ' + QuotedStr(UpperCase(Edit1.Text) + '*');
        // Activation du filtre
        form4.client.Filtered := true;
      end;
    end;
    Attention au choix des noms de variables, Form4, Form12, Edit1, que cela soit pour un devoir ou un projet pro, autant que cela soit propre !
    De tels noms n'aide pas à s'y retrouver !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    bonjour et merci de vos réponses. Mais lorsque je les essaye çà marche toujours pas!! en fait je constate plutôt vos codes convertissent les caractères minuscules en caractère majuscule!! est ce necessaire pour effectuer le tri? Parce que là je suis perdu!! Bon je reexplique un peu mieux mon problème. Voilà je veux effectuer un tri qui est de telle sorte que quand j'entre par exemple la lettre " K " tous les noms ne commençant pas par cette lettre disparaissent. Avec vos codes ca ne marche pas. Alors SVp auriez-vous quelque chose d'autre?

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 265
    Points : 290
    Points
    290
    Par défaut
    Plusieurs problèmes :
    1- Faute de frappe ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Trim(Edit1.Text) = '' then
    Tu n'actives donc jamais le filtre.
    Je pense que tu voulais écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Trim(Edit1.Text) <> '' then
    2- TDataset.filter ne gère que peux d'instruction,
    2.a - UpperCase n'est pas géré.
    A la place il faut affecter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TDataset.FileterOptions = [foCaseInsensitive]
    2.b - like n'est pas géré
    si foNoPartialCompare n'est pas dans TDataset.FileterOptions alors l'opérateur = ce comporte comme un like.

    Donc dans ton cas ca devrait donner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm12.Edit1Change(Sender: TObject);
    begin  
      // Arrête le filtrage de la table
      form4.client.FilterOptions := [foCaseInsensitive];
      form4.client.Filtered:=false;
      // Test si il n'y a rien dans le TEdit
      if Trim(Edit1.Text) <> '' then
      begin
        // Construction du Filtre avec le texte saisi dans la zone TEdit
        form4.client.Filter := 'Nom_client = ' + QuotedStr(Edit1.Text + '*');
        // Activation du filtre
        form4.client.Filtered := true;
      end;
    end;
    PS : attention aux termes : Trier = classer les données ce que tu veux n'est pas un tri mais un filtre !

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Tu as l'oeil Zatoobux !
    On a laissé trainer des coquilles comme = au lieu de <>, mais bon je pense que laguesbo avait corrigé le problème car comme tout code étranger, il est bon de le comprendre et de l'adapter si nécessaire

    Sinon, oui le TTable, BDE, c'est très léger !
    Est-ce sur Paradox ? ACCESS ou DBase
    Le Filter reste le plus rapide
    Si c'est autre chose comme Oracle ou SQL Server : toujours le même conseil : le TQuery qui est plus simple que toutes ces options

    Enfin, BDE, c'est obselète depuis 10 ans, tu dois forcément utiliser cela ?
    Par conséquence Paradox, c'est pas mieux !
    Rien que les problématiques de déploiement du BDE, au final sont plus pénible qu'un package comme "MySQL Essentials" via ADO\ODBC
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 265
    Points : 290
    Points
    290
    Par défaut
    <HORS SUJET>
    Je ne veux pas lancer de débat... mais il n'a jamais été question ni de BDE ni de Paradox ici...

    Tdataset.Filter est très efficace dans de très nombreux cas et n'est pas dépendant du BDE.
    Tu peux utiliser TDataset.Filter sur un TClientDataset chargé depuis n'importe quoi !
    Tu peux utiliser TDataset.Filter sur des composants lié au BDE mais aussi à ADO ou dbExpress !!!
    Le seul inconvénient à mon avis à ne pas filtrer en amont, c'est que l'on charge TOUTES les données.
    Par contre une fois les données chargées ca fonctionne super bien.
    Faire un filtre dynamique dans le onChange d'un TEdit en renvoyant une requête à chaque fois sera moins efficace que l'utilisation de TDataset.filter.
    </HORS SUJET>

  8. #8
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Zatoobux Voir le message
    2.b - like n'est pas géré
    si foNoPartialCompare n'est pas dans TDataset.FileterOptions alors l'opérateur = ce comporte comme un like.
    Le like est géré (en tout cas avec les composants ADO j'en suis sûr car je l'utilise dans plusieurs programmes)
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par Zatoobux Voir le message
    Je ne veux pas lancer de débat... mais il n'a jamais été question ni de BDE ni de Paradox ici...
    Un Troll qui éviterait le débat ...

    A part que ta réponse soit très complète, cela devrait aider laguesbo
    @laguesbo, si tu as Delphi 7, si tu as les Demos, regarde FishFact, cela pourrait t'inspirer pour les manipulations DB

    un ujet dans la section "Débutant" avec aucune précision de lib et DB avec comme titre "Filtrage des enregistrements en delphi 7", je devine un amalgame, la séparation Delphi\BDE\Paradox étant flou au possible pour un débutant

    Possible que je me trompe ! non en fait j'y crois pas !

    Sinon, quand tu dis LIKE n'est pas géré, tout dépend de l'implémentation :
    Le TIBTable le gère parfaitement !
    Le TMyTable de Devart, le gère aussi
    En ADO, aucune idée, j'utilise ADOQuery, filter, ça doit bien faire 10 ans que je n'ai pas touché à ça, je vais pas m'amuser à récupérer une table 300 000 clients pour filtrer tous les Dupont
    ça fait bien longtemps que j'ai aussi abandonné les filtres incrémentales, comme tu le dis, trop couteux, un bouton "recherche" multi-critère (dont une case à cocher genre "recherche partielle" ou "nom complet"), une petite fenêtre de patience pour les énervés du clavier)

    Sinon, un point important c'est les espaces, il faut être propre et le ne pas coler les éléments comme = et ', il est fragile la dessus !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 265
    Points : 290
    Points
    290
    Par défaut
    j'avoue, j'ai vérifié vite fait les points 2.a et 2.b... avec une TTable... donc le BDE !

    Et tu coup ce que j'ai dit ne s'applique pas avec ADO car TADOTable et TADOQuery ne publient pas TDataset.FilterOptions !!!

  11. #11
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Zatoobux Voir le message
    j'avoue, j'ai vérifié vite fait les points 2.a et 2.b... avec une TTable... donc le BDE !
    Bouuuuuhhhhh, le BDE est a bannir c'est complétement obsolète
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  12. #12
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    rolalala!!! vos réponses bien qu'elles soient intéressantes sont vraiment à couper de souffle. Je me rends compte vu vos débats j'ai encore du progrès à faire en delphi là. Bon pour essayer de clarifier les choses @Zatoobux merci de la remarque sur me " = " mais je l'avais déjà vu et même modifié! .J'utilise un ADO pour ma connexion et mes tables sont faites sous access (c'est vrai j'aurai dû commencer par là désolé)et j'utilise un ADOTable et là vous me parlez de BDE. du coup bah ya de quoi être au nord là. c'est vrai je sais aussi utiliser un BDE avec PARADOX mais je constate juste c'est pas assez fun et disons même un peu archaïque je trouve. Alors il n' y a pas de solutions à mon problème? Mais bon je pense j'adopterai au cas contraire une nouvele méthode qui m'est passé par la tête parce que je constate sur la majeure partie des applications, cette méthode est récurrente quoi!! merci Tout de même cher Programmeur car vous me faites murir en Delphi

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 265
    Points : 290
    Points
    290
    Par défaut
    Si tu utilises ADO alors ignore ma remarque a propos de TDataset.FilterOptions.
    Mais utilise ce que les autres ont proposé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    ADOTable1.Filter := 'nomduchamp like ' + QuotedStr(Edit1.Text + '*');
    ..

  14. #14
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par laguesbo Voir le message
    j'utilise un ADOTable et là vous me parlez de BDE. du coup bah ya de quoi être au nord là. c'est vrai je sais aussi utiliser un BDE avec PARADOX mais je constate juste c'est pas assez fun et disons même un peu archaïque je trouve.
    Lol trouve le couple ADO\ACCESS plus fun que BDE\Paradox, ça va c'est gentil, que dira tu avec ADO\SQL Server ou MyDAC\MySQL, ça c'est vraiment efficace !

    Sinon, en fait, comme on utilisait LIKE depuis le début, tu avais juste le = '' à corriger en <> '' et la solution de Rayek fonctionnait !

    Citation Envoyé par Zatoobux Voir le message
    Et tu coup ce que j'ai dit ne s'applique pas avec ADO car TADOTable et TADOQuery ne publient pas TDataset.FilterOptions !!!
    mais FilterOptions est public dès le TDataSet donc accessible par code mais toute modification provoque une Exception EDatabaseError avec le message "FilterOptions non prises en charge" (bon c'est ce que j'ai dans le code de ADODB.TCustomADODataSet.SetFilterOptions de 2007)


    Il est vrai le TTable les publies pour l'utilisation avec l'IDE, le BDE c'est pour les fous du clicodrome !



    Citation Envoyé par laguesbo Voir le message
    lors il n' y a pas de solutions à mon problème?
    Si si, il y a une !
    Le TADOQuery !
    Mais insiste sur le Filter, si Rayek l'utilise c'est que cela fonctionne ! Persévère avec le LIKE !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm12.Edit1Change(Sender: TObject);
    begin  
      // Arrête le filtrage de la table
      form4.client.Filtered:=false;
      // Test si il n'y a rien dans le TEdit
      if Trim(Edit1.Text) <> '' then
      begin
        // Construction du Filtre avec le texte saisi dans la zone TEdit
        form4.client.Filter := 'Nom_client like ' + QuotedStr(Edit1.Text + '*');
        // Activation du filtre
        form4.client.Filtered := true;
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Problème de Filtrage des enregistrements par plage de Dates
    Par mohalesage dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 11/07/2014, 01h00
  2. Filtrage des enregistrements de type integer
    Par unja2010 dans le forum Bases de données
    Réponses: 2
    Dernier message: 25/06/2013, 00h06
  3. Réponses: 15
    Dernier message: 12/12/2011, 17h07
  4. Enregistrement des unités sous Delphi XE
    Par Bernard B dans le forum EDI
    Réponses: 1
    Dernier message: 16/11/2011, 11h32
  5. Filtrage des enregistrements sur la derniere date
    Par Franck_P dans le forum Langage SQL
    Réponses: 4
    Dernier message: 03/12/2008, 11h15

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