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. #1
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut Requête SQL !=
    Bonjour à tous, voilà je veux faire une requête SQL mais impossible de l'exécuter

    Là voici :

    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() ;
    Et voici mon erreur :
    Erreur de syntaxe (opérateur absent)
    Je comprends pas trop pourquoi il ne me le prend pas, la valeur date_relance est de type "texte".

    Une idée ?

    Merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    Salut

    Sans çà :

    QClassement->SQL->Add("AND Appels_tbl.date_relance != '' ");


    c est ok ?

    Sinon essaye le not in

    QClassement->SQL->Add("AND Appels_tbl.date_relance NOT IN ('') ");

    !!!! peut etre echapper les parentheses

    Sinon essaye de donner une valeur par defaut , genre zero à ton champ relance , c est peut etre çà qui coince

    Eventuellement ajoutes aussi les clauses order , group
    order by Appels_tbl.date_relance
    group by Appels_tbl.date_relance
    desc

    Fais voir egalement la structure de tes deux tables

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    QClassement->SQL->Add("AND Appels_tbl.date_relance NOT IN ('') ");

    ça marche impeccable merci

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    Yep bon je repose une question ici pour pas ouvrir un autre topci :

    Voilà j'ai une colonne "Date de relance" dans ma table "Appels_tbl" que j'ai mis du type "Texte" pour m'éviter une multitude de problèmes ~~

    Seulement j'aimerai trier ma colonne "Date de relance" de la date la + récente à la plus ancienne.
    Toutes mes dates sont de la forme jj/mm/aaaa.

    Car si je fais un ORDER BY relancer_le
    mon classement ce fait selon le jour et non la date complète..

    Comment puis-je faire ?

    Merci

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    order by Appels_tbl.date_relance
    group by Appels_tbl.date_relance
    desc

    Ce que je t avais mis au dessus

    Parcontre question comment tu concatenes ta chaine , je presume que tu t'y prends mal

    En effet il faut inserer ta chaine ainsi AAAAMMJJ , en obbligeant les mois et jours à etre à deux chiffres .
    Sinon utilises une colonne type date ou ma foi à l ancienne et moins joli , un champ distinct pour l année , le mois et le jour .

    En y reflichissant bien , les americains ont raison d ecrire la date ainsi

    Voilà

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    Effectivement ça ne marche pas :/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      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, Clients_tbl.mail ");
      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 NOT IN ('') ");
      QClassement->SQL->Add("ORDER BY Appels_tbl.date_relance ");
      QClassement->SQL->Add("GROUP BY Appels_tbl.date_relance ");
      QClassement->SQL->Add("DESC") ;
      QClassement->ExecSQL() ;
      QClassement->Open() ;
    Avec toujours l'erreur
    Erreur de syntaxe (opérateur absent)
    Disons que je travail avec tout en type de données "texte" et pour la date c'est l'utilisateur qui l'a remplie toujours de façon JJ/MM/AAAA en remplissant bien les les chiffres pour le jour et mois.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    Essayes de poster ta requete directement dans l interface serveur

    C est quoi ton serveur dejà ?

    Bizarre que rajouter 3 clauses empechent la requete d aller au bout

    Postes tes structures de tables , avec un max de precision , on visualise mieux

    Là tu utilises des composants ? Lesquels ? As tu essayé avec l api ? C est pas plus compliqué

    Edit :

    J ai testé vite fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      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, Clients_tbl.mail ");
      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 NOT IN ('') ");
      QClassement->SQL->Add("ORDER BY Appels_tbl.date_relance ");
      QClassement->SQL->Add("asc") ;
      QClassement->ExecSQL() ;
      QClassement->Open() ;
    Faut enlever le group by ici et plutot utiliser asc car je pense logiquement qu on preferera relancer les dates les plus proches

    Voilà ce que fait un group by
    mysql> SELECT year, country, product, SUM(profit)
    -> FROM sales
    -> GROUP BY year, country, product WITH ROLLUP;
    +------+---------+------------+-------------+
    | year | country | product | SUM(profit) |
    +------+---------+------------+-------------+
    | 2000 | Finland | Computer | 1500 |
    | 2000 | Finland | Phone | 100 |
    | 2000 | Finland | NULL | 1600 |
    | 2000 | India | Calculator | 150 |
    | 2000 | India | Computer | 1200 |
    | 2000 | India | NULL | 1350 |
    | 2000 | USA | Calculator | 75 |
    | 2000 | USA | Computer | 1500 |
    | 2000 | USA | NULL | 1575 |
    | 2000 | NULL | NULL | 4525 |
    | 2001 | Finland | Phone | 10 |
    | 2001 | Finland | NULL | 10 |
    | 2001 | USA | Calculator | 50 |
    | 2001 | USA | Computer | 2700 |
    | 2001 | USA | TV | 250 |
    | 2001 | USA | NULL | 3000 |
    | 2001 | NULL | NULL | 3010 |
    | NULL | NULL | NULL | 7535 |
    +------+---------+------------+-------------+

  8. #8
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    Donc mon serveur est un serveur sous Access,
    j'utilise donc TDataBAse, TTable, TQuery, TDataSource et TBGrid.

    J'ai testé ta solution en supprimant le GROUP BY mais là encore il me classe par jour le plus proche est non la date entière.

    Faut que je trouve un moyen pour qu'il trie avec le sytème suivant JJ/MM/AAAA.

    Je te mets en screen mes 2 tables que j'utilise ainsi que l'arborescence de mon programme :

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    Question : C est une maintenance de l application ou sa creation ?
    Question 2 : Les tables sont elles remplies à base d exemple uniquement ?
    Question 3 : A quoi ressemble ton formulaire pour rentrer cette fameuse date de relance ? 3 edit consecutifs ?

    Relis ce passage

    En effet il faut inserer ta chaine ainsi AAAAMMJJ , en obbligeant les mois et jours à etre à deux chiffres .
    Sinon utilises une colonne type date ou ma foi à l ancienne et moins joli , un champ distinct pour l année , le mois et le jour .

  10. #10
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    1 ) C'est la création de l'application pour l'entreprise de mon beau-frère

    2 ) Pour remplir les bases j'ai suivi ce tuto là : http://lberne.developpez.com/bcb/paradox/

    3 ) La date de relance, c'est tout simplement la personne qui va appeler un client, si celui-ci est indisponible la personne rentre dans un TEdit la date à laquelle elle va rappeler le client. Et pour que ce soit plus instructif j'ai opté pour l'option date du type : JJ/MM/AAAA. Il n'y a donc qu'un TEdit pour la date de relance.

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    Ce n est que mon avis mais bon pour simplifier

    Crees 3 combobox
    1 contenant les années aaaa
    1 contenant les mois mm
    1 cotenant les jours jj

    Concatenes ta chaine ainsi aaaammjj avant d inserer ta date dans ta table

    Le reel probleme c est qu à l insertion ta date n est pas utilisable en son etat , il suffit d y remédier de cette maniere tres simple .

    Ou alors de stocker ta requete dans une stringlist , de manipuler ta valeur date et d afficher ensuite mais à mon humble avis , le coup des combobox sera plus facile

    Ou encore expliquer à l utilisateur qu il faut rentrer la date de cette maniere

    Honnetement , t aurais du t orienter vers sql , mysql ou sqlite , surtout mysql par exemple que je connais bien qui t aurait permis dans ton cas de creer une base temporaire le temps de traiter ta requete

  12. #12
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    hum hum quelle galère juste pour trier une date !

    Donc si je suis ce que tu m'as dit, j'ai 3 ComboBox, un pour le jour, suivi de celui pour le mois puis celui pour le jour.
    Mais pourquoi des ComboBox ? 3 TEdit ne suffisent pas ? Car avec les ComboBox je mets quoi comme options ?

    (cf voir fichier joint)

    Et donc si je fais ça, j'aurai dans ma table non plus des données du type JJ/MM/AAAA mais AAAAMMJJ

    Par exemple j'ai 2 dates de relance qui sont 27/10/2009 et 01/11/2009, on est bien d'accord que 27/10/2009 < 01/11/2009 sauf que mon programme affiche :
    01/11/2009 < 27/10/2009 car il compare juste le 01 et 11...

    Et sous la forme AAAAMMJJ ça marche comment ?

  13. #13
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    Personne n'a une idée pour trier une date du format JJ/MM/AAAA alors ?

    Tant pis je vais essayer de trouver une autre solution ..

  14. #14
    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,

    Je n'ai pas Access sous la main, mais ceci pourrait p'tet marcher ? (en dehors d'utiliser directement des champs date/heure dans le base )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      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, Clients_tbl.mail ");
      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 NOT IN ('') ");  // "AND Appels_tbl.date_relance is not null" ?????
      QClassement->SQL->Add("ORDER BY CDate(Appels_tbl.date_relance) DESC ");
      QClassement->SQL->Add("GROUP BY Appels_tbl.date_relance ");
      QClassement->ExecSQL() ;
      QClassement->Open() ;

  15. #15
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    Yep !

    J'ai testé ton code mais j'ai une erreur :

    Erreur de syntaxe dans la clause ORDER BY
    A noter que dans ma table la colonne date_relance est du type Texte et qu'elle sera toujours sous la forme JJ/MM/AAAA avec toujours 2 chiffres pour le jour et le mois (01/05...).

  16. #16
    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
    Oups, déchirure: faut inverser les clauses 'group by' et 'order by'.
    D'autre part, je vois pas trop à quoi te sers le group by' (cf cet article)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      QClassement->Close() ;
      QClassement->SQL->Clear() ;
      QClassement->SQL->Add("SELECT DISTINCT CDate(Appels_tbl.date_relance), 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, Clients_tbl.mail ");
      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 NOT IN ('') ");  // "AND Appels_tbl.date_relance is not null" ?????
      QClassement->SQL->Add("ORDER BY CDate(Appels_tbl.date_relance) DESC ");
      QClassement->ExecSQL() ;
      QClassement->Open() ;

  17. #17
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    Yo en effet le ORDER BY ne servait à rien et le résultat marche !

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      QClassement->Close() ;
      QClassement->SQL->Clear() ;
      QClassement->SQL->Add("SELECT DISTINCT CDate(Appels_tbl.date_relance), 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, Clients_tbl.mail ");
      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 IS NOT NULL ");
      QClassement->SQL->Add("ORDER BY  CDate(Appels_tbl.date_relance) ASC ");
      QClassement->ExecSQL() ;
      QClassement->Open() ;
    J'ai changé le DESC en ASC et il m'affiche bien la date dans l'ordre :
    - 27/10/2009
    - 28/10/2009
    - 01/11/2009
    - 05/11/2009
    - 31/10/2010
    !!

    Merki

  18. #18
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    Lol Spike
    Bien vu le cdate

    <joke>T as des problemes de vue ?</joke>

    Faut enlever le group by ici et plutot utiliser asc car je pense logiquement qu on preferera relancer les dates les plus proches

    http://www.developpez.net/forums/d82...l/#post4742574

    Sinon quand tu as des soucis de ce genre , utilises autant de combo ou edit que de champs necessaire dans la tanle , c est rapide , pas besoin de chercher à mettre en oeuvre une fonction , ... et c est traité quasi aussi vite

    Bon WE

  19. #19
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    C'est plutôt totoche76 qui m'a trouvé l'astuce du CDate (d'ailleurs je comprends pas trop comment ça marche..).

    Pour le ASC c'est à force de trifouiller mon code que j'ai pas vu dans quel sens le tri se faisait, et je risque de faire quelques manipulations sur les dates donc j'essaie d'avoir le moins de TEdit possible pour alléger l'IHM.

    En tout cas sa marche impeccablement, merci à vous deux

  20. #20
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    Au fait cette instruction ne marche pas, quelqu'un sait pourquoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      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() ;
    Il ne m'affiche rien dans mon DBGrid...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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