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 :

Requetes 2 tables, count, as,group by


Sujet :

C++Builder

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 71
    Points : 45
    Points
    45
    Par défaut Requetes 2 tables, count, as,group by
    Bonjour,

    dans mon application j'essaie de grouper et d'afficher des statistiques sur les mouvements du personnel en appliquant une requete sur 2 tables de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ADOConnection1->Open();
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add("select m.EntiteOrigine as Entité,(count(m.Matricule)+count(p.Matricule)) as [Désirants Entrer]");
    ADOQuery1->SQL->Add("from Mutations m, Permutations p");
    ADOQuery1->SQL->Add("where D_Etablis like"+Edit1->Text+" group by m.EntiteOrigine");
     
    ADOQuery1->Prepared=true;
    ADOQuery1->Open();
    ADOQuery1->Close();
    ADOConnection1->Close();
    une erreur m'indique qu'il y a faute de syntaxe dans la clause FROM.

    j'ai donc essayé en utilisant les noms complet des tables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ADOConnection1->Open();
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add("select Mutations.EntiteOrigine as Entité,(count(Mutations.Matricule)+count(Permutations.Matricule)) as [Désirants Entrer]");
    ADOQuery1->SQL->Add("from Mutations,Permutations");
    ADOQuery1->SQL->Add("where D_Etablis like"+Edit1->Text+" group by Mutations.EntiteOrigine");
     
    ADOQuery1->Prepared=true;
    ADOQuery1->Open();
    ADOQuery1->Close();
    ADOConnection1->Close();
    La meme erreur s'affiche.
    quelqu'un voit-il où est l'erreur? et comment m'en debarasser?

    Merci

  2. #2
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Est-ce que comme ça ca fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ADOQuery1->SQL->Add("select m.EntiteOrigine as Entite," );
    ADOQuery1->SQL->Add("(count(m.Matricule)+count(p.Matricule)) as Desirants_Entrer" );
    ADOQuery1->SQL->Add("from Mutations m, Permutations p");
    ADOQuery1->SQL->Add("where D_Etablis like " + QuotedStr(Edit1->Text) );
    ADOQuery1->SQL->Add("group by m.EntiteOrigine" );
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

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

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

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

    Cette ligne me parait douteuse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ADOQuery1->SQL->Add("where D_Etablis like"+Edit1->Text+" group by Mutations.EntiteOrigine");
    Essaye plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ADOQuery1->SQL->Add("where D_Etablis like '"+Edit1->Text+"' group by Mutations.EntiteOrigine");
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ADOQuery1->SQL->Add("where D_Etablis like \""+Edit1->Text+"\" group by Mutations.EntiteOrigine");
    Après, quelques questions:
    - Tu as préfixé les noms de tous tes champs, sauf pour D_Etablis. Dans quelle table se trouve-t'il ?
    - Tu as 2 tables dans ta requête, mais aucune jointure entre les 2. Est-ce normal ?
    - As-tu essayé ta requête directement dans Access (c'est bien Access que tu utilises, non ?) ?

    Un truc que tu peux faire: mettre un TMemo sur ta fiche, et le remplir avec le code de ta requête, genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monMemo->Lines->Text = ADOQuery1->SQL->Text;
    Ensuite tu copie-colles le contenu de ton Memo dans Access, et tu y exécutes la requête...

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    d'abord merci pour vos propositions
    puis comment cette requete peut ellemarcher dans access alors qu'elle inclut une variable(le text du TEdit)?
    puis supposant que ça marche s'il on remplace la variable par une valeur donnée.... y a t il un moyen pour importer la requete à partir d'Access pour la faire fonctionner sur c++ builder?
    j'espere que j'ai bien expliqué mon besoin

    Merci encore

  5. #5
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    Bsr,

    la requête qui sera dans le TMemo, sera le SQL généré donc normalement fonctionnel ds le SGBD cible.

    Et je suis d'accord sur le problème de l'absence de jointure...c'est étrange

    bye
    Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
    _ _ _ _ _ _ _ _ _

    La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
    _ _ _ _ _ _ _ _ _

    Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    j'ai essayé avec la jointure une un message d'erreur me signele que l'expression de jointure n'est pas supporter par le programme

    j'ai pensé à faire la jointure dans access et travailler sur la table resultante

    une meilleure idée??

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Citation Envoyé par nezhaaem Voir le message
    j'ai essayé avec la jointure une un message d'erreur me signele que l'expression de jointure n'est pas supporter par le programme

    j'ai pensé à faire la jointure dans access et travailler sur la table resultante

    une meilleure idée??
    Là je ne comprends pas tout....
    Est-ce que tu peux poster le code de la requête SQL correspondante ??
    j'ai pensé à faire la jointure dans access et travailler sur la table resultante
    Est-ce que tu peux préciser ??

    Déjà, est-ce que tu peux faire fonctionner ta requête dans Access ?? (quelle version d'Access, d'ailleurs ??)

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    pour la version d'access c 2007.
    quant à la requete plus la peine de la poster.
    j'ai changé la conception de ma base.
    j'avais un probleme de traduction dans la base de l'heritage dans le mcd.

    j'avais 6 tables qui avaient en commun un grand nombre de champs .
    maitenant j'ai une seule table avec un champs qui precise le role de l'enregistrement.

    j'espere que j'aurais plus de probleme avec cette conception !

    Merci pour tout

  9. #9
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    me voilà encore
    cette fois avec la nouvelle base j'ai executé la requete suivante dans access et ça donne le resultat voulu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT EntiteOrigine as Entité ,COUNT(D_Etablis) as n 
    FROM Mouvements
    WHERE D_Etablis LIKE '*2010'
    GROUP BY EntiteOrigine ;
    j'ai essayé avec un composant ADOQuery.j'ai affecté la propriété SQL avec la requete precedente
    le DBGrid donne deux colonnes Entité et n qui restent vides
    de plus il a un comportement bizzare: un grand espace est donné à la premiere colonne Entité ,et meme en elargissant le DBGrid je n'arrive à voir la colonne n que lorsque je defile avec la barre !


    à quoi est dû tout ça ???

  10. #10
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    je viens d'utiliser le RecordCount et ça donne 0 !

    donc c'est la requete qui ne donne pas d'enregistrement
    mais alors pourquoi les champs Entité et n figurent ils dans le DBGrid ??

    Help please! je me casse la tete et je ne sais pas si je suis dans le bon sens

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Essaye peut-être de faire un ->Last() sur ton TADOQuery avant de faire le ->RecordCount ??

  12. #12
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    ça donne toujours 0

  13. #13
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    cette fois j'ai creé la requete dans access et j'ai lié une ADOTable à la requête.

    j'ai lié un Datasource à ADOTable et une DBGrid à DataSource

    quand je met la propriété active de adotable dans l'inspecteur d'objet ça affiche le resultat de la requete dans la dbgir

    mais quand c'est le code d'un boutton qui le fait ça affiche le resultat mais apres le message d'erreur: Informations sur la colonne clé insuffisantes pour la mise à jour ou le rafraîchissement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ADOConnection1->Open();
    ADOTable1->Open();
     
    DataSource1->DataSet->Refresh();
    ADOTable1->Active=true;
    ADOConnection1->Close();
    de quelle erreur s'agit il?

  14. #14
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    j'ai utilisé maintenant un ADODataSet .....avec
    CursorLocation=clUseServer
    CursorType=ctStatic( puis j'ai essayé ctDynamic puis ctSetKey)

    j'obtient toujours la meme erreur
    Informations sur la colonne clé insuffisantes pour la mise à jour ou le rafraîchissement
    j'ai googlé l'erreur et il parait qu'il faut definir une clé primaire pour la table resultante de la requete. Comment??
    est ce que c'est faisable de la definir dans la requete ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT EntiteOrigine AS Entité, COUNT(D_Etablis) AS n INTO req
    FROM Mouvements
    WHERE D_Etablis LIKE '*2010'
    GROUP BY EntiteOrigine;
    ou dois je changer qulques chose dans le ADODataset?

Discussions similaires

  1. requete select avec count et group by
    Par paco503 dans le forum Requêtes
    Réponses: 7
    Dernier message: 06/05/2013, 17h42
  2. [mysql 5] requete avec count+ having + group by
    Par epeichette dans le forum Requêtes
    Réponses: 7
    Dernier message: 29/10/2008, 19h52
  3. Requete SQL : 2 tables + count
    Par vichenze dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/08/2007, 10h28
  4. [requete] Probleme de COUNT() et GROUP BY
    Par cadoudal56 dans le forum Requêtes
    Réponses: 6
    Dernier message: 04/12/2006, 19h23
  5. [SQL]Requete avec 2 count(*) sur la même table
    Par Sonny dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/11/2005, 16h41

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