Requete SQL Jointure

Résolu
acecel Messages postés 140 Date d'inscription jeudi 6 mai 2004 Statut Membre Dernière intervention 14 octobre 2006 - 25 oct. 2005 à 12:19
acecel Messages postés 140 Date d'inscription jeudi 6 mai 2004 Statut Membre Dernière intervention 14 octobre 2006 - 25 oct. 2005 à 15:12
Bonjour



J'aimerais savoir si cela est possible, et si oui comment procéder :



Pour simplifier; j'ai deux tables :

une table "Facture"

une table "Reglement"



Les deux sont reliées par le champ : "NumMac"



Or j'aimerais recupérer toutes les factures n'ayant pas été reglées,
donc tous les champs de la table "Facture" qui n'ont pas de champ
correspondant dans la table "Reglement".

Autrement dit une sorte de "non-jointure"..

Je ne sais pas si j'ai été clair ?



J'ai cherché en vain un moyen d'effectuer cela dans une seule requête.

(je sais bien sûr comment faire en utilisant 2 requêtes, et en gérant cela dans le programme)



Préçisions : Je suis sous VB6, et la base est sous ACCESS.

4 réponses

mrdep1978 Messages postés 402 Date d'inscription jeudi 25 novembre 2004 Statut Membre Dernière intervention 7 juin 2009 7
25 oct. 2005 à 14:55
Salut,

Tu mets :
" chaque paiement correspondra à un champ dans la table "Reglement") ..."
Chaque paiement correspond à un enregistrement, plutôt qu'à un champ, non ? (Enregistrement ligne, champ colonne)

1° solution :
SELECT facture.*
FROM facture
WHERE qtedue >
(
SELECT sum(qtereglee)
FROM reglement
WHERE reglement.nummac = facture.nummac
)
AND datefacture+nbjours>date()
UNION
SELECT facture.*
FROM facture LEFT OUTER JOIN reglement ON facture.nummac=reglement.nummac
WHERE datefacture+nbjours>date();

La première sous-requete (avant le UNION) ramène les factures partiellement payées
La 2e sous-requete ramène les factures sans règlement

2° solution
SELECT *
FROM facture
WHERE nummac not in
(
SELECT nummac
FROM facture
WHERE qtedue=(select sum(qtereglee) from reglement where reglement.nummac = facture.nummac)
AND datefacture+nbjours>date()
)
AND datefacture+nbjours>date();

La sous requete ramène toutes les factures entierement payees et la requete globale ramène toutes les factures ne répondant pas à ce critère
3
acecel Messages postés 140 Date d'inscription jeudi 6 mai 2004 Statut Membre Dernière intervention 14 octobre 2006
25 oct. 2005 à 12:27
Je ne sais pas si c'est utile de le préciser, mais j'ai plusieurs conditions à rajouter à cette requête tel que :

(Date d'émission de facture + délai prévisionnel de paiement) > Date du jour

...



En fait je viens de penser à quelque chose, je doit aussi
vérifier la somme qui a été payée, et donc ne renvoyer que les factures
qui ont soit été payé partiellement, soit pas payé du tout... (car il
est possible de regler la facture en plusieurs fois, et chaque paiement
correspondra à un champ dans la table "Reglement") ...
0
cs_pluplu Messages postés 615 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 4 juillet 2012
25 oct. 2005 à 14:42
Voilà un cas concret ou la pratique l'emporte sur la théorie. En théorie on ne doit pas mettre dans une table un champ qui peut se calculer, hors dans le cas présent, pour ma part je serai tenté de rajouté dans la table Facture un champ "Solde"qui serait la différence entre le montant de la facture et le total des règlements et qui serait mis à jour après chaque règlement.
Avantages :
Il te suffit d'une seule requête pour trouver toutes tes factures ayant encore un solde
Tu peux facilement affiché le solde impayé pour chaque facture
Inconvenient:
Après chaque enregistr. d'un nouveau règlement, tu dois aussi mettre à jour l'enregistrement concerné dans ta table facture, si ton PC plante au moment de la mise à jour de la table facture, tu as une incohérence, ou alors il faut mettre tes deux requêtes dans une transaction (un peu plus dur a mettre en oeuvre).

Une autre solution c'est de rajouter dans ta table facture un champ "Soldé" de type boolean et à chaque ajout de règlement tu calcul si le solde est atteint si c'est le cas tu met ton champ "Soldé" à true et de cette façon en une seule requête tu peux voir les factures dont il reste un solde
Avantages :
facile à mettre en oeuvre
La requête est rapide car on test sur un boolean
Inconvenient:
Tu dois faire une autre requête assez lourde pour connaitre le solde restant pour chaques factures.
Il y a surement encore d'autres méthodes, mais sans analyse plus profonde de ce que l'on attend de l'application c'est difficile de dire.

Pascal Laurençon
0
acecel Messages postés 140 Date d'inscription jeudi 6 mai 2004 Statut Membre Dernière intervention 14 octobre 2006
25 oct. 2005 à 15:12
[auteurdetail.aspx?ID=20978 pluplu] > En effet,
le problème (qui n'en est pas vraimment un puisque je sais comment
procéder avec 2 requete imbriquées dans le programme) pourrais se
résoudre en modifiant la structure de la base, mais le logiciel est
déja utilisé et commercialisé, il s'agit juste de rajouter une nouvelle
fonction, et donc par conséquent je préfererais éviter de toucher à la
structure de la base.



[auteurdetail.aspx?ID=388456 mrdep1978] > Merci pour ta réponse, elle reponds parfaitement à ma demande.



Merci à tous les deux pour avoir répondu aussi vite, et pour m'avoir aidé



A bientôt et bonne programmation.
0
Rejoignez-nous