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

Langage Delphi Discussion :

Comparer deux dates


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Par défaut Comparer deux dates
    Bonjour à nouveau !!

    Encore une petite question delphi :

    J'ai deux champs TmaskEdit où l'utilisateur saisit une date de départ et une date de retour...
    Malheureusement si je prend un masque de saisie Date Longue jj/mm/aaaa cela me met une erreur : "ORA 01858 caractère non numérique trouvé à la place d'un caractère numérique" au moment de mon ajout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        oqAjoutSav.Close;
        oqAjoutSav.SQL.Clear;                                                                                             // SEQ_NUMSUIVI permet de récupérer le numéro de suivi suivant relatif à la table SUIVISAV
        // on ajoute un SAV                                                                                              // mais possible grâce à une séquence Oracle SEQ_NUMSUIVI qui s'auto-incrémente
        oqAjoutSav.SQL.Add('INSERT INTO suivisav (numsuivi, numrma, datedepart, dateretour, nomscan, commentaire) VALUES (SEQ_NUMSUIVI.NEXTVAL, :numerorma, :datededepart, :datederetour, :lenomscan, :com)');
        oqAjoutSav.DeclareAndSet('numerorma', otString, uppercase(zsNumRma.Text));
        oqAjoutSav.DeclareAndSet('datededepart', otString, zsDateDep.Text);
        oqAjoutSav.DeclareAndSet('datederetour', otString, zsDateRetour.Text);
        oqAjoutSav.DeclareAndSet('lenomscan', otString, nomDuScan);
        oqAjoutSav.DeclareAndSet('com', otString, zsCommentaires.Text);
        oqAjoutSav.Execute;
        oqAjoutSav.Session.Commit;
    Cependant cela me permettrait d'empêcher l'utilisateur de saisie des caractères non numériques.
    Et deuxième partie de mon problème je veux pouvoir comparer deux dates pour alerter l'utilisateur si la date de retour est inférieure ou égale à la date de départ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        testDates := CompareText(zsDatedep.Text, zsDateRetour.Text);
        if (testDates > 0) or (testDates = 0) then
          begin
          ShowMessage('Date de retour inférieure ou égale à la date de départ');
          erreurDate := True;
          end
    Cependant ce code ne fonctionne pas cela fait qu'une comparaison jours donc si
    Date Départ = 15/01/2011
    Date Retour = 01/02/2011
    Cela me déclenche le message d'erreur via le ShowMessage...

    Help please je sais plus quoi faire après avoir démonter et remonter plusieurs fois mon code..

    Merci d'avance

  2. #2
    Membre Expert
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Par défaut
    pourquoi changer les dates en texte ?

    les dates sont des valeurs numériques. Aussi en comparant directement ces dates on a cette information.

    NB : pourquoi avoir dans le SGBD les colonnes de date dans un format alphanumérique et non pas un format date (plus facilement manipulable) ?

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    Ah les formats Date tout un programme..


    Citation Envoyé par juju1988 Voir le message
    Bonjour à nouveau !!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        testDates := CompareText(zsDatedep.Text, zsDateRetour.Text);
        if (testDates > 0) or (testDates = 0) then
          begin
          ShowMessage('Date de retour inférieure ou égale à la date de départ');
          erreurDate := True;
          end
    SI tu compare des dates au format TEXT tu ne pourras que tester l'égalité Date1 = Date2.

    Maintenant si tu compare des dates le mieux serais d'avoir des TDateTime et non des String, si tu persisite avec le text il y a une solution tout bête tu inverse ta date.

    au lieu de comparer jj/mm/aaaa compare aaaa/mm/jj et tu n'auras aucun problème.

    a+

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Par défaut
    Un TMaskEdit pour gérer des dates, c'est un peu tordu. Passe par un DateTimePicker et tu n'auras plus de problème avec tes dates.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Par défaut
    Ok merci pour vos réponses je suis entrain de mettre en place des TDateTimePicker mais comment faire pour n'avoir que la date ?? J'utilise pourtant des .Date

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Par défaut
    Je ne comprends pas ?

    Avec ça...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if DateTimePicker.Date > Now then
     ... // Retour vers le futur
    ...tu n'as que la date !

    Après si c'est dans la BDD, ça dépend du type de la BDD et du type de champ que tu as déclaré !?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Par défaut
    Ben oui j'utilise zsDateDepart.Date mais ça m'ajoute la date + heure dans mon dbgrid et ma base de données.
    C'est une base de données Oracle et mon champ est de type Date...

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 101
    Par défaut

    ComCtrls.TDateTimePicker.Kind
    et ComCtrls.TDateTimeKind
    ou
    ComCtrls.TDateTimePicker.DateFormat

    Pour ORACLE, tu as DATE pour le stockage qui est un format numérique totalement spécifique !
    utilise TO_DATE et TO_CHAR pour les conversions !
    Oracle est surement LA db la plus pénible pour ce type !
    Lors d'une migration BDE\Paradox vers ADO\Oracle, la gestion des Dates a été la plus chiante surtout que paradox pouvait stocker 00/00/0000 qui plante totalement ORACLE !

    Pour le Champ, tu as TDateTimeField qui fourni DisplayFormat, tu peux par exemple dans le AfterOpen affecté un DisplayFormat 'dd/mm/yyyy' ainsi la DBGrid n'affichera que la Date !

    Dans le BeforePost, tu peux tronquer le Champ en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Field.AsDateTime := DateOf(Field.AsDateTime);
    DateOf de DateUtils
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Par défaut
    Le Kind est bien à dtkDate et le DateFormat à dfShort...

    Et voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        oqAjoutSav.Close;
        oqAjoutSav.SQL.Clear;                                                                                             // SEQ_NUMSUIVI permet de récupérer le numéro de suivi suivant relatif à la table SUIVISAV
        // on ajoute un SAV                                                                                              // mais possible grâce à une séquence Oracle SEQ_NUMSUIVI qui s'auto-incrémente
        oqAjoutSav.SQL.Add('INSERT INTO suivisav (numsuivi, numrma, datedepart, nomscan, commentaire) VALUES (SEQ_NUMSUIVI.NEXTVAL, :numerorma, :datededepart, :lenomscan, :com)');
        oqAjoutSav.DeclareAndSet('numerorma', otString, uppercase(zsNumRma.Text));
        oqAjoutSav.DeclareAndSet('datededepart', otDate, zsDateDep.Date);    oqAjoutSav.DeclareAndSet('lenomscan', otString, nomDuScan);
        oqAjoutSav.DeclareAndSet('com', otString, zsCommentaires.Text);
        oqAjoutSav.Execute;
        oqAjoutSav.Session.Commit;
    Comment puis-je gérer ? Je vais tester avec le DateOf

    EDIT : ça fonctionne avec le DateOf SUPER merci Shai !!

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

Discussions similaires

  1. Comment comparer deux dates
    Par vodevil dans le forum Modules
    Réponses: 6
    Dernier message: 01/09/2005, 18h24
  2. comparer deux dates
    Par adel25 dans le forum C++
    Réponses: 3
    Dernier message: 23/08/2005, 20h29
  3. Comparer deux dates
    Par LoicH dans le forum C++Builder
    Réponses: 4
    Dernier message: 04/03/2005, 22h53
  4. comment comparer deux dates?
    Par billoum dans le forum C++Builder
    Réponses: 2
    Dernier message: 21/08/2004, 21h08

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