Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/10/2011, 13h23   #1
Futur Membre du Club
 
Med Ali Meziane
Inscription : juillet 2006
Messages : 40
Détails du profil
Informations personnelles :
Nom : Med Ali Meziane
Âge : 47
Localisation : Tunisie

Informations forums :
Inscription : juillet 2006
Messages : 40
Points : 19
Points : 19
Par défaut Requête: Liste des Factures impayées

Bonjour,
Je me bas depuis des heures sur une requête qui me permet d'avoir une liste des factures non réglées (Totalement et/ou partiellement)
Je possèdes deux tables:
Facture: nfacture,dfacture,montant
reglement : nreg,nfacture,montreg,rettva,retsource

à savoir une facture doit être réglée selon cette formule:
montant +retenue à la source + retenue sur tva

la retenue à la source et retenue de tva accompagnent toujours le 1er réglement

J'utilise cette requête qui me permet d'avoir seulement les factures partiellement réglées (celles totalement non réglée manquent)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT FA.nfacture,
          FA.dfacture,
             FA.netapayer,
                sum(RE.remisfact+RE.retsource+RE.rettva+RE.montant) AS payer,
                (FA.netapayer-sum(RE.remisfact+RE.retsource+RE.rettva+RE.montant)) AS restapayer
FROM (":baseannee:facture" FA
      LEFT JOIN ":basestk:reglemen" RE ON FA.nfacture=RE.nfacture)
GROUP BY FA.nfacture,
         FA.dfacture,
         FA.netapayer HAVING ( (FA.netapayer > sum(RE.remisfact+RE.retsource+RE.rettva+RE.montant))
                              OR (sum(RE.remisfact+RE.retsource+RE.rettva+RE.montant) IS NULL) )
ORDER BY FA.nfacture
PS:
- Les deux tables appartiennent à deux bases (DBASE III Plus) différentes.
- C'est une requête avec Delphi 7 pour un état Qreport

Merci de votre aide
mameziane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 18h20   #2
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 415
Points : 4 447
Points : 4 447
bonsoir,

Citation:
Envoyé par mameziane Voir le message
- Les deux tables appartiennent à deux bases (DBASE III Plus) différentes.
- C'est une requête avec Delphi 7 pour un état Qreport
tu as bien fait de poster dans le forum Access


Citation:
Envoyé par mameziane Voir le message
(celles totalement non réglée manquent)
il faut rechercher les numéros de factures qui n'ont pas de correspondance dans la table des règlements RE.nfacture IS NULL.

Dans un HAVING, on doit s'en sortir avec Max:
Code sql :
...OR Max(RE.nfacture) IS NULL
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 31/10/2011, 18h33   #3
Futur Membre du Club
 
Med Ali Meziane
Inscription : juillet 2006
Messages : 40
Détails du profil
Informations personnelles :
Nom : Med Ali Meziane
Âge : 47
Localisation : Tunisie

Informations forums :
Inscription : juillet 2006
Messages : 40
Points : 19
Points : 19
Bonsoir F-Leb,
Au début je vous remercie pour l'intérêt que vous portez à ma question.
J'ai posté ma question ici par ignorance

En fait
Citation:
OR (sum(RE.remisfact+RE.retsource+RE.rettva+RE.montant) IS NULL)
et
Citation:
OR Max(RE.nfacture) IS NULL
donnent le même résultat qui comprend les factures même réglées.

