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

Bases de données Delphi Discussion :

relier deux requetes


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 156
    Points : 62
    Points
    62
    Par défaut relier deux requetes
    bonjour les developpeurs
    j'espère que vous pouvez m'aider dans mon problème qui est un peu compliqué
    j'ai une table article(designation,nom_direction,quantite,montant)
    sachant qu'une direction peut demander plusieurs articles
    exemple:
    direction designation quantité montant
    -------- ---------- ------- --------
    ABC camion 5 10
    ABC engin 4 20
    DEF engin 3 15
    DEF mazda 6 10
    je voudrais afficher cette table de la manière suivante:
    1-designation,la quantité totale,le montant total
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select distinct designation,sum(quantite),sum(montant)
    from article
    group by designation
    nom_article:=fieldbyname('designation').asstring
    2-le montant,la quantité de chaque direction pour un article
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'select quantité as"QtéABC",montant as"MontABC"from article
    where designation='+nom_article
    and nom_direction=''ABC''
    la même chose pour les autres directions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'select quantité as"QtéDEF",montant as"MontDEF"from article
    where designation='+nom_article
    and nom_direction=''DEF''
    mais je ne sais pas comment relier ces deux requetes
    pour afficher le resultat dans un DBgrid (je travaille sous delphi)
    please help me

  2. #2
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    Dans le premier code, la clause "DISTINCT" est redondante par rapport à la
    clause "GROUP BY". Tu utilises soit l'un soit l'autre mais pas les deux en
    même temps

    Pour les autres requêtes, il faut que les noms de colonnes soient les mêmes
    entre les deux requêtes.
    Comme tu fais des requêtes sur la même table, tu n'as pas besoin d'utiliser
    l'instruction "AS" puisque tu te réfaire aux mêmes colonnes.

    J'utilise la base Employee.gdb comme exemple avec la couche d'accès aux
    données IBX. L'avantage c'est que la base existe et je peux illustrer les
    explications. Tu n'as qu'à remplacer les colonnes que je prend comme
    exemple par les tiennes:

    Soit tu utilises la clause "GROUP BY" en incluant ton code produit comme
    suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select PROJ_ID,dept_no,fiscal_year, sum(PROJECTED_BUDGET) from PROJ_DEPT_BUDGET
    group by dept_no,fiscal_year,proj_id
    ou alors tu utilises la clause Union:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select dept_no,fiscal_year,sum( PROJECTED_BUDGET) from PROJ_DEPT_BUDGET
    where proj_id='MKTPR'
    group by dept_no,fiscal_year
    union
    select dept_no,fiscal_year, sum(PROJECTED_BUDGET) from PROJ_DEPT_BUDGET
    where proj_id='VBASE'
    group by dept_no,fiscal_year
    Entre les deux codes, tu constateras qu'il y a un champ de plus dans
    le premier exemple après la clause "GROUP BY", tandis que dans l'autre
    c'est dans la clause "WHERE" où la valeur du champ est précisé.
    Pour ce dernier cas, si tu as 20 références de produits, autant oublié
    ce cas de figure.

    Conclusion, tu oublis les deux dernières requêtes, ça rime à rien.
    La clause "GROUP BY" résout le problème puisque tu peux mettre plusieurs
    champs pour faire la projection, chez toi ce sera:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     SELECT NOM_DIRECTION, NOM_ARTICLE, sum(... from ...
     GROUP BY NOM_DIRECTION, NOM_ARTICLE
    L'objectif de mon explication, c'est qu'en te donnant un autre problème,
    tu réflichisses au tien, dans le cas ou un problème du même genre mais pour
    des autre tables se présenterais.

    Cependant, ton problème n'a rien à voir avec le langage Delphi, tu fais
    du SQL même si tu utilises des champs paramètrés.

  3. #3
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 156
    Points : 62
    Points
    62
    Par défaut
    merci chaplin pour votre reponse
    j'ai bien compris ton code, mais mon problème n'est pas dans la clause "group by" mais dans l'affichage des noms des colonnes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'select quantité as"QtéABC",montant as"MontABC"from article
    where designation='+nom_article
    and nom_direction=''ABC''
    dans ton code,comment je peux preciser que la quantité mentionnée est la quantité de la direction 'ABC' ???

  4. #4
    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
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut sami,

    Je peux t'aider en requete, mais j'ai rien compris à ta demande.
    Et oui sa arrive lolol
    Alors essai de donner le resultat désirer.

    Tu as mis les enregistrements de début
    exemple:
    direction designation quantité montant
    -------- ---------- ------- --------
    ABC camion 5 10
    ABC engin 4 20
    DEF engin 3 15
    DEF mazda 6 10

    Mais nous le résultat que tu veux en plus.

    enfin si tu n'as pas trouvé.

    Je te pondrais une requête. (enfin si je suis en forme)

  5. #5
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 156
    Points : 62
    Points
    62
    Par défaut

    j'ai plusieurs requetes avec des conditions differente
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select distinct designation,sum(quantite),sum(montant)
    from article
    group by designation
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'select quantité as"QtéABC",montant as"MontABC"from article
    where designation='+nom_article
    and nom_direction=''ABC''
    tel que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nom_article:=fieldbyname('designation').asstring
    et je veux les relier pour les afficher dans un même DBgrid (qlq chose qui ressemble à "Union")

  6. #6
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    Dans l'idée de faire un union, la requête avec la clause "DISTINCT" te retournera tous les articles.
    Si tu veux relier une autre requête, tu auras une ligne supplémentaire pour l'article sélectionné.
    Par conséquent, tu auras deux lignes correspondantes à un article donné, mais juste cet article.

    Est ce que tu veux afficher tes résultats selon des colonnes ou des lignes ?

    La manière dont tu exposes ton problème voudrait faire croire que tu veux personnaliser les entêtes
    de colonnes, pour faire quoi à la fin ?

    D'autre part je te suggère d'utiliser des requêtes paramétrés:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    'select quantité as"Qté",montant as"Mont"from article
    where designation=:designation
    and nom_direction=''ABC''
    et de rentrer la valeur sous forme de paramètre dans le code delphi:

    MyQurery.ParamByName('DESIGNATION').AsString := UnDataset.FieldByName('DESIGNATION').AsString ;

    voir même:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    'select quantité as"Qté",montant as"Mont" from article
    where designation=:designation
    and nom_direction=:nom_direction
    et de rentrer la valeur sous forme de paramètre dans le code delphi:

    MyQuery.ParamByName('designation').AsString := UnDataset.FieldByName('designation').AsString ;
    ParamByName('nom_direction').AsString := 'ABC' ;

    ...

    ParamByName('nom_direction').AsString := 'DEF' ;

    Dans ce cas là tu executes autant de fois que nécessaire ta requête et mets les résultats
    dans une table en cache par recopie des valeurs de ta requête.

    Si ta base de données te le permet, utilises des procédures stockées. Tout dépend de ce que tu veux faire.

    Mais peut être que je n'ai pas non plus compris le problème.

Discussions similaires

  1. Relier deux requetes avec un union sous PL/SQL
    Par gaijinma dans le forum PL/SQL
    Réponses: 4
    Dernier message: 25/05/2010, 15h27
  2. [Débutant] Formulaire/Requetes relier deux tables
    Par antoine0207 dans le forum Access
    Réponses: 9
    Dernier message: 29/06/2006, 16h07
  3. [TP] Relier deux points ?
    Par wwwroom dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 28/06/2005, 19h04
  4. fusionner le résultat de deux requetes
    Par sami_c dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/05/2004, 09h56
  5. jointure entre deux requete
    Par Youssef dans le forum Langage SQL
    Réponses: 21
    Dernier message: 15/01/2004, 15h13

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