OVH Cloud OVH Cloud

Pb Jointure

4 réponses
Avatar
Thierry Giraud
Bonjour,

J'ai 2 tables : une table "Agent", pour laquelle j'ai tous mes agents avec
leur salaire mensuel, et une table "Prime", pour laquelle j'ai une ou
plusieurs primes pour certains agents.

Voici la requete executée :
SELECT Agent.Cle, Agent.Nom, Agent.Prenom, Agent.MtBrut, Prime.MtPrime
FROM Agent LEFT JOIN Prime ON (Agent.Cle = Prime.Ag_num);
qui me donne une ou plusieurs lignes par agents

Mon souci : Pour les agents n'ayant pas de primes, je trouve
'#Erreur' à la place du montant des primes alors que je voudrais '0'

J'ai essayé de remplacer "Prime.MtPrime" par des trucs du genre
VraiFaux(Isnull(Prime.MtPrime);0;Prime.MtPrime) ou iserror,.. mais sans
réussite.

Alors si quelqu'un a une idée, merci de m'en faire profiter...

4 réponses

Avatar
Raymond [mvp]
Bonjour.

ta requête me semble correcte et ça ne vient d'elle mais des valeurs Null
rencontrées dans la table prime. pour parer à toutes les erreurs utilise la
fonction Nz pour remplacer la valeur Null par 0.
Mavariable = Nz(MtPrime,0) *2 + Nz(MtPrime1,0)


--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://OfficeSystem.Access.free.fr/runtime/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Thierry Giraud" a écrit dans le
message de news:
Bonjour,

J'ai 2 tables : une table "Agent", pour laquelle j'ai tous mes agents avec
leur salaire mensuel, et une table "Prime", pour laquelle j'ai une ou
plusieurs primes pour certains agents.

Voici la requete executée :
SELECT Agent.Cle, Agent.Nom, Agent.Prenom, Agent.MtBrut, Prime.MtPrime
FROM Agent LEFT JOIN Prime ON (Agent.Cle = Prime.Ag_num);
qui me donne une ou plusieurs lignes par agents

Mon souci : Pour les agents n'ayant pas de primes, je trouve
'#Erreur' à la place du montant des primes alors que je voudrais '0'

J'ai essayé de remplacer "Prime.MtPrime" par des trucs du genre
VraiFaux(Isnull(Prime.MtPrime);0;Prime.MtPrime) ou iserror,.. mais sans
réussite.

Alors si quelqu'un a une idée, merci de m'en faire profiter...



Avatar
Maxence HUBICHE
Hello Thierry,

Bizarre bizarre quand même ton truc ... :s
Ta requête est bien basée sur 2 tables ? Ce ne serait pas Une table plus
une requête plutôt ? voire même 2 requêtes ?
Cela ne devrait pas te renvoyer #ERREUR, mais NULL (donc, une case blanche),
ou alors, il y a des informations supplémentaires dans ton champ (une zone
de liste, un truc comme cela...
Pourquoi je dis cela :
- Parce que si tu as bien une table, ta requête, en cas de non-correspondance,te
renverras un NULL dans Prime.MTPrime
- Parce que ta requête n'a pas de champs calculés, et que les #erreur sont
consécutifs à une erreur dans un calcul
- Parce que ton SQL n'indique aucun regroupement de quelque sorte que ce
soit, ce qui fait q'uil n'y a pas de risque d'erreur de ce côté là non plus.

Donc, où est le loup ?
- Soit le SQL que tu nous a mis n'est pas complet.
- Soit tu te bases sur autre chose qu'une série de tables
- Soit tu as une définition de champs (au niveau des propriétés) qui est
un peu particulière sur ce champ.

Voilà.
Reviens nous donner des nouvelles ;)

================== Maxence HUBICHE

