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 :

Requête SQL !=


Sujet :

C++Builder

  1. #21
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Hello,

    Au fait cette instruction ne marche pas, quelqu'un sait pourquoi ?
    Encore une fourberie d'Access (comme pour CDate, qui lui est spécifique)...
    Peut-être ceci, au format de la date près (essaye tes requêtes d'abord dans Access... )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QClassement->SQL->Add("AND CDate(Devis_tbl.date_intervention) < #" + MaDate + "#");

  2. #22
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    Sacrées fourberies d'Access

    Bon sinon il ne m'affiche toujours rien !

    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
      TDateTime d(Now());
      String MaDate=d.DateString();
    
      QClassement->Close() ;
      QClassement->SQL->Clear() ;
      QClassement->SQL->Add("SELECT DISTINCT CDate(Devis_tbl.date_intervention), Devis_tbl.date_intervention, Clients_tbl.id,Devis_tbl.id, Clients_tbl.Nom, Clients_tbl.Prenom, Clients_tbl.rue, Clients_tbl.code_postal, Clients_tbl.ville, Clients_tbl.fixe, Clients_tbl.portable, Clients_tbl.mail ");
      QClassement->SQL->Add("FROM  devis_tbl, clients_tbl  ") ;
      QClassement->SQL->Add("WHERE Devis_tbl.id = Clients_tbl.id ") ;
      QClassement->SQL->Add("AND Devis_tbl.date_intervention IS NOT NULL ") ;
      QClassement->SQL->Add("AND Devis_tbl.date_intervention NOT IN ('') ") ;
      QClassement->SQL->Add("AND Devis_tbl.est_valide ='oui' ");
      QClassement->SQL->Add("AND CDate(Devis_tbl.date_intervention) < #" + MaDate + "# ");
      QClassement->SQL->Add("ORDER BY  CDate(Devis_tbl.date_intervention) ASC ") ;
      QClassement->ExecSQL() ;
      QClassement->Open() ;
    Est-ce qu'il n'arrive pas à comparer le type CDate et le String ?

  3. #23
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    Yop, bon voilà impossible d'effectuer cette requête UPDATE sur ma table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      String commentaire = Ed_commentaire_appels->Text ;
      String GetIdApp = Ed_Id->Text ;
      String GetIdAppel = Ed_id_appel->Text;
     
    	QAppels->Close();
    	QAppels->SQL->Clear();
    	QAppels->SQL->Add("UPDATE appels_tbl ");
    	QAppels->SQL->Add("SET appels_tbl.commentaire='"+commentaire+"' ");
    	QAppels->SQL->Add("WHERE appels_tbl.id ='"+GetIdApp+"' ");
    	QAppels->SQL->Add("AND appels_tbl.id_appel='"+GetIdAppel+"'") ;
    	QAppels->ExecSQL() ;
    Voici l'erreur :
    Type de données incompatibles dans l'expression du critère.'.
    Je suis sous Borland 2009 et ma base de données Access 2007.

    Mes valeurs de commentaire, id et id_appel correspondent bien à une ligne de ma table appels_tbl.

    Qu'est-ce qui ne va pas dans ma requête ?

  4. #24
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    C'est bon j'ai trouvé, voici l'instruction correcte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	QAppels->Close();
    	QAppels->SQL->Clear();
    	QAppels->SQL->Add("UPDATE appels_tbl ");
    	QAppels->SQL->Add("SET appels_tbl.commentaire='"+commentaire+"' ");
    	QAppels->SQL->Add("WHERE appels_tbl.id ="+GetIdApp+" ");
    	QAppels->SQL->Add("AND appels_tbl.id_appel="+GetIdAppel);
    	QAppels->ExecSQL() ;

  5. #25
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Concernant ta première question, je sais qu'Access 2003 n'accepte pas la syntaxe "!=" comme opérateur de différence. Il faut utiliser "<>" à la place, ce qui donne le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      QClassement->Close() ;
      QClassement->SQL->Clear() ;
      QClassement->SQL->Add("SELECT Appels_tbl.date_relance, Appels_tbl.id, Clients_tbl.id, Clients_tbl.Nom, Clients_tbl.Prenom, Clients_tbl.rue, Clients_tbl.code_postal, Clients_tbl.ville, Clients_tbl.fixe, Clients_tbl.portable ");
      QClassement->SQL->Add("FROM  Appels_tbl, clients_tbl  ") ;
      QClassement->SQL->Add("WHERE Appels_tbl.id = Clients_tbl.id ") ;
      QClassement->SQL->Add("AND Appels_tbl.date_relance <> '' ");
      QClassement->ExecSQL() ;
      QClassement->Open() ;
    Pour la seconde partie, qui concerne la représentation des dates, il est effectivement délicat de choisir une représentation ou une autre. Mon expérience m'a montré beaucoup de soucis avec la représentation au format date dans la base car le format affiché par la suite dépend des paramètres de l'utilisateur (je suis en Suisse, format "jj.mm.aaaa" et j'ai eu des surprises en distribuant mon application en France, format "jj/mm/aaaa").

    Je suis donc arrivé à la conclusion qu'il fallait utiliser un format indépendant des paramètres pour le stockage des données et le convertir ensuite en une date compréhensible par l'utilisateur.

    J'ai choisi le format ISO 8601:1988 "yyyymmddThhmmssmmm" (année, mois, jour, 'T', heure, minute, seconde, milliseconde). Il existe une nouvelle version de ce standard: ISO 8601:2000.

    Les avantages sont les suivants:
    1) L'ordre décroissant des années aux millisecondes permet de trier facilement les date dans l'ordre chronologique (ce qui t'embête justement avec les JJ/MM/AAAA)
    2) Il est facile de comparer deux dates
    3) La lecture par un humain est suffisamment aisée pour l'administration (et la version 2000 de 8601 est meilleure sur ce point: YYYY-MM-DDThh:mm:ss)
    4) Le format est indépendant des paramètres régionaux de l'ordinateur

    Les désavantages:
    1) Tu dois convertir toutes les dates avant de les afficher dans ton programme... Et idem pour convertir les dates au format ISO.

    Voici les fonctions que j'utilise pour ces deux conversions (elles peuvent avoir des erreurs car je les ai extraites d'un code plus complet):

    Conversion ISO --> TDateTime:
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    TDateTime AsTDateTime(char* string,TDateTime defValue,bool raiseExceptionInstead=false) {
     
        if ((strlen(string)==18)&&(string[8]=='T'))) {
          // ISO Format: yyyymmddThhmmssmmm
          int year=MidToI(*this,0,4);
          int month=MidToI(*this,4,2);
          int day=MidToI(*this,6,2);
          int hours=MidToI(*this,9,2);
          int minutes=MidToI(*this,11,2);
          int seconds=MidToI(*this,13,2);
          int millisecs=MidToI(*this,15,3);
          return TDateTime(year,month,day,hours,minutes,seconds,millisecs);
        } 
     
        // Invalid format: test if the user request raising of an exception
        if (exception) {
          throw 1;
        } 
     
         // Return default value
         return defValue
     
    }
     
    int MidToI(const char* source, uint left, int len) {
     
        uint size=strlen(source);
        // Error it the left parameter is too big compared to the string length
        if (left>=size) return -1;
     
        // Adjust substring length if there are not enough chars to return
        if ((left+len>size)||(len<0)) len=size-left;
     
        // Extract the substring
        char* newString=new char[len+1];                 // Create target string
        strncpy(newString,source+left,len);              // Copy substring
        newString[len]='\0';                                   // End the string
     
        // Convert the resulting substring
        int result=atoi(newString);
     
        // Free memory
        delete[] newString;         
        return result;                                  // Return the substring
     
      }
    Et conversion d'un TDateTime au format ISO:
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    AnsiString ISODate(TDateTime value) {
     
        // Split date/time object into its parts
        unsigned short year,month,day,hours,minutes,seconds,msecs;
        value.DecodeDate(&year,&month,&day);
        value.DecodeTime(&hours,&minutes,&seconds,&msecs);
     
        // Convert into a string
        // Format is "YYYYMMDDTHHMMSSMMM";
        AnsiString result;       
        result=FormatString(20,"%04d%02d%02dT%02d%02d%02d%03d",
                                   year,month,day,hours,minutes,seconds,msecs);
     
     
        return result;
     
      }
     
    AnsiString FormatString(int bufferSize,const char* format,...) {
     
     
      // Extract paramters
      va_list argList; va_start(argList,format);
     
      // Create buffer
      const size_t maxSize=maxSize*sizeof(TCHAR);
      char *buffer=new char[maxSize];
     
      try {
        // The result of the call to the API
        HRESULT apiResult;
     
        // Format the string
        apiResult=StringCbVPrintfEx(
          buffer,                                       // LPTSTR pszDest,
          maxSize,                                      // size_t cbDest,
          NULL,                                         // LPTSTR *ppszDestEnd,
          NULL,                                         // size_t *pcbRemaining,
          STRSAFE_IGNORE_NULLS|STRSAFE_NULL_ON_FAILURE, // DWORD dwFlags,
          format,                                       // LPCTSTR pszFormat,
          argList                                       // va_list argList
        );
     
        // Check if error
        if (FAILED(apiResult)) {
          // An error occurs while formating the string
          buffer[0]='\0';
        }
     
     
      } catch(...) {};
     
      // Delete the list of arguments
      va_end(argList);
     
      // Convert buffer into AnsiString
      AnsiString result=buffer;
      delete[] buffer;
      return result;
     
    }
    Tu peux ensuite facilement convertir les TDateTime en date lisibles par un humain ou l'utiliser directement dans un TDateTimePicker pour ton application:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       AnsiString myDateField=...;                                     // Lire le champ
       TDateTime myDate=ISODate(myDateField.c_str(),Now()); // Le convertir en TDateTime
       DateTimePicker1->DateTime=myDate;                 // Utiliser dans un TDateTimePicker
       AnsiString humanReading=myDate.DateString();
     
      // Sauver la date actuelle dans ta base:
      myDate=Now();
      AnsiString isoDate=ISODate(myDate);
      ... // Sauver isoDate dans ta base
    J'espère que ça te sera utile.

  6. #26
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    J'avoue que la gestion des dates c'est assez chiant, mais la solution donnée plus haut marche pour trier mes dates de la plus récente à la plus ancienne sous la forme (JJ/MM/AAAA). Ce qui me suffit bien pour l'instant, mais je garde ton code sous la main car il me sera utile surement dans quelques temps.

    En tout cas c'est galère la gestion des dates

    Merci bien

  7. #27
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Oui, je te l'ai mis pour des raisons "théoriques".

    Bon courage

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Requête SQL
    Par Leludo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/07/2024, 15h41
  2. [ DB2 ] [ AS400] requête sql
    Par zinaif dans le forum DB2
    Réponses: 6
    Dernier message: 23/08/2008, 19h42
  3. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  4. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26
  5. PB requète SQL avec Interbase
    Par missllyss dans le forum InterBase
    Réponses: 2
    Dernier message: 15/07/2003, 11h37

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