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

Composants FMX Delphi Discussion :

ListView et filtres


Sujet :

Composants FMX Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut ListView et filtres
    Bonjour,

    je reprends une de mes marottes : les TListViews car je "tombe" sur un truc que je n'arrive pas à obtenir.

    Soit une liste par exemple des montants de commandes clients.
    Nom : Capture.PNG
Affichages : 94
Taille : 12,2 Ko
    Vous admettrez que si j'applique une recherche, le montant total fait "tâche"
    Nom : Capture_1.PNG
Affichages : 83
Taille : 9,2 Ko

    J'arrive bien à indiquer le nombre d'éléments filtrés grâce à ce code
    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 TForm3.ListView1Filter(Sender: TObject; const AFilter, AValue: string;
      var Accept: Boolean);
    begin
       if OldFilter<>AFilter then
          begin
           OldFilter:=AFilter;
           nFiltered:=0;
          end;
       Accept:=Sametext(AValue,AFilter);
       if Accept then
        begin
         inc(nFiltered);
         Filtres.Text:=Format('Filtres %d',[nfiltered]);
        end;
    end;
    L'inconvénient c'est que le filtre n'indique pas de quel item il s'agit et donc je ne peux atteindre le montant de l'item
    De même, la recherche ne positionne pas l'élément en cours sur la table il est donc exclu que je fasse quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    montantFiltre:=montantFiltre+ClientDataSet1.FieldByName('ItemsTotal').asFloat
    qui me donnerait nfiltered*ItemsTotal de la première ligne de la Table, soit dans l'exemple 6250,00

    Une idée pour accéder au montant de l'élément au sein du OnFilter (sachant que dés que la condition du filtre est remplie on ne passe pas sur les autres objets texte de l'item) ?

    P.S. j'ai bien idée de faire la somme des montants de éléments non filtrés pour les déduire de la somme total mais il y a certainement mieux ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Bonjour, essaye de m'envoyer un extrait des sources, je vais regarder. J'ai une petite idée sur le sujet

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Le projet est simple à dessein.
    La seule chose qu'il faudra certainement modifié c'est l'emplacement du fichier du clientdataset (orders.xml).

    Cela étant, je vais reprendre l'interface que j'ai exposé ici
    avec mon idée de décompte et je pense pouvoir arriver à quelque chose de potable, avec un seul impératif cependant, le "montant" doit être le dernier objet texte (ce qui est le cas dans ce projet simple)
    Fichiers attachés Fichiers attachés
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    OK, avec mon interface légèrement modifiée j'obtiens bien le sous total de la sélection

    Nom : Capture.PNG
Affichages : 78
Taille : 9,2 Ko

    Maintenant un gros mystère reste, le montant total dans la version du #1 et donc du zip est totalement faux

    pour cela j'utilisais un SQLLocal de cette manière
    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 TForm3.ClientDataSet1AfterOpen(DataSet: TDataSet);
    var t : Double;
    begin
    With FDConnection1 do
     begin
      Connected:=True;
      FDLocalSQL1.Active:=False;
      FDLocalSQL1.Active:=True;
      T:=ExecSQlScalar('SELECT SUM(ItemsTotal) FROM ClientDataset1');
      ShowMessage(Format('Total %3.2n',[T]));  // MntTotal.Text:=Format('Total %3.2n',[T]);
      FDLocalSQL1.Active:=False;
     end;
    // ListView1.SetMode(smEqual);
    // ListView1.Objects2Test.Add('text');
    end;
    peux t'on alors se fier à cette méthode ? A priori non mais j'aimerai bien savoir pour quelle raison j'ai un montant faux !
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    de retour avec un exemple plus concret, l'application sur laquelle je planche, j'ai un souci avec les avoirs
    Nom : Capture.PNG
Affichages : 67
Taille : 244,4 Ko
    Cette histoire de montant total à décrémenter n'est donc pas au point, même si elle reste valable pour le premier exemple qui, lui, n'avait pas de montant négatif.

    La solution que j'envisage porte donc sur le positionnement du montant en première position dans la liste de mes objets (facile ce n'est qu'une édition de Forme .FMX à faire) et un cumul de valeurs quoique, au moment où j'écrit ça je n'ai pas idée trés nette du comment

    Pour info, en pj le projet exemple avec utilisation de l'interface
    Fichiers attachés Fichiers attachés
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Pour info c'est pour mon application
    Nom : Capture_1.PNG
Affichages : 69
Taille : 130,2 Ko

    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
    procedure TFormTableauBord.ListeFacturesFilter(Sender: TObject; const AFilter,
      AValue: string; var Accept: Boolean);
    var m : String;
    begin
      if Not Sametext(OldFilter,AFilter)  then
       begin
         OldFilter:=AFilter;
         SoldePartiel:=0;
       end;
      Accept:=ListeFactures.Accept(AFilter,AValue);
      if Sametext(ListeFactures.GetTextObjectsNames[ListeFactures.GetTextObjectIndex],'Montant') then
         begin
            m:=StringReplace(AValue,' ','',[rfReplaceAll]);  // enlève le "formatage" 
            MontantItem:=StrToFloatDef(M,0);               // mémorise le montant de l'élément de liste (placé comme  premier textObjet)
         end;
       if Accept then
         begin
           SoldePartiel:=SoldePartiel+MontantItem;       // ajoute le montant
         end;
       NombrePiece.Text:=Format('Filtre %3.2n / ',[SoldePartiel]); // "affichage" du Solde "partiel" 
       NombrePiece.Visible:=True;
     
    end;
    Pour ce qui est du SQLLocal sur un ClientDataset par contre je reste sceptique. Dans mon application j'utilise la même technique sur un FDQuery et, jusqu'à présent je n'ai pas trouvé d'erreur sur le calcul du montant
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

Discussions similaires

  1. Savoir si une liste (Listbox ou ListView) est filtrée
    Par SergioMaster dans le forum Composants FMX
    Réponses: 1
    Dernier message: 30/05/2020, 09h07
  2. [Débutant] Filtre sur ListView
    Par kitcarflo dans le forum VB.NET
    Réponses: 1
    Dernier message: 30/03/2014, 15h45
  3. filtre via une ListView
    Par Florian.L dans le forum ASP.NET
    Réponses: 0
    Dernier message: 27/08/2010, 22h16
  4. Problème de filtre dans une ListView
    Par Thrud dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 30/04/2008, 16h10
  5. filtre d'un tableau dans listview
    Par pipo159 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 08/04/2008, 18h41

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