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 :

Requête SQL sur 3 tables


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 46
    Par défaut Requête SQL sur 3 tables
    Bonjour mes amis ,
    Voila je suis coincé depuis déja 3 jours sur une requete SQL , je veux a travers cette requete gèrer les payements clients, la requette doit retourner les factures impayées ou partiellement réglés pour un client donnée. les tables utilisées sont :
    Facture (REF_FACTURE,REF_CLIENT,....,MONTANT_NET_A_PAYE);
    PAYEMENT(REF_PAYEMENT,REF_CLIENT,........,MONTANT_REGLE);
    LIGNE_PAYEMENT(REF_PAYEMENT,NUM_LIGNE,REF_FACTURE,MNT_REGLE);

    la requete intervient pour la mise à jour de la table LIGNE_PYEMENT pour ne selectionner que les factures impyées ou partiellement reglée.

    Un payement concerne un seul client a la fois, le client peut regler une ou plusieurs factures, une facture peut etre reglé complètement ou partialement.
    suis sur DELPHI7 et SQL SERVER 2000 comme SGBD.
    merci d'avance sur vos suggèstions.

  2. #2
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Par défaut
    Difficile de te donner une réponse toute faite sans en connaitre plus sur l'application.
    Fais donc une recherche sur Select distinct inner join

  3. #3
    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
    Par défaut
    Fait le en 2 fois.

    1) la requête pour récupérer les sommes des paiements de même facture pour un même client

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT LR.NUMEROFacture, ER.CODECLIENT, Sum(LR.MontantPAYER) AS SommeDeMontantPAYER
    FROM LigneReglement LR, EnteteReglement ER
    WHERE LR.REF = ER.REF
    GROUP BY LR.NUMEROFacture, ER.CODECLIENT

    2. La requête pour le 'reste du'. Résultat précédent à parcourir
    SommeDeMontantPayer <- c'est le champs de liaison

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT EF.NumeroFacture, EF.CODECLIENT, EF.NetAPayer
    FROM EnteteFacture EF
    WHERE EF.NetAPayer <> SommeDeMontantPayer

    Évidemment a filtrer sur le bon client en plus


    Maintenant avec les deux requêtes tu doit pouvoir faire des sous-requête pour faire la même chose en 1 seule requête.

  4. #4
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 46
    Par défaut
    merci beaucoup mes amis , je vais essayé avec la solution de BuzzLeclaire je vais vous tenir au courant du résultat .
    @+

  5. #5
    Membre éclairé Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Par défaut
    Bonjour,

    le select imbriqué me semble être approprié et ainsi n'écrire qu'une seule requête !

    @+

  6. #6
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 46
    Par défaut requêtes imbriquées
    je me suis basé sur la solution de BuzzLeclaire, pour arriver a une seule requête :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Select LR.ref_facture, ER.REF_CLIENT,
     EF.date_piece, ef.fa_av,EF.MNT_NET_A_PAYE, sum(LR.montant_regle) as TOTAL_REGLE  
    from ligne_reglement LR, reglement ER, FACTURE EF
    where LR.REF_REGLEMENT=ER.REF_PAYEMENT and ER.REF_CLIENT=:CLT AND EF.NUM_PIECE=LR.REF_FACTURE
    Group by LR.ref_facture,ER.REF_CLIENT,EF.date_piece,ef.fa_av,EF.MNT_NET_A_PAYE  
     
    union
     
    SELECT EF.NUM_PIECE,EF.REF_CLIENT,   EF.date_piece,ef.fa_av,EF.MNT_NET_A_PAYE,EF.MNT_NET_A_PAYE-ef.MNT_NET_A_PAYE
     FROM FACTURE EF 
     WHERE EF.REF_CLIENT=:CLT AND EF.NUM_PIECE NOT IN(SELECT LR.REF_FACTURE FROM  LIGNE_REGLEMENT LR)

    La première retourne toutes las factures ou avoirs reglées ou patiellement reglées
    et la deuxième retourne le reste des factures et avoirs impayées.
    a noté que le champ fa_av champ boolean qui désigne le type de la piece Facture ou avoir.
    J'ai ajouté une image d'un exemple de résultat de la requete.
    il reste un truc comment se débarasser des lignes ou le total_du est 0, j'"ai essayé avec le filtre mais ça marche pas puisque ce champ est de type champs calculé.
    Images attachées Images attachées  

  7. #7
    Membre émérite 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
    Par défaut
    Pour éliminer les 0 il faut rajouter une clause 'HAVING' du genre :

    HAVING(EF.MNT_NET_A_PAYE - Sum(LR.montant_regle) > 0.001

    Attention à la clause 'NOT IN', elle peut s'avéré de piêtre performance
    pour des tables volumineuses en données.

  8. #8
    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
    Par défaut
    Salut balade.

    Pour elliminer ceux dont le resultat est à 0
    ajouter un condition du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MontantFacture <> MontantDu
    En esperant que le client n'a pas payer plus que prevu, cette condition permet de ressortir uniquement les montantDu qui ne sont pas egal au montant facturé.
    Dans le pire des cas tu aura un montant du négatif qui te permettra d'ailleur de les traités différement.

    Remarque :
    Pourkoi dans ta deuxieme requete du mets cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EF.MNT_NET_A_PAYE-ef.MNT_NET_A_PAYE
    tu soustrait le même champs ?

    A plus

  9. #9
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 46
    Par défaut Resolu
    salut Mes amis, effectivement j'ai combiner vos proposition pour aboutir à une solution qui donne de résultats corrects, la requete retenue est :
    SELECT LR.ref_facture, ER.REF_CLIENT,
    EF.date_piece, ef.fa_av,EF.MNT_NET_A_PAYE, sum(LR.montant_regle) AS TOTAL_REGLE
    FROM ligne_reglement LR, reglement ER, FACTURE EF
    WHERE LR.REF_REGLEMENT=ER.REF_PAYEMENT AND ER.REF_CLIENT=:CLT AND EF.NUM_PIECE=LR.REF_FACTURE
    HAVING(EF.MNT_NET_A_PAYE - Sum(LR.montant_regle) > 0.001
    GROUP BY LR.ref_facture,ER.REF_CLIENT,EF.date_piece,ef.fa_av,EF.MNT_NET_A_PAYE
    union
    SELECT EF.NUM_PIECE,EF.REF_CLIENT, EF.date_piece,ef.fa_av,EF.MNT_NET_A_PAYE,EF.MNT_NET_A_PAYE-ef.MNT_NET_A_PAYE
    FROM FACTURE EF
    LEFT JOIN LIGNE_REGLEMENT LR ON (EF.NUM_PIECE = LR.REF_FACTURE)
    WHERE EF.REF_CLIENT=:CLT
    AND LR.REF_PAYEMENT IS NULL

    merci encore une fois les amis et @ trés bientot

  10. #10
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 46
    Par défaut
    en faite BuzzLeclaire je fais soustraire le meme champ (EF.MNT_NET_A_PAYE-ef.MNT_NET_A_PAYE ) pour juste avoir un 0 comme resultat dans le champ, un champ qui doit exister pour s'aligner avec la première requete de l'UNION en nombre de champs des expressions.
    @+

Discussions similaires

  1. [SQL] Problème avec script de pagination et requête sql sur deux tables
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/06/2006, 15h06
  2. problème de requête SQL sur 3 tables pour un while
    Par carmen256 dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/04/2006, 17h55
  3. requêtes sql sur plusieurs tables
    Par zahiton dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/11/2005, 11h59
  4. [SQL] requêtes SQL sur plusieurs tables
    Par zahiton dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/11/2005, 17h32
  5. 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, 17h26

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