Requete SQL Jointure [Résolu]

acecel 140 Messages postés jeudi 6 mai 2004Date d'inscription 14 octobre 2006 Dernière intervention - 25 oct. 2005 à 12:19 - Dernière réponse : acecel 140 Messages postés jeudi 6 mai 2004Date d'inscription 14 octobre 2006 Dernière intervention
- 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.
Afficher la suite 

4 réponses

Meilleure réponse
mrdep1978 402 Messages postés jeudi 25 novembre 2004Date d'inscription 7 juin 2009 Dernière intervention - 25 oct. 2005 à 14:55
3
Merci
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

Merci mrdep1978 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 125 internautes ce mois-ci

acecel 140 Messages postés jeudi 6 mai 2004Date d'inscription 14 octobre 2006 Dernière intervention - 25 oct. 2005 à 12:27
0
Merci
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") ...
cs_pluplu 616 Messages postés mercredi 18 décembre 2002Date d'inscription 4 juillet 2012 Dernière intervention - 25 oct. 2005 à 14:42
0
Merci
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
acecel 140 Messages postés jeudi 6 mai 2004Date d'inscription 14 octobre 2006 Dernière intervention - 25 oct. 2005 à 15:12
0
Merci
[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.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.