Problème Script sql developer Oracle

Problème Script sql developer Oracle - SQL/NoSQL - Programmation

Marsh Posté le 10-12-2014 à 12:40:38    

Bonjour,  
 
Je suis assez débutant sur SQL Developper et j'aimerai avoir votre aide svp.
 
Dans une requête

Code :
  1. SELECT Donnée1, Donnée2, Donnée3, Donnée4, Donnée5, Donnée6, Donnée7, Donnée8, Donnée9, Donnée10, Donnée11, Donnée12, Donnée13, Donnée14, Donnée15, Donnée16, Donnée17, Donnée18
  2. from
  3. (
  4. select
  5. h.doccode as Donnée1,
  6. d.name as Donnée2,
  7. TRIM(h.docnum) as Donnée3,
  8. to_char (h.inpdate, 'YYYYMMDD') as Donnée4,
  9. l.el1 as Donnée5,
  10. cpt.name as Donnée6,
  11. l.el2 as Donnée7,
  12. aux.name as Donnée8,
  13. NVL (concat(h.doccode, h.docnum), l.ref1) as Donnée9, 
  14. to_char (h.docdate, 'YYYYMMDD') as Donnée10,
  15. replace(replace(h.descr,';','-'),'|','-') as Donnée11,
  16. ABS(l.valuehome) as Donnée12,
  17. decode(l.deb_cred_ind,160,'C','D') as Donnée13,
  18. pay.matchref as Donnée14,
  19. to_char (l.paydate, 'YYYYMMDD') as Donnée15,
  20. to_char (h.inpdate, 'YYYYMMDD') as Donnée16,
  21. ABS(l.valuedoc) as Donnée17,
  22. h.curdoc as Donnée18
  23. from Table1 h , Table2 l, Table3 d, Table4 cpt, Table5 aux, Table6 pay
  24. where h.cmpcode=l.cmpcode
  25. and h.cmpcode=d.cmpcode
  26. and h.cmpcode=cpt.cmpcode
  27. and h.cmpcode=aux.cmpcode
  28. and l.cmpcode=pay.cmpcode(+)
  29. and l.doccode=pay.doccode(+)
  30. and l.docnum=pay.docnum(+)
  31. and l.doclinenum=pay.doclinenum(+)
  32. and h.yr=2011
  33. and h.inpdate < '20/01/2011'
  34. and h.doccode=l.doccode
  35. and h.docnum=l.docnum
  36. and h.doccode=d.code
  37. and cpt.code=l.el1
  38. and cpt.elmlevel=1
  39. and aux.code=l.el2
  40. and aux.elmlevel=2
  41. order by inpdate);


 
Mon premier problème au niveau de cette ligne :

Code :
  1. NVL (concat(h.doccode, h.docnum), l.ref1) as Donnée9,


 
Je veux que : Si Donnée9 est vide, concaténer doccode et docnum.
 
Mais le problème c'est qu'il fait un concaténer pour toutes les colonnes Donnée9 même ceux qui présentent une valeur.
 
Mon second problème au niveau de cette ligne :

Code :
  1. ABS(l.valuedoc) as Donnée17,


 
Ce que je veux, c'est qu'il me prend la valeur absolue de Donnée17 avec les décimales.
 
Mais le problème c'est qu'il ne prend pas les décimales, mais que les entiers.
 
Pouvez-vous m'aider svp ?
 
Merci d'avance

Reply

Marsh Posté le 10-12-2014 à 12:40:38   

Reply

Marsh Posté le 10-12-2014 à 12:59:02    

Premier point
il n'est pas clair "si Donnée9 est vide" tu veux dire si l.ref1 est null, plutôt, non ?
 
Je ferais (utilisation de coalesce plutôt que NVL, qui est du pur Oracle).  
Mais je pense que ton problème vient seulement de l'ordre des paramètres de NVL.
 

Code :
  1. coalesce(l.ref1, concat(h.doccode, h.docnum)) as Donnée9


 
ou si ce n'est pas forcément null que tu veux remplacer, mais aussi un string avec uniquement des espaces
 

Code :
  1. case when l.ref1 is null or trim(l.ref1) = '' then concat(h.doccode, h.docnum) else l.ref1 end as Donnée9


 
 
Deuxième point
ABS ne supprime pas les décimales, donc ton problème doit venir d'ailleurs.
 
 
De manière générale
Les jointures avec les =xxx(+) sont franchement à oublier. C'est une vieillerie d'Oracle à éviter le plus possible.
 
Idem pour les autres jointures.
Il ne devrait y avoir qu'une table dans la clause FROM et des INNER JOIN, LEFT JOIN ou RIGHT JOIN pour les tables liées.


Message édité par deliriumtremens le 10-12-2014 à 13:00:09
Reply

Marsh Posté le 10-12-2014 à 14:53:57    

Merci beaucoup c'est très gentil.
 
Premier Point
 
Désolé, j'ai mal expliqué. C'est effectivemment ce que je voulais dire.
 
La valeur de l.ref1 n'est pas forcément null, donc j'ai utilisé ton 2ème code  
 
[cpp]
case when l.ref1 is null or trim(l.ref1) = '' then concat(h.doccode, h.docnum) else l.ref1 end as Donnée9
[cpp]
 
Mais voila ce que j'ai eu comme message :
 

ORA-00923: mot-clé FROM absent à l'emplacement prévu
00923. 00000 -  "FROM keyword not found where expected"
*Cause:    
*Action:
Erreur à la ligne 14, colonne 13


 
Deuxieme point
 
Le probléme des décimales peut être dû à quoi à votre avis ? sachant que le type de la colonne est NUMBER  
 
D'avance merci,


Message édité par adilson le 10-12-2014 à 14:55:49
Reply

Marsh Posté le 10-12-2014 à 16:16:38    

Point1  
il ne faut pas oublier la virgule à la fin de la ligne (après le as Donnée9 )
 
Point2
Dans ta base, tu as des décimales dans ce champ (si tu fais une requête simple sur la table) ?
Cette colonne est en NUMBER (tout court), pas de precision ou de scale spécifié ?

Reply

Marsh Posté le 10-12-2014 à 17:15:35    

Oups, j'avais oublié la virgule.
 
Donc merci beaucoup ça marche pour le premier point.
 
Concernant le Point 2 : J'ai bien des décimales dans le champ, et la colonne est en NUMBER tout court !
 
et si je fais une requête simple sur cette table j'ai pas le résultat non plus. C'est bizzar !
 

Reply

Marsh Posté le 11-12-2014 à 14:51:55    

Merci beaucoup pour ton aide deliriumtremens.


Message édité par adilson le 11-12-2014 à 14:52:11
Reply

Marsh Posté le 11-12-2014 à 15:05:14    

Mais c'est volontiers... Tu as vaincu le mystère des décimales disparues ?

Reply

Marsh Posté le 12-12-2014 à 09:42:04    

Oui je l'ai vaincu   :bounce:  
 
Par contre la c'est un autre souci que j'ai, je sais pas si tu pourrai m'aider  :)  
 
J'aimerai savoir comment forcer l'affichage des décimales quand le nombre est entier (Quand 5 m'afficher 5,00) sans utiliser TO_CHAR.
 
Puisque quand j'utilise TO_CHAR le format de mes données change en caractères alors que je les veux en format nombre.
 
Je te remercie d'avance pour ton retour.

Reply

Marsh Posté le 12-12-2014 à 10:41:33    

Hmmm, pas moyen je crois.
 
Cela dit, l'affichage des décimales devrait se faire au "dernier moment"... ou au niveau applicatif.
 

Reply

Sujets relatifs:

Leave a Replay

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