IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Calcul dans fonction récursive


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 16
    Points : 10
    Points
    10
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    avec sys_connect_by_path, et une fonction qui fait un execute immediate de la chaine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TO_NUMBER(EXECUTE_REQUETE('select 1'||SYS_CONNECT_BY_PATH(NVL(qte,1),'*')||' from dual')) qte

  3. #3
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    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.

Discussions similaires

  1. Pointeur dans fonction récursive
    Par Invité dans le forum Débuter
    Réponses: 3
    Dernier message: 15/07/2008, 16h33
  2. Pointeur int dans fonction récursive
    Par Invité dans le forum Débuter
    Réponses: 5
    Dernier message: 29/05/2008, 16h38
  3. Réponses: 6
    Dernier message: 24/11/2007, 18h48
  4. Fonction récursive dans une classe
    Par Orbiplanax dans le forum Langage
    Réponses: 4
    Dernier message: 17/10/2007, 16h24
  5. Réponses: 7
    Dernier message: 22/06/2007, 10h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo