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 :

[TSMDBGrid] Utilisation des filtres


Sujet :

Bases de données Delphi

  1. #1
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut [TSMDBGrid] Utilisation des filtres
    Salut,
    utilisant la grille TSMDBGrid je rencontre un petit soucis sur la mise en place de filtre, je dois récupérer la liste des filtres d'une colonne avant de pouvoir l'affecter sinon j'obtiens une AV :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    const 
     cstRqstFiltreDuns='Select distinct tmondiale FROM Sites WHERE Orphelin<>0 and tmondiale is not null';
    begin
    ...
        TStrings(LstDuns3):=OrphelinSMDBGrid.Columns[Index].FilterList;
        LstDuns3:=TStringList.Create;
        dmPrincipal.GetListOfDistinctValue(cstRqstFiltreDuns,LstDuns3);
        OrphelinSMDBGrid.Columns[Index].FilterList:=LstDuns3;
    Existe-t-il une approche particuliére pour éviter ce pb ?

    Merci.

  2. #2
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Qu'entend tu par filtre ici donc ? tu parles des cases à cocher ou bien d'autre chose ?
    Bidouilleuse Delphi

  3. #3
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    il y a un grand hic,non??
    tu affecte la lste à un variable TStringlist puis tu le crée????
    Citation Envoyé par Laurent Dardenne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    const 
     cstRqstFiltreDuns='Select distinct tmondiale FROM Sites WHERE Orphelin<>0 and tmondiale is not null';
    begin
    ...
        TStrings(LstDuns3):=OrphelinSMDBGrid.Columns[Index].FilterList;
        LstDuns3:=TStringList.Create;
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  4. #4
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Ha si, ça y'est, j'entrevois la chose...
    Bidouilleuse Delphi

  5. #5
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Edam --> avec les FilterList de SmDBGrid, le code de Laurent est normal. Mais c'est vrai que ça a de quoi être surprenant.....


    Bon prenons la méthodes GetFilterList :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function TSMDBColumn.GetFilterList : TStrings;
    begin
      if FFilterList = nil then
        FFilterList := TStringList.Create;
      Result := FFilterList;
    end;
    Donc, en effet, par défaut, FFilterList n'est pas créée, elle est créée à partir du moment où tu la lit une première fois.

    Donc si tu n'éffectue pas cette opération, au moment ou tu lui affectes une liste que tu as créé toi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     if Value = nil then   //ignoré puisque tu  affectes avec value<>nil
      begin
        FFilterList.Free;
        FFilterList := nil;
        exit;
      end;
     
      FFilterList.Assign(Value); //Access Violation puisque FFilterList=nil (si tu ne l'as pas créé en la lisant une première fois)
    Du coup, ce que je fais en général, c'est que j'initialise tous mes FilterList de colonnes dont je puisse avoir besoin dans mon FormCreate :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var AList:TStringList;
    begin
      for i:=0 to SMDBGrid1.ColCount-1 do
          AList:=SMDBGrid1.Columns[i].FilterList; //L'appel en lecture à pour effet de créer la liste de filtre de la colonne
    end;

    Après et à partir de là, pour l'affectation, c'est "bateau"
    Bidouilleuse Delphi

  6. #6
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    waskol là j'ai rien pigé
    pour la fonction GetFilterList j'ai pigé,
    je préfère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Procedure TSMDBColumn.GetFilterList(var FFilterList : TStrings);
    begin
      if FFilterList = nil then 
        FFilterList := TStringList.Create;
    end;
    pour celle là rien ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var AList:TStringList;
    begin
      for i:=0 to SMDBGrid1.ColCount-1 do
          AList:=SMDBGrid1.Columns[i].FilterList; //L'appel en lecture à pour effet de créer la liste de filtre de la colonne
    end;
    Alist aura à la fin quel valeur exactement
    j'ai jamai utlisé TSMDBgrid, alors c'est pourquoi -peut être- j'ai rien compris .

    [edit] je veux dire quel est la relation avec le probléme
    {edit}
    je croix comprendre un peut ce que tu veux dire waskol, je pense que j'était un peut
    alors récapitulant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TStrings(LstDuns3):=OrphelinSMDBGrid.Columns[Index].FilterList;
    ce ligne affect lstduns3 par Filterlist et en même temps si ce Filterlist n'existe pas (=nil) il est crée,,, c'est sa
    si c'est vrait alors sa sert à quoi ce ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       LstDuns3:=TStringList.Create;
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  7. #7
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Oui edam, le soucis, c'est que dans le composant TSMDBGrid, on peut utiliser à une propriété des colonnes appelée FilterList, qui permet de gérer une liste de filtres pour une table d'une base de données.

    la propriété FilterList définie comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    property FilterList:TStrings read GetFilterList write SetFilterList;
    permet donc d'accéder en Lecture et en écriture à la variable FFilterList de type TString, ce qui se fait via les deux méthodes que j'ai exposé plus haut.

    Vu comme sont écrites ces méthodes, la manipulation de la propriété FilterList est piégeante à souhait...
    Bidouilleuse Delphi

  8. #8
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par edam
    je croix comprendre un peut ce que tu veux dire waskol, je pense que j'était un peut
    alors récapitulant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TStrings(LstDuns3):=OrphelinSMDBGrid.Columns[Index].FilterList;
    ce ligne affect lstduns3 par Filterlist et en même temps si ce Filterlist n'existe pas (=nil) il est crée,,, c'est sa
    si c'est vrait alors sa sert à quoi ce ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       LstDuns3:=TStringList.Create;

    Oui tu as parfaitement compris, et pour la dernière question, celà permet d'avoir un TStringList à manipuler, plutôt qu'un bête TStrings, classes virtuelle avec laquelle on ne peut pas tout faire (tri, gérer les éléments dupliqués ou non, etc...).
    Bidouilleuse Delphi

  9. #9
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par waskol
    Oui tu as parfaitement compris, et pour la dernière question, celà permet d'avoir un TStringList à manipuler, plutôt qu'un bête TStrings, classes virtuelle avec laquelle on ne peut pas tout faire (tri, gérer les éléments dupliqués ou non, etc...).

    pas compris, ce que je sait c'est que creat initialise tout ,(fait clear, un nouveau pointeur,...)
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  10. #10
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par waskol
    Ha si, ça y'est, j'entrevois la chose...
    Oui désolé j'ai été un peu sec sur les explications
    Citation Envoyé par waskol
    Vu comme sont écrites ces méthodes, la manipulation de la propriété FilterList est piégeante à souhait
    Tu m'étonnes !
    C'est en traçant le code que je me suis aperçu de ce "pb", c'est vrai que c'est pas courant comme approche.Mais si on ne souhaite pas créer d'objet inutilement cela ce comprend.
    Un pb de documentation tout compte, fait comme d'hab

    Merci Waskol pour l'idée de l'initialisation.
    Edam je comprend ton désarroi devant ce code peu courant.

    Bon j'espére ne pas tomber sur d'autre "finesse" de genre....
    Merci à vous.

  11. #11
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Laurent Dardenne
    Bon j'espére ne pas tomber sur d'autre "finesse" de genre....
    Merci à vous.
    Quelle idée aussi de vouloir tirer toute la quintescence de ce formidable composant...
    Bidouilleuse Delphi

  12. #12
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Pendant que j'y suis.
    Peut-on, pour récupérer les valeurs distinctes d'une colonne, éviter d'effectuer 2 fois la même requête ?
    La 1er pour obtenir la totalité des données et la seconde pour récupérer uniquement les valeur distincts (ou inversement) afin de les proposer dans la combox associée au filtre d'une colonne ?
    (Access +ADO)

  13. #13
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    tu peux toujours créer une TQuery au run-time qui te fais ça

    Ce qui est bon à savoir, c'est que tu peux créer une TQuery dans un "OnCalcField", qui crées un texte de formattage html (par exemple), en vue d'afficher via le champ calculé une sorte de tableau détail sans avoir à mettre en place une relation maitre/détail.

    Le rapport avec la choucroute Irlandaise :
    Là, dans ton cas, tu utilises le résultat d'une TQuery dans le OnDataChange (ou ailleurs : dans un OnAfterPost, un OnBrowse, c'est toi qui voit là où ça aura le moins d'impact côté perfos) de ton TDataSource pour alimenter et mettre à jour ta combobox

    c'est une façon de faire
    Bidouilleuse Delphi

  14. #14
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Pas mieux Waskol , mais j'ai tjr 2 requêtes.
    Dans ce cas le pb est d'avoir un sous ensemble de la 1 er requête.
    Je n'ai jamais essayé de mettre un distinct dans la propriété mais de toute façon le code interne utilise déjà le filtre du dataset (j'ai regardé rapidement)

    C'est peut être du coté SQL que je dois regarder, ADO propose des datasets imbriqués je vais regardé de ce coté là aussi.

    Je te remercie.

  15. #15
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    C'est vrai qu'une query d'une query ce serait vraiment bien....
    Bidouilleuse Delphi

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

Discussions similaires

  1. utilisation des filtres excel avec une macro access
    Par alexlkds dans le forum VBA Access
    Réponses: 3
    Dernier message: 10/11/2009, 18h35
  2. Probleme avec utilisation des filtres et des modeles
    Par Djolhan dans le forum Thunderbird
    Réponses: 0
    Dernier message: 08/04/2009, 22h30
  3. [BO XIR2] sécurité : utilisation des filtres
    Par warriorfr dans le forum Administration-Migration
    Réponses: 5
    Dernier message: 14/03/2008, 09h25
  4. [ JSP ] utilisation des filtres
    Par Pi2 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 09/11/2006, 14h44
  5. [TIBCLientDataSet] Utilisation des Filtres
    Par nico27 dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 24/06/2004, 14h22

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