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 :

Tri dans une DBGrid sur un champ date au format jj/mm


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 115
    Points
    115
    Par défaut Tri dans une DBGrid sur un champ date au format jj/mm
    Bonjour à tous,

    J'ai un petit problème pour trier des date sous le format jj/mm.
    Mon application sort tous les anniversaires entre le 1er du mois et un jour sélectionner dans le mois, il est biensûr possible que plusieurs personnes soient né le même jour, cependant à l'affichage, j'ai par exemple ceci:
    BIRTHDAY
    -------------
    1/10
    1/10
    1/10
    ...
    10/10
    10/10
    11/10
    12/10
    12/10
    ...
    19/10
    19/10
    puis ça recommence à
    2/10
    2/10
    ...
    20/10
    29/10
    puis ça recommence à
    3/10
    4/10
    5/10
    ...
    9/10
    et ainsi de suite.
    J'aimerai que toutes les dates ce suivent
    1/10
    1/10
    2/10
    2/10
    2/10
    3/10
    ...
    19/10
    20/10
    21/10
    ...
    29/10
    etc...
    Voici mon 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    procedure SetBirthdayBeforeADateInt;
    const
      aBIRTHDAY : integer = 0;
    var
      sMonthOfYearNow : string;
      sDayOfMonthNow  : string;
      sBirthday       : string;
    begin
      ShortDateFormat := 'mm';
      sMonthOfYearNow := DateToStr(Now);
      ShortDateFormat := 'dd/mm/yyyy';
      sDayOfMonthNow  := '01';
      try
        with DataModule1 do
        begin
          IBQueryIntContact.Close;
          IBQueryIntContact.SQL.Clear;
          IBQueryIntContact.SQL.Add('SELECT NUM, NOM, PRENOM, BDA, TEL, TEL2,');
          IBQueryIntContact.SQL.Add('CANDIDAT, PRO, DISP, DAT, SEL,');
          IBQueryIntContact.SQL.Add('EXTRACT(day from BDA) || ''/'' ||');
          IBQueryIntContact.SQL.Add('EXTRACT(month from BDA) AS BIRTHDAY');
     
          IBQueryIntContact.SQL.Add('FROM INT');
          IBQueryIntContact.SQL.Add('where extract(month from BDA) * 100 + extract(day from BDA) >= '); //101');
          IBQueryIntContact.SQL.Add(QuotedStr(sMonthOfYearNow + sDayOfMonthNow));
          IBQueryIntContact.SQL.Add('and extract(month from BDA) * 100 + extract(day from BDA) <= '); //201');
          sBirthday := DateToStr(frmListeInt.DateTPAnnifInterim.Date);
          IBQueryIntContact.SQL.Add(QuotedStr(GetConvertDate(sBirthday, aBIRTHDAY)));
          IBQueryIntContact.SQL.Add('ORDER BY 12'); // 12 est la colonne BIRTHDAY
          IBQueryIntContact.Open;
          //IBQueryIntContact.Last;
     
        end;
      end;
      ShortDateFormat := 'dd/mm/yyyy';
    end;
    Quelqu'un aurait il une solution à me proposer
    Merci d'avance
    Jeankiki

  2. #2
    Membre confirmé Avatar de JustMe
    Inscrit en
    Juillet 2002
    Messages
    479
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 479
    Points : 593
    Points
    593
    Par défaut
    Je te propose unne solution mais je ne sais pas si ça va t'aider
    tu décompose ta date en deux jour et mois en SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select substring(birthday from 1 for 2) as jour , substring(birthday from 4 for 6) as mois
    From aa
    order by mois, jour
    et comme tu l'as vu tu fais ton ordre en premier sur le mois ensuite sur le jour fais moi signe si ça marche
    <On fait la science avec des faits, comme on fait une maison avec des pierres : mais une accumulation de faits n'est pas plus une science qu'un tas de pierres n'est une maison> **Poincaré**

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 115
    Points
    115
    Par défaut
    Salut,

    Je ne pense pas que cela va m'aider, car le mois sera toujours le mois courant. Je veux sortir les dates entre le premier du mois en cours et une autre dates données.

    En fait j'ai le problème quand je passe par delphi, si je fais la même query avec IBConsole par exemple, je n'ai pas le problème.

    Jeankiki

  4. #4
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 103
    Points : 120
    Points
    120
    Par défaut
    Salut,

    ton problème est "classique" et vient du fait que tu fais un tri sur une chaine de caractère... par sur une date

    tu devrais extraire via ta requête la date entière (et pas day et month), faire le tri sur le champ (je comprends pas cette histoire de colonne 12 ?!?!) et ensuite formater l'affichage du champ dans ton éditeur...

    à ta disposition pour de plusa amples renseignements...

    @+
    Ce n'est pas parce qu'on pédale dans la semoule, qu'on est sûr de manger du couscous... (anonyme)

  5. #5
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Citation Envoyé par Amenofis
    ton problème est "classique" et vient du fait que tu fais un tri sur une chaine de caractère... par sur une date
    Tout a fait exacte !

    Citation Envoyé par Amenofis
    tu devrais extraire via ta requête la date entière (et pas day et month), faire le tri sur le champ (je comprends pas cette histoire de colonne 12 ?!?!) et ensuite formater l'affichage du champ dans ton éditeur...
    Non car un tri sur la date entière va donner

    31/10/1920
    1/10/1950
    15/10/1950
    2/10/1960


    or si j ai bien compris il veut

    1/10
    2/10
    15/10
    31/10

    Et donc si vous voulez le faire en SQL il faut trier sur une autre colonne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    IBQueryIntContact.SQL.Add('SELECT NUM, NOM, PRENOM, BDA, TEL, TEL2,'); 
          IBQueryIntContact.SQL.Add('CANDIDAT, PRO, DISP, DAT, SEL,'); 
          IBQueryIntContact.SQL.Add('EXTRACT(day from BDA) || ''/'' ||'); 
          IBQueryIntContact.SQL.Add('EXTRACT(month from BDA) AS BIRTHDAY,'); 
          IBQueryIntContact.SQL.Add('EXTRACT(day from BDA) as DAYBDA,'); 
          IBQueryIntContact.SQL.Add('EXTRACT(month from BDA) AS MONTHBDA');
          IBQueryIntContact.SQL.Add('FROM INT'); 
          IBQueryIntContact.SQL.Add('where extract(month from BDA) * 100 + extract(day from BDA) >= '); //101'); 
          IBQueryIntContact.SQL.Add(QuotedStr(sMonthOfYearNow + sDayOfMonthNow)); 
          IBQueryIntContact.SQL.Add('and extract(month from BDA) * 100 + extract(day from BDA) <= '); //201'); 
          sBirthday := DateToStr(frmListeInt.DateTPAnnifInterim.Date); 
          IBQueryIntContact.SQL.Add(QuotedStr(GetConvertDate(sBirthday, aBIRTHDAY))); 
          IBQueryIntContact.SQL.Add('ORDER BY 14, 13'); // 14 est la colonne MONTHBDA (le mois de la date anniversaire) et 13 est DAYBDA le jour de la date anniversaire.

  6. #6
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 103
    Points : 120
    Points
    120
    Par défaut
    Re,

    Hum

    le tri sur une date veut dire tri sur une date, désolé...

    ce que nous voyons comme, par exemple, 29/10/2004 est la retranscription, le décodage (voir fonctions EncodeDate et DecodeDate) d'un entier. Donc si on tri des dates elles seront dans l'ordre des jours.

    Il est bien entendu que la donnée est stockée dans un champ de type DateTime, sinon on arrête la discussion...

    @+
    Ce n'est pas parce qu'on pédale dans la semoule, qu'on est sûr de manger du couscous... (anonyme)

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2004
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 62
    Points : 59
    Points
    59
    Par défaut
    100% d'accord avec toi Amenofis 1er!
    Le tri sur les dates entières devrait sortir les résultats dans l'ordre souhaité.

  8. #8
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Citation Envoyé par Amenofis
    Re,

    Hum

    le tri sur une date veut dire tri sur une date, désolé...
    Oui c'est vrai une tri sur date c'est un tri sur date. Et je vais surenchérir : Un tri sur chaine de caractères est un tri sur chaine de caractères.

    Citation Envoyé par Amenofis
    ce que nous voyons comme, par exemple, 29/10/2004 est la retranscription, le décodage (voir fonctions EncodeDate et DecodeDate) d'un entier. Donc si on tri des dates elles seront dans l'ordre des jours.

    Il est bien entendu que la donnée est stockée dans un champ de type DateTime, sinon on arrête la discussion...

    @+
    Oui et alors vous voulez prouvez quoi ? Qu'un tri sur date se fait bien dans l'ordre chronologique ?
    Ce n'est pas moi qu'il faut convaincre et d'ailleur je n'ai jamais dit le contraire. Simplement c'est votre proposition qui n'est pas bonne car :
    On a ici une personne qui a un probleme :
    J'ai un petit problème pour trier des date sous le format jj/mm.
    Premiere remarque à faire : jj/mm n'est pas une date donc veux t elle trier par date comme elle le dit au debut et tronquer juste l'année ?
    Le probleme si on y refechi c'est qu'on optient pas le résultat voulu.
    prennez comme exemple la liste des dates de naissances suivantes que je vais trier par date :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    15/01/1920
    01/01/1940
    27/01/1940
    24/01/1950
    elles sont triées par date si je tronque les années celà donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    15/01
    01/01
    27/01
    24/01
    Alors que le résultat qu'il attend c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    01/01
    15/01
    24/01
    27/01
    Si j'avais gardé les années :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    01/01/1940
    15/01/1920
    24/01/1950
    27/01/1940
    Ce qui n'a rien à voir avec un tri sur date.


    Donc lisont la suite de son message pour en savoir plus :

    Mon application sort tous les anniversaires entre le 1er du mois et un jour sélectionner dans le mois,
    Ok donc en regardant le code on s'apperçoit qu'il y a une liste de date de naissance et le but et de retrouver la date d'anniversaire...

    Donc si on se contante d'un tri sur les dates de naissance on n'optient pas la même chose qu'un tri sur date d'anniversaire.

    Donc deux solutions :
    La compliqué (celle qu'il a adopté) :
    Extraire jour et mois de la date de naissance et faire un tri sur ceux ci pour donner le résultat voulu (la solution que j'ai proposé)
    Soit (la solution que j'aurai plutot mise en oeuvre) calcul de la date d'annisersaire et tri sur cette date.

    Donc en conclusion merci de bien vouloir relire la question quand une personne vous dit que ce que vous avez repondu ne marchera pas...

    Mais bon il n'y a rien de grave car si on résume :
    Justme a aussi donné la bonne réponse il y a juste un probleme de compatibilité avec interbase au niveau des order by sur des colonnes calculées.
    Toi tu as mal compris le probleme et du coup n'a pas pas proposé la bonne solution.
    Mais il y a une bonne nouvelle quand meme dans cette histoire : tu as un fan inconditionnel :mariustrezor Il te soutient même quand tu te trompes

    Sur ce bon week end et merci de vos participations !

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2004
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 62
    Points : 59
    Points
    59
    Par défaut

    mea culpa. disons qu'on a tous les deux fait la meme erreur

  10. #10
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 103
    Points : 120
    Points
    120
    Par défaut
    Salut,


    Il n'est pas du tout dans mon intention d'en rajouter et ce message sera ma dernière contribution à ce post...

    Citation Envoyé par Barbibulle
    Premiere remarque à faire : jj/mm n'est pas une date donc veux t elle trier par date comme elle le dit au debut et tronquer juste l'année ?
    Le probleme si on y refechi c'est qu'on optient pas le résultat voulu.
    c'est sûr...

    Citation Envoyé par Barbibulle
    Mais bon il n'y a rien de grave [....] Toi tu as mal compris le probleme et du coup n'a pas pas proposé la bonne solution..
    je le reconnais tout à fait, j'ai mal compris un problème mal exposé puisqu'il est nécessaire de l'interpréter, le traduire, le reformuler... et j'en passe...

    Citation Envoyé par Barbibulle
    Sur ce bon week end et merci de vos participations !
    Merci, de même

    je concluerai sur cette citation
    ce qui se conçoit bien s'énnonce clairement et les mots pour le dire vous viennent aisément
    @+
    Ce n'est pas parce qu'on pédale dans la semoule, qu'on est sûr de manger du couscous... (anonyme)

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 115
    Points
    115
    Par défaut
    Salut à vous tous,
    Un grand merci pour votre aide, maintenant ça fonctionne très bien.
    Jeankiki

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

Discussions similaires

  1. [SP-2010] Webpart de requêtes dans une liste sur plusieurs colonnes (dates)
    Par Eka_T dans le forum SharePoint
    Réponses: 6
    Dernier message: 09/02/2015, 15h03
  2. [AC-2003] Requete qui écrit dans une table dont un champ est un format personnalisé
    Par ostrich95 dans le forum Requêtes et SQL.
    Réponses: 30
    Dernier message: 19/03/2014, 14h21
  3. Réponses: 2
    Dernier message: 19/10/2010, 08h20
  4. Réponses: 4
    Dernier message: 29/09/2010, 15h38
  5. tri dans un dataview sur un champ numeric
    Par dietrich dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 10/05/2007, 10h45

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