MVP Access
Revendeur CaseStudio (http://www.casestudio.fr)
Responsable Access sur http://www.developpez.com
La plus grosse FAQ Access du Web : http://access.developpez.com/faq

Bonjour,

J'ai 2 tables : une table "Agent", pour laquelle j'ai tous mes agents
avec leur salaire mensuel, et une table "Prime", pour laquelle j'ai
une ou plusieurs primes pour certains agents.

Voici la requete executée :
SELECT Agent.Cle, Agent.Nom, Agent.Prenom, Agent.MtBrut, Prime.MtPrime
FROM Agent LEFT JOIN Prime ON (Agent.Cle = Prime.Ag_num);
qui me donne une ou plusieurs lignes par agents
Mon souci : Pour les agents n'ayant pas de primes, je trouve '#Erreur'
à la place du montant des primes alors que je voudrais '0'

J'ai essayé de remplacer "Prime.MtPrime" par des trucs du genre
VraiFaux(Isnull(Prime.MtPrime);0;Prime.MtPrime) ou iserror,.. mais
sans réussite.

Alors si quelqu'un a une idée, merci de m'en faire profiter...



Avatar
Thierry Giraud
Salut Maxence,

Bien vu, ce ne sont pas des tables, mais 2 requêtes !
Et effectivement, en essayant de faire une base simple (telle que décrite
dans le post), il n'y a pas d'erreur ! Conclusion, il faut que je regarde
d'un peu plus près comment je calcul le montant des primes dans ma
sous-requête...

Merci pour tes infos, celles-ci vont me permettre de regarder plus
précisement d'où vient mon erreur.
Si toutefois je n'arrive toujours pas à le résoudre, je ferais un nouveau
post plus complet...


Hello Thierry,

Bizarre bizarre quand même ton truc ... :s
Ta requête est bien basée sur 2 tables ? Ce ne serait pas Une table plus
une requête plutôt ? voire même 2 requêtes ?
Cela ne devrait pas te renvoyer #ERREUR, mais NULL (donc, une case blanche),
ou alors, il y a des informations supplémentaires dans ton champ (une zone
de liste, un truc comme cela...
Pourquoi je dis cela :
- Parce que si tu as bien une table, ta requête, en cas de non-correspondance,te
renverras un NULL dans Prime.MTPrime
- Parce que ta requête n'a pas de champs calculés, et que les #erreur sont
consécutifs à une erreur dans un calcul
- Parce que ton SQL n'indique aucun regroupement de quelque sorte que ce
soit, ce qui fait q'uil n'y a pas de risque d'erreur de ce côté là non plus.

Donc, où est le loup ?
- Soit le SQL que tu nous a mis n'est pas complet.
- Soit tu te bases sur autre chose qu'une série de tables
- Soit tu as une définition de champs (au niveau des propriétés) qui est
un peu particulière sur ce champ.

Voilà.
Reviens nous donner des nouvelles ;)

================== > Maxence HUBICHE

MVP Access
Revendeur CaseStudio (http://www.casestudio.fr)
Responsable Access sur http://www.developpez.com
La plus grosse FAQ Access du Web : http://access.developpez.com/faq

Bonjour,

J'ai 2 tables : une table "Agent", pour laquelle j'ai tous mes agents
avec leur salaire mensuel, et une table "Prime", pour laquelle j'ai
une ou plusieurs primes pour certains agents.

Voici la requete executée :
SELECT Agent.Cle, Agent.Nom, Agent.Prenom, Agent.MtBrut, Prime.MtPrime
FROM Agent LEFT JOIN Prime ON (Agent.Cle = Prime.Ag_num);
qui me donne une ou plusieurs lignes par agents
Mon souci : Pour les agents n'ayant pas de primes, je trouve '#Erreur'
à la place du montant des primes alors que je voudrais '0'

J'ai essayé de remplacer "Prime.MtPrime" par des trucs du genre
VraiFaux(Isnull(Prime.MtPrime);0;Prime.MtPrime) ou iserror,.. mais
sans réussite.

Alors si quelqu'un a une idée, merci de m'en faire profiter...








Avatar
Thierry Giraud
Tout d'abord, merci pour ta réponse.

Avec ton message et celui de Maxence, je me suis rendu compte que je devais
avoir fait une erreur dans le calcul du montant des primes dans ma
sous-requête. Je vais de ce pas essayer de le résoudre, et idem que pour
Maxence, si avec l'aide que vous m'avez déjà apporté je n'arrive toujours
pas à solutionner mon problème je ferais un nouveau post plus complet...


Bonjour.

ta requête me semble correcte et ça ne vient d'elle mais des valeurs Null
rencontrées dans la table prime. pour parer à toutes les erreurs utilise la
fonction Nz pour remplacer la valeur Null par 0.
Mavariable = Nz(MtPrime,0) *2 + Nz(MtPrime1,0)


--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://OfficeSystem.Access.free.fr/runtime/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Thierry Giraud" a écrit dans le
message de news:
Bonjour,

J'ai 2 tables : une table "Agent", pour laquelle j'ai tous mes agents avec
leur salaire mensuel, et une table "Prime", pour laquelle j'ai une ou
plusieurs primes pour certains agents.

Voici la requete executée :
SELECT Agent.Cle, Agent.Nom, Agent.Prenom, Agent.MtBrut, Prime.MtPrime
FROM Agent LEFT JOIN Prime ON (Agent.Cle = Prime.Ag_num);
qui me donne une ou plusieurs lignes par agents

Mon souci : Pour les agents n'ayant pas de primes, je trouve
'#Erreur' à la place du montant des primes alors que je voudrais '0'

J'ai essayé de remplacer "Prime.MtPrime" par des trucs du genre
VraiFaux(Isnull(Prime.MtPrime);0;Prime.MtPrime) ou iserror,.. mais sans
réussite.

Alors si quelqu'un a une idée, merci de m'en faire profiter...