Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 18/10/2011, 12h08   #1
Invité de passage
 
Inscription : février 2006
Messages : 16
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 16
Points : 1
Points : 1
Par défaut Calcul dans fonction récursive

Bonjour,

J'ai une fonction récursive qui fonctionne très bien pour afficher mes données :

Code :
1
2
3
4
5
<% SET LIGNESnomenc = oCon.execute("SELECT a.codecompo, a.designation, LEVEL, a.codenomenc,a.quantite,b.type  
FROM MABASE.LIGNENOMENCLATURE a inner join MABASE.article b on b.code=a.codecompo 
where a.codecompo  is not null and b.type='N' 
START WITH a.codenomenc = '"&lignescde(6)&"' 
CONNECT BY PRIOR a.codecompo = a.codenomenc ")%>
Mon problème est que je dois faire des calculs :
- la quantité du niveau 2 doit être multipliée par la quantité du niveau 1
- la quantité du niveau 3 doit être multipliée par la quantité du niveau 2 puis multipliée par la quantité du niveau 1
Mais je peux avoir 2 niveaux 2 pour un seul niveau 1 et là ça ne fonctionne plus, puisqu'il multiplie par le niveau 3 précédent, il ne reprend pas au niveau 1 correspondant :

Level | Qté | Total

1 | |600
2 |1 |600
3 |0.001 |0.6
2 |1 |0.6 =>ERREUR : résultat attendu = 600
3 |0.001 |0 =>ERREUR : résultat attendu = 0.6
1 | |600
2 |1 |600
3 |0.001 |0.6
2 |1 |0.6 =>ERREUR : résultat attendu = 600
3 |0.001 |0 =>ERREUR : résultat attendu = 0.6

Houla, je ne sais pas si c'est bien clair tout ça ! ;-)
Quelqu'un aurait une idée ?
caroletexier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 14h03   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
avec sys_connect_by_path, et une fonction qui fait un execute immediate de la chaine.

Code :
TO_NUMBER(EXECUTE_REQUETE('select 1'||SYS_CONNECT_BY_PATH(NVL(qte,1),'*')||' from dual')) qte
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 15h24   #3
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
Si on ne veut pas avoir à créer une fonction stockée (par exemple, parce qu'on n'a pas le droit), on peut aussi ajouter du scalaire hiérarchique, avec un :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
WITH LIGNENOMENCLATURE AS (
  SELECT 10 AS codecompo, 1 AS codenomenc, 600 AS quantite FROM DUAL
  UNION ALL
  SELECT 21 AS codecompo, 10 AS codenomenc, 1 AS quantite FROM DUAL
  UNION ALL
  SELECT 22 AS codecompo, 10 AS codenomenc, 0.1 AS quantite FROM DUAL
  UNION ALL
  SELECT 211 AS codecompo, 21 AS codenomenc, 0.01 AS quantite FROM DUAL
  UNION ALL
  SELECT 212 AS codecompo, 21 AS codenomenc, 0.05 AS quantite FROM DUAL
  UNION ALL
  SELECT 221 AS codecompo, 22 AS codenomenc, 0.5 AS quantite FROM DUAL
)
SELECT a.codecompo
      ,LEVEL
      ,a.codenomenc
      ,a.quantite
      ,(SELECT exp(sum(ln(abis.quantite))) FROM lignenomenclature abis START WITH abis.codecompo = a.codecompo CONNECT BY PRIOR abis.codenomenc = abis.codecompo) AS Total 
FROM LIGNENOMENCLATURE a 
WHERE a.codecompo  IS NOT NULL 
START WITH a.codenomenc = '1' 
CONNECT BY PRIOR a.codecompo = a.codenomenc
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 22h49   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Pour différentes approches de produit cummulé regarde :
[Info] Produit cumulative en sql
J'ai mis à jour ce post notamment avec un exemple de l'approche de MCM.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h24.


 
 
 
 
Partenaires

Hébergement Web