[SQL] pb de selection...

pb de selection... [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 28-10-2005 à 08:45:14    

Salut à tous!
 
Voila mon pb. Ma requete SQL est la suivante :  
 
SELECT com_cdeent.type_cde, com_cdeent.no_cde, com_cdeent.dte_cde, bas_cli.rais_soc, com_cderep.no_repres, com_cdelig.dte_livrp, com_cdelig.no_lieu, com_cdelig.no_art, com_cdelig.design, com_cdelig.qte_cde, com_cdelig.qte_livr, com_cdelig.prx_unit, (com_cdelig.qte_cde-com_cdelig.qte_livr)*prx_unit, ((com_cdelig.tothtlig*(com_cdelig.qte_cde-com_cdelig.qte_livr))/com_cdelig.qte_cde)
FROM bas_cli, com_cdeent, com_cdelig, com_cderep
WHERE com_cdeent.no_cli = bas_cli.no_cli AND com_cdelig.no_cde = com_cdeent.no_cde AND com_cdelig.no_cde = com_cderep.no_cde AND ((com_cdeent.type_cde=?) AND (com_cdeent.no_cli=bas_cli.no_cli) AND (com_cdeent.no_cde=com_cdelig.no_cde And com_cdeent.no_cde=com_cderep.no_cde And com_cdeent.no_cde=com_cderep.no_cde) AND (com_cdelig.qte_cde<>com_cdelig.qte_livr) AND (com_cdeent.etat_cde Not In (3,5,6)) AND (com_cdelig.etat_lig<>"6" ) OR (com_cdeent.type_cde=?) AND (com_cdeent.no_cli=bas_cli.no_cli) AND (com_cdeent.no_cde=com_cdelig.no_cde And com_cdeent.no_cde=com_cderep.no_cde And com_cdeent.no_cde=com_cderep.no_cde) AND (com_cdelig.qte_cde<>com_cdelig.qte_livr) AND (com_cdeent.etat_cde Not In (3,5,6)) AND (com_cdelig.etat_lig<>"6" ))
ORDER BY com_cdeent.type_cde, com_cdelig.dte_livrp, com_cdeent.no_cde, com_cdelig.no_lig
 
Le pb est le suivant : je souhaite au travers de cette requete faire afficher le nom des représentants. La requete m'affiche certaines commandes avec les représentants comme je le souhaite, mais seulement pour les commandes possédant un représentant!!!Or certaines commandes n'ont pas de représentants. Du coup, toutes ces commandes sont zappées par la requete et j'obtiens un résultat faux....Si quelqu'un pouvait me dire comment je peux obtenir toutes les commandes, en affichant un blanc dans la case représentant si la commande en question n'a pas de représentant, sa m'aiderai beaucoup!
 
Merci d'avance ;)

Reply

Marsh Posté le 28-10-2005 à 08:45:14   

Reply

Marsh Posté le 28-10-2005 à 08:48:37    

sans avoir lu ton code je pense qu'un left join dans le from peut etre ton ami (au lieu de faire ta jointure dans le where)

Reply

Marsh Posté le 28-10-2005 à 08:59:13    

et sa marche comment les left join ( j'en ai jamais utilizé, jdébute!!!) ???

Reply

Marsh Posté le 28-10-2005 à 09:13:56    

select * from table1 left join table2 on table1.chp=table2.chp
 
selectionne tous les enregistrements de table1 + ceux de table2 correspondant au critere de jointure table1.chp=table2.chp
 
ce qui fait que les enregistrements de table1 n ayant pas de correpondance avec ceux de table2 apparaitront quand meme

Reply

Marsh Posté le 28-10-2005 à 09:54:35    

Le pb c'est que je ne dois pas sélectionner qu'un seul champ. Et mes tables sont également issus d'un logiciel de gestion de prod. Je ne sais pas si cela à une quelconque influence...en tout cas, je n'ai pas réussi. Cela me renvoie un message d'erreur.

Reply

Marsh Posté le 28-10-2005 à 11:04:49    

Reexplication! dsl de vous embéter encore!:s
 
La requete est donc exactement la suivante :  
 
SELECT com_cdeent.type_cde, com_cdeent.no_cde, com_cdeent.dte_cde, bas_cli.rais_soc, com_cdelig.design, com_cdelig.dte_livrp, com_cdelig.no_art, com_cdelig.no_lieu, com_cdelig.no_lig, com_cdelig.prx_unit, com_cdelig.qte_cde, com_cdelig.qte_livr, com_cdelig.tothtlig, com_cderep.no_repres
FROM soc1_precix:informix.bas_cli bas_cli, soc1_precix:informix.com_cdeent com_cdeent, soc1_precix:informix.com_cdelig com_cdelig, soc1_precix:informix.com_cderep com_cderep
WHERE com_cdeent.no_cli = bas_cli.no_cli AND com_cdelig.no_cde = com_cdeent.no_cde AND com_cderep.no_cde = com_cdeent.no_cde AND ((com_cdeent.type_cde=?) AND (com_cdelig.qte_cde<>com_cdelig.qte_livr) AND (com_cdeent.etat_cde<>3 And com_cdeent.etat_cde<>5 And com_cdeent.etat_cde<>6) AND (com_cdelig.etat_lig<>6) OR (com_cdeent.type_cde=?) AND (com_cdelig.qte_cde<>com_cdelig.qte_livr) AND (com_cdeent.etat_cde<>3 And com_cdeent.etat_cde<>5 And com_cdeent.etat_cde<>6) AND (com_cdelig.etat_lig<>6))
ORDER BY com_cdeent.type_cde, com_cdeent.dte_cde, com_cdeent.no_cde
 
Le champ no_repres peut parfois etre vide. C'est cela qui cause le pb. Du coup, toutes les commandes dont le champ

Reply

Marsh Posté le 28-10-2005 à 11:07:11    

dsl sa a beugué... je reprends :  
 
Le champ no_repres peut parfois etre vide. C'est cela qui cause le pb. Du coup, toutes les commandes dont le champ no_repres est vide sont supprimées. Quelqu'un pourrait me réécrire le passage avec le left join si c'est la solution?parce que j'ai essayé et waloo sa marche pa pr moi!!!
il faut obtenir toutes les commandes, avec un représentant vide s'il el faut...merci

Reply

Marsh Posté le 28-10-2005 à 11:23:57    

Alors déjà, on va réécrire ta requête illisible :D
 

Code :
  1. SELECT com_cdeent.type_cde,
  2.        com_cdeent.no_cde,
  3.        com_cdeent.dte_cde,
  4.        bas_cli.rais_soc,
  5.        com_cdelig.design,
  6.        com_cdelig.dte_livrp,
  7.        com_cdelig.no_art,
  8.        com_cdelig.no_lieu,
  9.        com_cdelig.no_lig,
  10.        com_cdelig.prx_unit,
  11.        com_cdelig.qte_cde,
  12.        com_cdelig.qte_livr,
  13.        com_cdelig.tothtlig,
  14.        com_cderep.no_repres
  15. FROM   soc1_precix:informix.bas_cli bas_cli,
  16.        soc1_precix:informix.com_cdeent com_cdeent,
  17.        soc1_precix:informix.com_cdelig com_cdelig,
  18.        soc1_precix:informix.com_cderep com_cderep
  19. WHERE  com_cdeent.no_cli = bas_cli.no_cli
  20. AND    com_cdelig.no_cde = com_cdeent.no_cde
  21. AND    com_cderep.no_cde = com_cdeent.no_cde
  22. AND    ((com_cdeent.type_cde=?)
  23.         AND (com_cdelig.qte_cde<>com_cdelig.qte_livr)
  24.         AND (com_cdeent.etat_cde<>3
  25.              AND com_cdeent.etat_cde<>5
  26.              AND com_cdeent.etat_cde<>6)
  27.         AND (com_cdelig.etat_lig<>6)
  28.         OR (com_cdeent.type_cde=?)
  29.         AND (com_cdelig.qte_cde<>com_cdelig.qte_livr)
  30.         AND (com_cdeent.etat_cde<>3
  31.              AND com_cdeent.etat_cde<>5
  32.              AND com_cdeent.etat_cde<>6)
  33.         AND (com_cdelig.etat_lig<>6))
  34. ORDER BY com_cdeent.type_cde,
  35.          com_cdeent.dte_cde,
  36.          com_cdeent.no_cde;


 
Pour le OR, tu es sûr de ton coup ? (juste une vérification, pour savoir)
 
Je ne vois pas no_repres dans les jointures ... donc je vois pas ce qui peut poser problème.

Reply

Marsh Posté le 28-10-2005 à 11:34:04    

En fait je suis parti d'un requete existante et que j'ai poussé plus loin. Et le OR y était déja. En fait, je crois que le OR intervient quand je met un critere sur le type de commande ( pour pouvoir restreindre le type de commande et pas toutes les avoir). C'est bien ça qui m'embete, c'est que je ne vois pas non + d'ou le pb vien!!!En fait, si je fais une requete sans la table com_cderep d'ou je tire le no_repres, j'ai toutes les commandes. Mais quand je fais la jointure entre cette table et la table com_cdeent au niveau de no_cde, c'est la que disparaisse certaines commandes...J'comprends pas!!!   NEED HELP PLEASE!!!!!!!

Reply

Marsh Posté le 28-10-2005 à 11:59:26    

Ben alors c'est la jointure sur no_cde qui pose le problème :)
Il doit y avoir des commandes dont le numéro n'est attaché à aucun représentant dans com_cderep.
 
Essaye ça :
 

Code :
  1. SELECT com_cdeent.type_cde,
  2.        com_cdeent.no_cde,
  3.        com_cdeent.dte_cde,
  4.        bas_cli.rais_soc,
  5.        com_cdelig.design,
  6.        com_cdelig.dte_livrp,
  7.        com_cdelig.no_art,
  8.        com_cdelig.no_lieu,
  9.        com_cdelig.no_lig,
  10.        com_cdelig.prx_unit,
  11.        com_cdelig.qte_cde,
  12.        com_cdelig.qte_livr,
  13.        com_cdelig.tothtlig,
  14.        com_cderep.no_repres
  15. FROM   soc1_precix:informix.bas_cli bas_cli,
  16.        soc1_precix:informix.com_cdeent com_cdeent,
  17.        soc1_precix:informix.com_cdelig com_cdelig
  18. LEFT JOIN soc1_precix:informix.com_cderep com_cderep ON com_cderep.no_cde = com_cdeent.no_cde
  19. WHERE  com_cdeent.no_cli = bas_cli.no_cli
  20. AND    com_cdelig.no_cde = com_cdeent.no_cde
  21. AND    ((com_cdeent.type_cde=?)
  22.         AND (com_cdelig.qte_cde<>com_cdelig.qte_livr)
  23.         AND (com_cdeent.etat_cde<>3
  24.              AND com_cdeent.etat_cde<>5
  25.              AND com_cdeent.etat_cde<>6)
  26.         AND (com_cdelig.etat_lig<>6)
  27.         OR (com_cdeent.type_cde=?)
  28.         AND (com_cdelig.qte_cde<>com_cdelig.qte_livr)
  29.         AND (com_cdeent.etat_cde<>3
  30.              AND com_cdeent.etat_cde<>5
  31.              AND com_cdeent.etat_cde<>6)
  32.         AND (com_cdelig.etat_lig<>6))
  33. ORDER BY com_cdeent.type_cde,
  34.          com_cdeent.dte_cde,
  35.          com_cdeent.no_cde;

Reply

Marsh Posté le 28-10-2005 à 11:59:26   

Reply

Marsh Posté le 28-10-2005 à 13:39:58    

arf! sa ne marche toujours pa.Enfin la, la requete ne veut meme pa se lancer. J'ai le droit à un message d'erreur : unknown error message -19819. Quelqu'un peut me dire pourquoi?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed