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

C++Builder Discussion :

filtrer les données entre 2 dates


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2008
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 335
    Par défaut filtrer les données entre 2 dates
    Bonjour
    je cherche quelqu’un qui peut m'aider pour trouver le problème qui existe dans ce code.
    je veut filtrer les données qui existes entre deux date,
    le type de champ Date Texte et le masque de saisie date,abrégé.
    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
    Date2 = DateTimePicker1->Date;
    Date3 = DateTimePicker2->Date;
    Form2->Table1->First();
    if(!Form2->Table1->Eof)
     
     {
     
     
     Form2->Table1->Close();
      AnsiString a;
      a="select* FROM PEC  where Date <= " +Date3+" AND "+"Date >= " +Date2+" Order By N°Ord ASC" ;
      Form2->Query1->SQL->Clear();
      Form2->Query1->SQL->Add(a);
      Form2->Query1->ExecSQL();
      Form2->Table1->Open();
    }

  2. #2
    Membre expérimenté
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Par défaut
    Je vais te dire comment ce que je suggère à mes étudiants pour qu'ils trouvent eux-mêmes ce genre de problème.

    Je leur suggère de faire un ShowMessage de la commande SQL. 80% du temps, il voit l'erreur tout de suite.(ils peuvent aussi mettre un point d'arrêt avec le debugger, quand ils sont familiers avec le debugger, c'est plus rapide).

    S'il me disent que tout leur semble ok, je leur réponds de tester la commande avec SQL Query Browser.

    Si ça fonctionne avec SQL Browser, c'est qu'il y a un problème qui les dépasse, alors je m'assis avec eux, mais c'est relativement rare.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Par défaut
    fainiette, il y a des choses qui me font tiquer dans ton code: Tu utilises "ExecSQL" ET "Open()" à la fois. En plus, tu ne fermes pas la requète précédente*

    "ExecSQL" c'est pour des commandes SQL qui ne retourne rien (INSERT, DELETE,UPDATE) et "Open" c'est pour une requête (SELECT). Si je ramène ça à une fonction plus générale, ça ressemble à quelque chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void SQL_Execute(TQuery* query, AnsiString sqlCmd, bool isSelect)
    {
      query->Close() ; // fermer requete précédente, pas d'effet si déjà fermé
      query->SQL->Clear() ;
      query->SQL->Add(sqlCmd) ;
      if (isSelect)
        query->Open() ;
      else
        query->ExecSQL() ;
    }
    * "Open" appelle probablement "Close" pour le ré-ouvrir, mais bon, c'est mieux de ne rien prendre pour acquis.

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2008
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 335
    Par défaut
    Bonjour,
    merci Guyt54
    le problème que j'ai rencontrée dans le résultat du code , en effet ce dernier filtre les données que par le jour et ne pas par toute la date.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Par défaut
    Excuse-moi, faniette, j'avais mal compris la question , il reste que ton bug est dans la commande SQL et tu le verrais avec un "ShowMessage".

    Faut mettre les dates comme ça en SQL:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE Date <= '2012-02 bla bla'
    et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE Date <= 2012-02 bla bla
    ps: t'as vraiment un champ qui s'appelle "N°Ord"?. je suis surpris que ça passe en SQL, mais bon, on en apprend tous les jours.

  6. #6
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    Oula Oula

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    Date2 = DateTimePicker1->Date;
    Date3 = DateTimePicker2->Date;
    Date2 et 3 sont de type TDate et non pas des Ansitring ou Unicode String

    soit dans ta base c'est le format TDate qui est employé pour le champ date , soit si c'est un type string tu dois transformer ta valeur TDate en Valeur équivalente à ton Champ, La VCL offre beuacoup de possibilités pour ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Form2->Table1->First();
    if(!Form2->Table1->Eof)
    ceci est parfaitement inutile car la requête Select se fait sur l'entier de la ou les tables mentionnées dans ta requëte


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
     Form2->Table1->Close();
      AnsiString a;
      a="select* FROM PEC  where Date <= " +Date3+" AND "+"Date >= " +Date2+" Order By N°Ord ASC" ;
      Form2->Query1->SQL->Clear();
      Form2->Query1->SQL->Add(a);
      Form2->Query1->ExecSQL();
      Form2->Table1->Open();
    lors d'une requête on utilise en principe la méthode open et non pas la méthode ExecSQL()
    si le mombre d'éléments retournés est grand il peut-être utile de préparer la commande SQL (->Prepare())

    N°Ord : n'est pas valide en SQL

    en espérant t'avoir été utile
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

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

Discussions similaires

  1. [WD17] Filtrer les données d'une colonne entre 2 dates (hfiltre en gros)
    Par franck34matlab dans le forum WinDev
    Réponses: 3
    Dernier message: 08/02/2015, 23h13
  2. SQL*Loader : filtrer les données chargées
    Par gattaca dans le forum Oracle
    Réponses: 2
    Dernier message: 13/07/2006, 09h51
  3. [Dates] Les mois entre deux dates
    Par kagura dans le forum Langage
    Réponses: 2
    Dernier message: 28/06/2006, 11h38
  4. comment transférer les données entre 2 pc?.
    Par unix27 dans le forum Administration
    Réponses: 12
    Dernier message: 10/04/2006, 07h48
  5. [JTABLE]trier et filtrer les données d'une jTable
    Par mehdi82 dans le forum Composants
    Réponses: 4
    Dernier message: 15/12/2005, 17h59

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