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

Bases de données Delphi Discussion :

[Delphi 7 + Interbase] Formulaire de filtrage


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 79
    Points : 66
    Points
    66
    Par défaut [Delphi 7 + Interbase] Formulaire de filtrage
    Bonjour,

    mon but est le filtrage de données dans un formulaire.
    J'explique le process :
    1 - L'utilisateur clic sur le filtrage; la requête de données du formulaire est transférée au formulaire de filtrage.
    2 - Après ouverture du formulaire de filtrage, l'utilisateur peut choisir parmi les champs de la requête et établir des conditions. (suivant l'ordre : Champs; Tri; Critères 1; Critères 2; ..)
    3 - L'utilisateur clic sur un bouton pour valider son filtrage. Il y a construction de la chaine de condition et insertion dans la requête du formulaire parent. Le formulaire parent est filtré.

    Mon soucis est le suivant : les composants IB ne permettant pas le filtrage, il me faut les intégrer dans la requête SQL. Ca se complique un peu lorsque dans une requête SQL on commence à voir l'apparition des clauses WHERE ou HAVING.
    N'y a t'il pas un meilleur moyen que de procéder comme ça ?

    Alexandre

  2. #2
    Membre habitué Avatar de Guile
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 130
    Points : 144
    Points
    144
    Par défaut
    les composants IB ne permettant pas le filtrage :

    pourtant TIBTable et TIBQuery disposent bien des propriétés filter et filtered ainsi que le l'evenement OnFilterRecord

    Je les ai déjà utilisé et ça fonctionne bien
    Il existe 10 sortes de personnes, ceux qui comprennent le binaire et les autres...

  3. #3
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Citation Envoyé par Guile
    les composants IB ne permettant pas le filtrage :

    pourtant TIBTable et TIBQuery disposent bien des propriétés filter et filtered ainsi que le l'evenement OnFilterRecord

    Je les ai déjà utilisé et ça fonctionne bien
    Salut Guile,

    Moi aussi, j'ai tenté de filtrer un TIBquery mais ça n'as pas marché.
    Peux tu nous dire comment tu as fait ?


    Merci
    On progresse .....

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 79
    Points : 66
    Points
    66
    Par défaut
    Bonjour,

    tout comme Andry j'ai tenté mais sans réussir.
    Après avoir beaucoup cherché sur le net, j'ai lu que les filtres n'étaient implémentés que par l'évênement OnFilterRecord (pas facile à gérer).

    Tu faisais ça avec quelle version de Delphi ?

    Merci

  5. #5
    Membre habitué Avatar de Guile
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 130
    Points : 144
    Points
    144
    Par défaut
    Je suis sous DELPHI 7 aussi.

    Là, de mémoire, il me semble que ça, ça marchait bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    with query1 do
    begin
       filtered := false;
       filter := 'AGE > 20';
       filtered := true;
       open;
    end;
    une fois le query ouvert, il est possible de changer le filtre de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    with query1 do
    begin
       filtered := false;
       filter := 'AGE > 15';
       filtered := true;
    end;
    sinon, la deuxième manière dans le onFilterRecord serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    with query1 do
    begin
       if FieldByName('AGE').AsInteger < 15 then Accept := false;
    end;
    C'est de mémoire donc à vérifier quand même, mais j'espère que ça pourra vous guider
    Il existe 10 sortes de personnes, ceux qui comprennent le binaire et les autres...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 79
    Points : 66
    Points
    66
    Par défaut
    tu es bien avec un composant IBQuery ?
    j'ai testé, mais ça ne marche pas chez moi.

    Merci,

    Alexandre.

  7. #7
    Membre habitué Avatar de Guile
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 130
    Points : 144
    Points
    144
    Par défaut
    Oui oui, IBQuery. Etrange
    Je ne me souviens plus si un Refresh suffisait pour rafraichir ou s'il fallait faire un query.Close, query.Open après un changement de filtre par contre.
    Je ne suis quand même pas le seul à avoir fait marcher les filtres des composants Interbase
    Il existe 10 sortes de personnes, ceux qui comprennent le binaire et les autres...

  8. #8
    Membre habitué Avatar de Guile
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 130
    Points : 144
    Points
    144
    Par défaut
    Tiens, j'ai même retrouvé ça qui marche très bien :
    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
     
    procedure TfSlides.qyListeFilterRecord(DataSet: TDataSet;
      var Accept: Boolean);
    begin
      inherited;
      with qyListe do
      begin
        Case rgFiltre.ItemIndex of
          0 : Accept := FieldByName('SLD_ACTIF').AsBoolean; //Actifs
          1 : Accept := not FieldByName('SLD_ACTIF').AsBoolean;  //Inactifs
          2 : Accept :=(QyListe.FieldByName('SLD_DTDEB').IsNull or
                         (QyListe.FieldByName('SLD_DTDEB').AsDateTime <= DmMain.JourneeOuverte)) 
                              and
                              (QyListe.FieldByName('SLD_DTFIN').IsNull or
                              (QyListe.FieldByName('SLD_DTFIN').AsDateTime >= DmMain.JourneeOuverte)); //En cours
          3 : Accept := true;  //Tous
        end;
      end;
    end;
     
    procedure TfSlides.rgFiltreClick(Sender: TObject);
    begin
      inherited;
      qyListe.Close;
      qyListe.Open;
    end;
    rgFiltre étant un TRadioGroup sur lequel on clique pour filtrer l'affichage
    Il existe 10 sortes de personnes, ceux qui comprennent le binaire et les autres...

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 79
    Points : 66
    Points
    66
    Par défaut
    J'ai tout essayé pour avec filter et filtered. J'ai essayé en fermant et en réouvrant le query, en faisant un refresh du query et de mon dbgrid ...

    Par l'évênement OnFilterRecord ça marche parfaitement.
    Seul soucis c'est qu'en client serveur je ne sais pas si au niveau ressource ça peut poser problème pour les grosses tables.

    Je vais me pencher sur le filtrage par sql. Je voudrais faire quelque chose de propre au niveau de la requête, sans ajouter mes critères en verrue ...

    Merci pour ton aide.

  10. #10
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Salut,

    J'ai pas essayer avec l'evenement OnFilterRecord, mais pour le reste, j'ai déjà tester comme AlexB59 l'a fait.
    En faites, j'ai déjà une grille qui affiche la liste complète ou le résultat de la recherche qui fournit le filtre qui ne necessite pas de toucher l'instruction Sql mais comme ça n'as pas marché alors j'ai jetté l'eponge et donc a finalement rajouter la condition where dans la reqête.
    Je vais essayer le OnFilterRecord.

    Merci
    On progresse .....

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 79
    Points : 66
    Points
    66
    Par défaut
    Pour le OnFilterRecord je te dirais de faire attention.
    Place un brake dans la procédure et tu verras que pour chacun des enregistrements visible, il rentre dans la procédure pour vérifier sil elle correspond aux critères (Accept := MonChamp > 2).
    Au niveau ressource je pense que ça en prend plus que le simple fait de modifier l'instruction sql.

  12. #12
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    J'ai bien fait alors de gerer la conditiopn where dynamiquement que d'utiliser cette evenement.

    Merci à toi.

    Cdt
    On progresse .....

  13. #13
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 16
    Points : 20
    Points
    20
    Par défaut
    si par exple c'est 1 combobox ki contient les élts svts lesquels on doit filter la table il faut taper ce coder sur son évènement on change :

    ibtable1.filter := 'nom_champ = ' + combobox1.text ;
    ibtable1.filtered := true ;

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/02/2010, 11h00
  2. [Delphi 2005][INTERBASE] isEmpty toujours faux
    Par Vulcanos dans le forum Bases de données
    Réponses: 2
    Dernier message: 26/03/2005, 20h43
  3. [Delphi 6] Interbase OpenSource 6
    Par dudux dans le forum InterBase
    Réponses: 4
    Dernier message: 18/01/2005, 08h32
  4. Delphi et InterBase : EIBInterBaseError
    Par grincheuse dans le forum InterBase
    Réponses: 6
    Dernier message: 06/12/2004, 15h51
  5. SVP prob Delphi avec interbase
    Par Riri394 dans le forum Bases de données
    Réponses: 6
    Dernier message: 14/06/2004, 16h35

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