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 :

comment utilisé le résultat d'un SQL dans une autre requête


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2012
    Messages : 238
    Points : 77
    Points
    77
    Par défaut comment utilisé le résultat d'un SQL dans une autre requête
    salam

    j'ai un problème avec les requête imbriqué ... pour commencer j'exécute une requête et ensuite avec le résultat de cette dernière j'exécute une nouvelle requête ... je vais vous exposez mon code pour éclairé mieux mon problème.
    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
    procedure TProduction.cxButton9Click(Sender: TObject);
    begin
    with rebutpre do
      begin
        sql.Clear  ;
        sql.Add('SELECT Production.Num_Post, Production.Produit, Production.Date1, Sum(Production.Qte_Real) AS sqr, Sum(Production.Qte_Rebut) AS sr, Sum(Production.Qte_NC) AS sNC, Sum(Production.Qte_Testé) AS sqt');
        sql.Add('FROM Production');
        sql.Add('WHERE Production.Date1 Between :pre And :pre1');
        Parameters.CreateParameter('pre', ftstring, pdInput, 0,  StrToDate(pre.Text));
        Parameters.CreateParameter('pre1', ftstring, pdInput, 0, StrToDate(pre1.Text));
        sql.Add('GROUP BY Production.Num_Post, Production.Produit, Production.Date1');
        sql.Add('ORDER BY Production.Date1');
     
        Open;
     
      end;
     with rebutpreposte do
      begin
     
        sql.Clear  ;
        sql.Add('SELECT Sum(ppm.sqr) AS Ssqr, Sum(ppm.sr) AS Ssr, Sum(ppm.sNC) AS SsNC, Sum(ppm.sqt) AS Ssqt');
        sql.Add('FROM (SELECT Production.Num_Post, Production.Produit, Production.Date1, Sum(Production.Qte_Real) AS sqr, Sum(Production.Qte_Rebut) AS sr, Sum(Production.Qte_NC) AS sNC, Sum(Production.Qte_Testé) AS sqt FROM Production '+'WHERE (((Production.Date1) Between #1/22/2013# And #1/29/2013#))GROUP BY Production.Num_Post, Production.Produit, Production.Date1;)');
        Parameters.CreateParameter('pre', ftstring, pdInput, 0,  StrToDate(pre.Text));
        Parameters.CreateParameter('pre1', ftstring, pdInput, 0, StrToDate(pre1.Text));
     
     
        Open;
       end;
    end;
    * la première requête s'exécute le plus normalement du monde mai la deuxième me sort une erreur "objet parameter défini de manière incorrect . des informations incohérentes ou incomplètes ont été fournies" . je vois pas pourquoi il accepte les paramètres dans la première requête et non pour la deuxième .

    * j'aimerai bien apprendre une nouvelle méthode comme avoir le résultat du text sql et le sauvegarder dans une variable et ensuite utilisé cette variable directement dans la clause from j'ai essayé avec ou mais il me donne pas le résultat final du sql mais il me donne plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    "SELECT Production.Num_Post, Production.Produit, Production.Date1, Sum(Production.Qte_Real) AS sqr, Sum(Production.Qte_Rebut) AS sr, Sum(Production.Qte_NC) AS sNC, Sum(Production.Qte_Testé) AS sqt
    FROM Production
    WHERE (((Production.Date1) Between :pro And :pro1))
    GROUP BY Production.Num_Post, Production.Produit, Production.Date1;"
    et moi ce que je cherche : si par exemple mon pre.text := 1/01/2013 et mon pre1:= 1/02/2013 j'aurai ce résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Production.Num_Post, Production.Produit, Production.Date1, Sum(Production.Qte_Real) AS sqr, Sum(Production.Qte_Rebut) AS sr, Sum(Production.Qte_NC) AS sNC, Sum(Production.Qte_Testé) AS sqt
    FROM Production
    WHERE (((Production.Date1) Between #1/01/2013# And #2/01/2013#))
    GROUP BY Production.Num_Post, Production.Produit, Production.Date1;
    - une petite précision j'utilise access comme base de données .

    voila j’espère trouver une solution plus pratique parce-que j'utilise beaucoup ce genre de requête sql et j'aunai mare de tapé a chaque foi la requête a la main et merci d'avance .
    Delphi XE8 Architect - Win 10

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par adelcrb Voir le message
    j'ai un problème avec les requête imbriqué ...
    Je réécrirais cela un peu différemment : d'abord la construction de la requête sql, ensuite le traitement préparatoire des paramètres. De plus je remplacerais le nom de la table par son alias.
    Ensuite je vois dans la 2° requête un alias ppm sur les colonnes qui n'est corrélé nulle part. Par contre je ne vois pas les 2 paramètres auxquels vous faites référence (erreur de copier coller peut-être ? ). Je supprimerais le point-virgule qui traine dans la dernière ligne de l'instruction SQL.
    Voila donc ce que j'écrirais (à affiner toutefois ):
    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
    procedure TProduction.cxButton9Click(Sender: TObject);
    begin
    with rebutpre do
      begin
        sql.Clear  ;
        sql.Add('SELECT P.Num_Post, P.Produit, P.Date1, SUM(P.Qte_Real) AS sqr,');
        sql.Add('SUM(P.Qte_Rebut) AS sr, SUM(P.Qte_NC) AS sNC, SUM(P.Qte_Testé) AS sqt');
        sql.Add('FROM Production AS P');
        sql.Add('WHERE P.Date1 BETWEEN :pre AND :pre1');
        sql.Add('GROUP BY P.Num_Post, P.Produit, P.Date1');
        sql.Add('ORDER BY P.Date1');
     
        Parameters.CreateParameter('pre', ftstring, pdInput, 0,  StrToDate(pre.Text));
        Parameters.CreateParameter('pre1', ftstring, pdInput, 0, StrToDate(pre1.Text));
     
        Open;
     
      end;
     with rebutpreposte do
      begin
     
        sql.Clear  ;
        sql.Add('SELECT SUM(sqr) AS Ssqr, SUM(sr) AS Ssr,');
        sql.Add('SUM(sNC) AS SsNC, SUM(sqt) AS Ssqt');
        sql.Add('FROM (SELECT P.Num_Post, P.Produit, P.Date1, SUM(P.Qte_Real) AS sqr,');
        sql.Add(      'SUM(P.Qte_Rebut) AS sr, SUM(P.Qte_NC) AS sNC, SUM(P.Qte_Testé) AS sqt');
        sql.Add(      'FROM Production AS P');
        sql.Add(      'WHERE (P.Date1 BETWEEN :pre AND :pre1)');
        sql.Add(      'GROUP BY P.Num_Post, P.Produit, P.Date1)');
     
        Parameters.CreateParameter('pre', ftstring, pdInput, 0,  StrToDate(pre.Text));
        Parameters.CreateParameter('pre1', ftstring, pdInput, 0, StrToDate(pre1.Text));
     
        Open;
       end;
    end;
    Philippe.

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Pour de vrais requête enchaine voir Création de relations maître/détail
    Cela explique le MasterSource qui est équivalente à DataSource d'un TDataSet (différente d'un DataSource d'un DB Controls)

    C'est très simple, pour un test rapide, deux TQuery (Q1 et Q2), deux TDataSource (DS1 et DS2), deux DBGrids

    Tu relie au second TQuery Q2 comme DataSource le DataSource DS1 du premier TQuery Q1

    Lors de Prepare avant le Open, Q2 ira chercher ses paramètres dans les champs de Q1, attention au nommage

    Je n'en fait pas souvent, j'ai proposé cette technique à un collègue avec des TSQLQuery, dans le Premier DataSet, il semble qu'il soit préférable de mettre le champ lié comme IndexFieldNames pour DBExpress, à vérifier sur Paradox

    Q2, tu mes un SQL paramètre comme SELECT * FROM Table2 WHERE Table2.Champ = :ChampTruc
    ChampTruc est un champs fourni par Q1
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2012
    Messages : 238
    Points : 77
    Points
    77
    Par défaut
    j'ai enfin réussie a résoudre le problème ... 2 jours de recherche mais pas pour rien vos conseil mon vraiment aidé malgré que la méthode de la création des paramètre me cause souvent problème des fois ça marche et des fois non malgré que je l'utilise sur des cas identique sans tarder voila la requête finale:
    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
    procedure TProduction.cxButton9Click(Sender: TObject);
    begin
    with rebutpre do
      begin
        sql.Clear  ;
        sql.Add('SELECT Production.Num_Post, Production.Produit, Production.Date1, Sum(Production.Qte_Real) AS sqr, Sum(Production.Qte_Rebut) AS sr, Sum(Production.Qte_NC) AS sNC, Sum(Production.Qte_Testé) AS sqt');
        sql.Add('FROM Production');
        sql.Add('WHERE Production.Date1 Between :pre And :pre1');
        Parameters.CreateParameter('pre', ftstring, pdInput, 0,  StrToDate(pre.Text));
        Parameters.CreateParameter('pre1', ftstring, pdInput, 0, StrToDate(pre1.Text));
        sql.Add('GROUP BY Production.Num_Post, Production.Produit, Production.Date1');
        sql.Add('ORDER BY Production.Date1');
        Open;
      end;
      with rebutpreglob do
      begin
     
        sql.Clear  ;
        sql.Add('SELECT SUM(sqr) AS Ssqr, SUM(sr) AS Ssr,');
        sql.Add('SUM(sNC) AS SsNC, SUM(sqt) AS Ssqt');
        sql.Add('FROM (SELECT P.Num_Post, P.Produit, P.Date1, SUM(P.Qte_Real) AS sqr,');
        sql.Add(      'SUM(P.Qte_Rebut) AS sr, SUM(P.Qte_NC) AS sNC, SUM(P.Qte_Testé) AS sqt');
        sql.Add(      'FROM Production AS P');
        sql.Add(      'WHERE (P.Date1 BETWEEN :pre AND :pre1)');
        sql.Add(      'GROUP BY P.Num_Post, P.Produit, P.Date1)');
        with Parameters.ParamByName('pre') do
        begin
           DataType := ftDate;
           Direction := pdInput;
           Value := StrToDate(pre.Text);
        end;
        with Parameters.ParamByName('pre1') do
        begin
           DataType := ftDate;
           Direction := pdInput;
           Value := StrToDate(pre1.Text);
        end;
     
     
        Open;
       end;
    end;
    ppm est une requête j'ai utilisé directement ces champs mais apparemment ça marche pas ... je continue a apprendre et c'est grâce a vous je vous remercier encore une fois.

    note: j'ai fait une modification du code .
    Delphi XE8 Architect - Win 10

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/02/2012, 18h15
  2. Utiliser le résultat d'une chaine sql dans une autre
    Par beegees dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/05/2009, 09h00
  3. Réponses: 3
    Dernier message: 02/02/2007, 14h30
  4. Réponses: 11
    Dernier message: 18/07/2006, 13h53
  5. Réponses: 4
    Dernier message: 14/09/2005, 17h23

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