Je constate que c'est la seule lacune actuellement: La requête affiche parmi les factures partiellement réglées et non réglées et aussi celles réglées
Que faire en plus de
Citation:
(FA.netapayer > sum(RE.remisfact+RE.retsource+RE.rettva+RE.montant)
pour filtrer ce résultat ?

en voici un aperçu: (seulement pour clarifier la Chose aux débutants comme moi )



D'ailleurs une autre question si vous permettez:
comment remplacer par un Zéro les valeur Null (en SQL) ?
mameziane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 19h09   #4
Futur Membre du Club
 
Med Ali Meziane
Inscription : juillet 2006
Messages : 40
Détails du profil
Informations personnelles :
Nom : Med Ali Meziane
Âge : 47
Localisation : Tunisie

Informations forums :
Inscription : juillet 2006
Messages : 40
Points : 19
Points : 19
J'ai trouvé la solution

En fait je me suis inspiré de la réponse de Monsieur F-Leb et j'ai modifier la requête en ajoutant la fonction Max devant FA.netapayer qui est le montant de la facture (en rouge)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT fa.nfacture,
          fa.dfacture,
             fa.netapayer,
                sum(re.remisfact+re.retsource+re.rettva+re.montant) AS payer,
                (fa.netapayer-sum(re.remisfact+re.retsource+re.rettva+re.montant)) AS restapayer
FROM (":baseannee:facture" fa
      LEFT JOIN ":basestk:reglemen" re ON fa.nfacture=re.nfacture)
GROUP BY fa.nfacture,
         fa.dfacture,
         fa.netapayer HAVING ((max(fa.netapayer) > sum(re.remisfact+re.retsource+re.rettva+re.montant))
                              OR (sum(re.remisfact+re.retsource+re.rettva+re.montant) IS NULL))
ORDER BY fa.nfacture
ce qui a permis de masquer les factures totalement payées.

Seulement, comment remplacer par un Zéro les valeur Null (en SQL) ? J'ai essayer coalesce qui m'a été refusé !!
mameziane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 19h53   #5
Futur Membre du Club
 
Med Ali Meziane
Inscription : juillet 2006
Messages : 40
Détails du profil
Informations personnelles :
Nom : Med Ali Meziane
Âge : 47
Localisation : Tunisie

Informations forums :
Inscription : juillet 2006
Messages : 40
Points : 19
Points : 19
oh non !!!

J'ai trop vite parlé... en fait le résultat comprend encore quelques factures (bizarrement pas toutes) dont le reste à payer = 0 !!!


Encore de l'aide SVP !

Voici la requête rectifiée:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT cl.codcli,
          cl.raiscli,
             fa.nfacture,
                fa.dfacture,
                   fa.netapayer,
                      sum(re.remisfact+re.retsource+re.rettva+re.montant) AS payer,
                      (fa.netapayer-sum(re.remisfact+re.retsource+re.rettva+re.montant)) AS restapayer
FROM (":baseannee:facture" fa
      LEFT JOIN ":basestk:reglemen" re ON fa.nfacture=re.nfacture) LEFT
JOIN ":basestk:client" cl ON fa.codcli=cl.codcli
GROUP BY cl.codcli,
         cl.raiscli,
         fa.nfacture,
         fa.dfacture,
         fa.netapayer HAVING (((max(fa.netapayer) > sum((re.remisfact+re.retsource+re.rettva+re.montant)))
                               AND (max(RE.nfacture) IS NOT NULL))
                              OR (max(RE.nfacture) IS NULL))
ORDER BY fa.nfacture
et encore voici un aperçu du résultat:

mameziane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 20h41   #6
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 415
Points : 4 447
Points : 4 447
N’aurais-tu pas un problème d’arrondi dans tes sommes ?

Du genre,
Code :
1
2
3
4
 
NetApayer=1000,0000
 
sum(RE.remisfact+RE.retsource+RE.rettva+RE.montant) =999,9999
et du coup (FA.netapayer > sum(RE.remisfact+RE.retsource+RE.rettva+RE.montant) est vraie alors que la facture est réglée à l’arrondi près.
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 22h58   #7
Futur Membre du Club
 
Med Ali Meziane
Inscription : juillet 2006
Messages : 40
Détails du profil
Informations personnelles :
Nom : Med Ali Meziane
Âge : 47
Localisation : Tunisie

Informations forums :
Inscription : juillet 2006
Messages : 40
Points : 19
Points : 19
Salut,

Pour la table en .DBF le champ netapayer est un Numérique avec 3 Dec.

Le décimal configuré dans paramètres régional de windows est le point (.)

En fait le formatage d'affichage n'arrondi pas les valeurs mais formate seulement les valeurs avec des zéro à droite,
genre 14.2 qui s'affichera 14.200 (### ##0.000)

Dans aucun emplacement j'arrondi les valeurs
mameziane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 10h36   #8
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 415
Points : 4 447
Points : 4 447
Bonjour,

la condition,
Code sql :
1
2
HAVING fa.netapayer > sum(re.remisfact+re.retsource+re.rettva+re.montant)
                              OR max(RE.nfacture) IS NULL
devrait suffire.

Citation:
Envoyé par mameziane
en fait le résultat comprend encore quelques factures (bizarrement pas toutes) dont le reste à payer = 0 !!!
…et elles ne devraient pas apparaître car si le reste à payer=0, alors :
Code sql :
fa.netapayer = sum(re.remisfact+re.retsource+re.rettva+re.montant)

Je me trompe peut-être avec cette histoire d’arrondi mais je ne vois pas ce que ça pourrait être d’autres, le formatage comme tu dis ne concerne que l’affichage et DBIII fait peut-être des erreurs de calculs à la nième décimale.

Pour lever définitivement le doute, fait un test avec :
Code sql :
1
2
HAVING ABS(fa.netapayer - sum(re.remisfact+re.retsource+re.rettva+re.montant)) > 0.1
                              OR max(RE.nfacture) IS NULL
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 11h55   #9
Futur Membre du Club
 
Med Ali Meziane
Inscription : juillet 2006
Messages : 40
Détails du profil
Informations personnelles :
Nom : Med Ali Meziane
Âge : 47
Localisation : Tunisie

Informations forums :
Inscription : juillet 2006
Messages : 40
Points : 19
Points : 19
Bonjour,

Monsieur Fabien encore merci pour votre aide.

En fait votre analyse m'a aider à confirmer que Dbase III du moins via le moteur ODBC résout mal l'égalité entre deux valeurs décimales et puisque la fonction ABS m'a été refusée dans Having (je ne sais pas d'ailleurs pourquoi) j'ai modifier votre astuce afin d'avoir cette fois une liste vraiment correcte qui ne contient aucune valeur = à zéro.

Puisque les décimaux représentes les millimes (le 1/1000) j'ai ajouter 0.001 au test comme suit:
Code :
1
2
3
HAVING (((sum(re.remisfact+re.retsource+re.rettva+re.montant)+0.001<max(fa.netapayer))
                               AND (max(RE.nfacture) IS NOT NULL))
                              OR (max(RE.nfacture) IS NULL))
ce qui a permis de résoudre définitivement le problème.

Monsieur Fabien encore merci

Je remet ici la requête finale afin de permettre aux lecteurs d'avoir une discussion complète

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT cl.codcli,
          cl.raiscli,
             fa.nfacture,
                fa.dfacture,
                   fa.netapayer,
                      sum(re.remisfact+re.retsource+re.rettva+re.montant) AS payer,
                      (fa.netapayer-sum(re.remisfact+re.retsource+re.rettva+re.montant)) AS restapayer
FROM (":baseannee:facture" fa
      LEFT JOIN ":basestk:reglemen" re ON fa.nfacture=re.nfacture) LEFT
JOIN ":basestk:client" cl ON fa.codcli=cl.codcli
GROUP BY cl.codcli,
         cl.raiscli,
         fa.nfacture,
         fa.dfacture,
         fa.netapayer HAVING (((sum(re.remisfact+re.retsource+re.rettva+re.montant)+0.001<max(fa.netapayer))
                               AND (max(RE.nfacture) IS NOT NULL))
                              OR (max(RE.nfacture) IS NULL))
ORDER BY fa.nfacture
mameziane est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h10.


 
 
 
 
Partenaires

Hébergement Web