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 :

Problème Requête SQL Server


Sujet :

Bases de données Delphi

  1. #1
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Par défaut Problème Requête SQL Server
    Bonjour, j'ai une requête qui valorise le stock des articles selon le CUMP (coût unitaire moyen pondéré. c'est la suivante:
    Remarque:
    bla_lignes: c'est la table des réceptions achat
    be_lignes: c'est la table des entrées stocks
    bs_lignes: c'est la table des sorties de stock
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    select a.code,a.designation,a.um_stock,
     
    ((select isnull (sum(c.qte),0) from be_lignes c,be r where r.num_e=c.num_e and c.c_art=a.code )- 
    (select isnull (sum(c.qte),0) from bs_lignes c,bs r where r.num_s=c.num_s and c.c_art=a.code  ))
    *
    ( case (select isnull(sum(qte),0) from bla_lignes where c_art=a.code and bl 
    in(select bl from bla where d_com>='01/01/2008 00:00' and d_com<='31/05/2008 23:59')) 
    when 0 then 0 else (select isnull(sum(qte*p_vente),0) from bla_lignes where c_art=a.code and 
    bl in(select bl from bla where d_com>='01/01/2008 00:00' and d_com<='31/05/2008 23:59'))/
    (select isnull(sum(qte),0) from bla_lignes where c_art=a.code and bl in(select bl from bla 
    where d_com>='01/01/2008 00:00' and d_com<='31/05/2008 23:59')) end) as Stock_val 
    from produit a 
    where achete=1 
    order by a.code
    cette requête marche parfaitement.
    le problème c'est que quand je mets dans le where (pour sélectionner d'autres types articles),
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    where achete=1 and vendu=1

    le message suivant est affiché

    " [DBNETLIB connectionRead] (Wrapper Read()) Erreur Réseau Générale. Consultez la documentation relative à votre réseau."

    et pourtant c'est une condition que j'ai ajouté trés simple, je ne voie pas pourquoi.

    même si je mets (where fabrique=1 and vendu=1) ça marche???

    pouvez-vous m'orienter, les trucs bizzares me dépassent

  2. #2
    Membre Expert

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Par défaut
    Si tu as cette erreur, c'est que tu as perdu la connexion au serveur SQL Server.

    Il peut y avoir plusieurs raisons :
    1. Tu as effectivement subit une coupure réseau.
    2. T'as requête contient quelque chose qui a fait crasher le serveur et donc SQL Server a réagis en tuant ta connexion. C'est rarissime mais j'ai déjà eu le cas une fois. Dans ce cas, regarde dans les fichiers logs de SQL Server ou dans le journal d'événements windows, tu as peut-être plus d'informations.
    Essaie aussi d'installer le dernier service pack.
    Si le problème perdure, il faudra écrire la requête différemment.

  3. #3
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 547
    Billets dans le blog
    10
    Par défaut
    A tu essayé de décomposer ta demande SQL en plusieurs demandes en utilisant des tables temporaires.

  4. #4
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Par défaut
    Franck SORIANO a dit:
    1. Tu as effectivement subit une coupure réseau.
    non à partir de cette requête, la connexion vers le serveur échoue, mais j'ai toujours des connexions réseau.

    ALWEBER a dit:
    A tu essayé de décomposer ta demande SQL en plusieurs demandes en utilisant des tables temporaires.
    mais comment le ferais-je?? je ne sais pas.

  5. #5
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 46
    Par défaut
    verifies la compatibilité du champ achete de la table et type numerique ....

  6. #6
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Par défaut
    les champs achete,vendu,fabrique sont de type int.
    ils sont tous soit à 1 ou à 0 dans la table.
    sachant que la table produit contient 807 enregistrements

  7. #7
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 547
    Billets dans le blog
    10
    Par défaut
    Ta requête avec une table temporaire. La clause Where est remontée au début donc tu peux y mettre des conditions supplémentaires.
    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
     
     
    Select code, designation, um_stock, into #t1 FROM produit
    WHERE achete=1 
     
     
    SELECT a.code,a.designation,a.um_stock,
     
    ((SELECT isnull (sum(c.qte),0) FROM be_lignes c,be r WHERE r.num_e=c.num_e AND c.c_art=a.code )- 
    (SELECT isnull (sum(c.qte),0) FROM bs_lignes c,bs r WHERE r.num_s=c.num_s AND c.c_art=a.code  ))
    *
    ( case (SELECT isnull(sum(qte),0) FROM bla_lignes WHERE c_art=a.code AND bl 
    IN(SELECT bl FROM bla WHERE d_com>='01/01/2008 00:00' AND d_com<='31/05/2008 23:59')) 
    when 0 then 0 else (SELECT isnull(sum(qte*p_vente),0) FROM bla_lignes WHERE c_art=a.code AND 
    bl IN(SELECT bl FROM bla WHERE d_com>='01/01/2008 00:00' AND d_com<='31/05/2008 23:59'))/
    (SELECT isnull(sum(qte),0) FROM bla_lignes WHERE c_art=a.code AND bl IN(SELECT bl FROM bla 
    WHERE d_com>='01/01/2008 00:00' AND d_com<='31/05/2008 23:59')) end) AS Stock_val 
    FROM #t1 a 
    ORDER BY a.code
    Drop #t1
    PS - Remplacer
    par

  8. #8
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Par défaut
    j'ai pas compris

    Select code, designation, um_stock, into #t1 FROM produit
    WHERE achete=1
    veut dire que je transfert mes données à une table temporaires?? je ne connais pas cette syntaxe, et de plus , il me dit

    Syntaxe incorrecte vers le mot clé 'into'.

  9. #9
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Billets dans le blog
    1
    Par défaut
    Oui cette syntaxe permet de transférer le contenu d'un select directement vers une table temporaire créée à la volée. Cependant il faut faire attention à dropper cette même table à la fin du script.

    La syntaxe exacte est (il me semble) :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select code, designation, um_stock
    FROM produit
    INTO #t1
    WHERE achete=1

  10. #10
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Citation Envoyé par BYALI Voir le message
    j'ai pas compris


    veut dire que je transfert mes données à une table temporaires?? je ne connais pas cette syntaxe, et de plus , il me dit

    Syntaxe incorrecte vers le mot clé 'into'.
    Il y a une virgule en trop juste après um_stock

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Select code, designation, um_stock into #t1 FROM produit
    WHERE achete=1
    Puis va falloir apprendre à faire de vrai jointure (utilisation du inner join)
    et utiliser le between pour les périodes de date

    Une version corrigé de ta requete ci dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT a.code,a.designation,a.um_stock,
     
    ((SELECT isnull (sum(c.qte),0) FROM be_lignes c inner join be r on r.num_e=c.num_e AND c.c_art=a.code ) - 
    (SELECT isnull (sum(c.qte),0) FROM bs_lignes c inner join bs r on r.num_s=c.num_s AND c.c_art=a.code  )) *
    (case (SELECT isnull(sum(qte),0) FROM bla_lignes WHERE c_art=a.code AND bl 
    IN (SELECT bl FROM bla WHERE Date(d_com) Between '01/01/2008' AND '31/05/2008')) 
    when 0 then 0 else (SELECT isnull(sum(qte*p_vente),0) FROM bla_lignes WHERE c_art=a.code AND 
    bl IN(SELECT bl FROM bla WHERE Date(d_com) Between '01/01/2008' AND '31/05/2008 23:59')) /
    (SELECT isnull(sum(qte),0) FROM bla_lignes WHERE c_art=a.code AND bl IN (SELECT bl FROM bla 
    WHERE Date(d_com) Between '01/01/2008' AND '31/05/2008')) end) AS Stock_val 
    FROM produit a 
    WHERE achete=1 
    ORDER BY a.code
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  11. #11
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Par défaut
    merci RAYEK ça marche bien , mais la question (pour que j'apprenne bien ), quelle est la différence entre ma jointure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    from be_lignes c,be r WHERE r.num_e=c.num_e
    et ta jointure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FROM be_lignes c inner join be r on r.num_e=c.num_e

  12. #12
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Billets dans le blog
    1
    Par défaut
    Au niveau des résultats retournés ça ne change rien par contre la syntaxe "JOIN" est plus souple et correspond à norme concernant les jointures.

    D'autant qu'en plus l'utilisation de JOIN permet aux moteurs SQL de savoir dès le départ que l'on fait une jointure et met en place les optimisations adéquates alors qu'avec l'ancienne syntaxe, les deux tables sont fusionnées par démultiplication avant d'être filtrées avec les conditions WHERE.

  13. #13
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Aka, a super bien répondu à ta question sur les jointures.

    Je vais juste te rajouter quelques liens qui sont très intéressant pour le SQL :

    Le global : http://sql.developpez.com/cours/
    Les jointures : http://sqlpro.developpez.com/cours/sqlaz/jointures/
    Optimisation : http://sqlpro.developpez.com/cours/optimiser/

    Pour ma part, c'est ma bible du SQL quand j'ai des soucis ^^
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  14. #14
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Par défaut
    merci Aka Guymelef et RAYEK pour vos lumières


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

Discussions similaires

  1. probléme dans une requête sql server
    Par red_one dans le forum Langage SQL
    Réponses: 1
    Dernier message: 02/06/2009, 10h15
  2. problème requête sql
    Par perfectdams dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 21/06/2005, 19h09
  3. Problème installation SQL Server 2000 (programme antérieur)
    Par 404Found dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/04/2005, 11h24
  4. Problème réplication SQL Server et SQL Server CE (RDA)
    Par didix11 dans le forum Réplications
    Réponses: 2
    Dernier message: 15/04/2004, 12h10
  5. Réponses: 8
    Dernier message: 23/10/2003, 17h22

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