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 :

Valeur max dataset et dbgrid


Sujet :

Delphi

  1. #1
    Invité
    Invité(e)
    Par défaut Valeur max dataset et dbgrid
    Bonjour à vous,

    j'ai un petit soucis avec tableau (oui oui, comme dans le titre ).

    En faite j'ai un DBGrid dans lequel j'ai un Dataset (d'un fichier CSV).
    Il contient entre autre un colonne Adresse IP.
    -Mon but est de récupérer l'IP avec la valeur la plus haute du dataset (dans l'optique de l'incrémenter lors de la création d'une nouvelle adresse...)

    Mes compétences en Delphi étant plus que limitées, j'en appel à votre savoir !

    Alors, des idées ?

    PS : je suis sous Delphi7
    Dernière modification par Invité ; 19/08/2013 à 14h31.

  2. #2
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Je dirais: en triant le dataset en ordre décroissant sur la colonne IP et en lisant la valeur de la colonne IP de la première ligne.

    (ou alors, j'ai pas compris la question)

  3. #3
    Invité
    Invité(e)
    Par défaut
    En faisant ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FM_MAIN.CsvDataset.Sort(FM_MAIN.CsvDataset.FieldByName('IP').AsString, true);
    FM_MAIN.CsvDataset.First;
    Il me renvoi : 'Sort failed. Invalid field name in list: 10.10.00.20' au moment du Dataset.First..

    Je dois mal m'y prendre...

  4. #4
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    La colonne qui contient l'IP n'a pas de nom dans le dataset ?
    Le message d'erreur indique clairement qu'il attend un nom de colonne et non une valeur de champ

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Je ne sais pas ce qu'est ce composant CSVDataset mais avec le composant de Delphi, on ferait comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      ClientDataSet1.FieldDefs.Add('nom', ftString, 50);
      ClientDataSet1.FieldDefs.Add('ip', ftString, 50);
      ClientDataSet1.CreateDataSet;
      ClientDataSet1.IndexFieldNames := 'ip';
     
      ClientDataSet1.AppendRecord(['Mercredi', '192.168.0.255']);
      ClientDataSet1.AppendRecord(['Lundi', '192.168.0.1']);
      ClientDataSet1.AppendRecord(['Mardi', '192.168.0.5']);
     
      ClientDataSet1.Open;
      ClientDataSet1.Last;
      ShowMessage('La plus haute IP: ' + ClientDataset1.Fields[1].AsString);
      ClientDataSet1.Close;
    Ou, s'il y a beaucoup de données , et pour éviter d'aller au dernier record:

    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
     
      ClientDataSet1.FieldDefs.Add('nom', ftString, 50);
      ClientDataSet1.FieldDefs.Add('ip', ftString, 50);
     
      ClientDataSet1.IndexFieldNames := 'ip';
      with ClientDataSet1.IndexDefs.AddIndexDef do
      begin
        Name := 'IPLaPlusGrandeEnPremier';
        Fields := 'ip';
        Options := [ixDescending, ixCaseInsensitive];
      end;
      ClientDataSet1.IndexName := 'IPLaPlusGrandeEnPremier';
     
      ClientDataSet1.CreateDataSet;
     
      ClientDataSet1.AppendRecord(['Lundi', '192.168.0.1']);
      ClientDataSet1.AppendRecord(['Mardi', '192.168.0.5']);
      ClientDataSet1.AppendRecord(['Mercredi', '192.168.0.255']);
     
      ClientDataSet1.Open;
      ClientDataSet1.First;
      ShowMessage('La plus haute IP: ' + ClientDataset1.Fields[1].AsString);
      ClientDataSet1.Close;

  6. #6
    Invité
    Invité(e)
    Par défaut
    Mon fichier contient bien des entêtes...


    IM;IP;NOM;EMPLACEMENT;DCREAT;DMOD;TYPESORTIE;NBLECTEURS;MODE1;TIME1;MODE2;TIME2;MODE3;TIME3
    1252;10.10.00.20;J00_20;XXXXX;12/08/2013;12/08/2013;Gache;1;Contacteur;5000;Deporte;5000;NONE;0
    555;10.10.00.21;J00_21;XXXXX;12/08/2013;19/08/2013;Gache;1;Contacteur;5000;Deporte;5000;NONE;0
    D'ailleurs je m'en sers dans le FieldDefEditor du dataset

  7. #7
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    alors ça devrait être un truc dans le genre:

    FM_MAIN.CsvDataset.Sort('IP', true);

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bon, c'est pas parfait mais j'ai bidouillé ça et ça à l'air de fonctionner..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        with FM_MAIN.DBGrid1.DataSource.DataSet do
         begin
               DisableControls;
               First ;
               While not EOF do
                   Begin
                      if(RightStr(Fields[1].Value,5) > test)then
                          test := RightStr(Fields[1].Value,5);
     
     
                     Next;
                   End;
              EnableControls;
         end;
    Vous en pensez quoi ?


    EDIT : 'FM_MAIN.CsvDataset.Sort('IP', true);' fonctionne super bien !

    Laquelle méthode est la plus rapide et la moins lourde d'après vous ? Je pencherais pour le 'Sort'...

  9. #9
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    La méthode Sort évidemment

  10. #10
    Invité
    Invité(e)
    Par défaut
    Ok, va pour le Sort !

    Merci beaucoup, je bloque encore beaucoup sur des petits points de détails, c'est vraiment frustrant par moment...

  11. #11
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    "Patience et longueur de temps ..."

  12. #12
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par aurik Voir le message
    Bon, c'est pas parfait mais j'ai bidouillé ça et ça à l'air de fonctionner..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        with FM_MAIN.DBGrid1.DataSource.DataSet do
         begin
               DisableControls;
               First ;
               While not EOF do
                   Begin
                      if(RightStr(Fields[1].Value,5) > test)then
                          test := RightStr(Fields[1].Value,5);
     
     
                     Next;
                   End;
              EnableControls;
         end;
    Vous en pensez quoi ?


    EDIT : 'FM_MAIN.CsvDataset.Sort('IP', true);' fonctionne super bien !

    Laquelle méthode est la plus rapide et la moins lourde d'après vous ? Je pencherais pour le 'Sort'...
    Ce serait intéressant que tu chronomètres le temps mis par les deux possibilités, juste pour info.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Je vais tester, mais mon fichier CSV ne faisant qu'une cinquantaine de ligne, je ne suis pas sur que les résultats seront vraiment significatifs...

  14. #14
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par aurik Voir le message
    Je vais tester, mais mon fichier CSV ne faisant qu'une cinquantaine de ligne, je ne suis pas sur que les résultats seront vraiment significatifs...
    T'as qu'à utiliser une copie du CSV dans laquelle tu auras copié puis collé 10 fois les lignes bout à bout (sauf celle d'en-tête bien sûr), avec 500 lignes on aura un truc déjà plus significatif.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Bon avec 500 enregistrement et en utilisant ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     startTick := GetTickCount;
     
    MON CODE
     
      delta      := GetTickCount - startTick;
      ShowMessage(IntToStr(delta) + 'ms');
    pour chronométrer, je suis aux alentours des 15ms pour les 2 méthodes...

    Plus étonnant encore, la méthode "Boucle" me renvoi parfois 0ms !

  16. #16
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par aurik Voir le message
    Bon avec 500 enregistrement et en utilisant ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     startTick := GetTickCount;
     
    MON CODE
     
      delta      := GetTickCount - startTick;
      ShowMessage(IntToStr(delta) + 'ms');
    pour chronométrer, je suis aux alentours des 15ms pour les 2 méthodes...

    Plus étonnant encore, la méthode "Boucle" me renvoi parfois 0ms !
    Donc pour le moment, les tests de chronos n'indiquent pas clairement un net avantage pour la méthode SORT... qui serait donc gourmande en temps CPU... intéressant !

  17. #17
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Je suis étonné. JE serais curieux de voir le code de tri de la méthode Sort

  18. #18
    Invité
    Invité(e)
    Par défaut
    oui moi aussi, j peux essayer de partager le composant si ça peut vous intéresser...

  19. #19
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Je suis étonné. JE serais curieux de voir le code de tri de la méthode Sort
    En même temps, faut bien voir que la méthode SORT elle ne sort pas son tri du chapeau avec le lapin rose à 3 oreilles. C'est un petit algo (à bulle ou pas) qu'il faut bien lancer, et qui mouline quand même de manière sympathique.

    Je pense que le SORT est surtout utile pour des affichages utilisateurs, lorsque celui ci à besoin de trier sa liste dans tel ou tel ordre sur telle ou telle colonne, là le SORT a tout son sens.

    Pour le reste, dans le cas présent, lancer le SORT ou bien parcourir la liste et déterminer basiquement le plus grand (ou pus petit) revient peut être au même en temps CPU ?

    Les avis des Dieux du Code que sont Paul et Shail seront les bienvenus ! Je suis loin d'avoir leur connaissance du monde subconscient de Delphi !

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

Discussions similaires

  1. Selection de la valeur max et d'un nom associé
    Par djefff75 dans le forum Access
    Réponses: 7
    Dernier message: 24/02/2006, 11h21
  2. requete SQL avec valeur max
    Par oeil de nuit dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/01/2006, 08h58
  3. [DAO]rechercher la valeur max d'un identifiant
    Par stressy dans le forum Access
    Réponses: 3
    Dernier message: 13/12/2005, 11h28
  4. Sélection d' une valeur max depuis 2 tables
    Par ipeteivince dans le forum Requêtes
    Réponses: 4
    Dernier message: 13/05/2005, 17h37
  5. Réponses: 4
    Dernier message: 07/04/2005, 13h37

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