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

Oracle Discussion :

Parcours de nomenclature et calcul des qtés


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2005
    Messages : 93
    Points : 38
    Points
    38
    Par défaut Parcours de nomenclature et calcul des qtés
    Bonjour,

    j'utilise la requête suivante pour parcourir une nomenclature.
    SELECT LPAD (To_Char (Level), 3, '0') || '.' || LPAD(' ', 2*Level) || Composant , quantite
    FROM Nomenclatures
    WHERE COMPOSANT LIKE '%'
    CONNECT BY (PRIOR Composant = Compose)
    START WITH Compose = '&code_article_complet';
    comment faire pour afficher la qté totale en prenant en compte les qté de chaque niveau ?

    exemple :
    niv 1 - qté niv = 1 - qte besoin = 1
    niv 2 - qté niv = 2 - qte besoin = 2
    niv 3 - qté niv = 1 - qte besoin = 2 << je veux la quantité du besoin


    merci d'avance.

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    la question n'est pas très claire, dans un exemple de valeur et surtout n'oublie pas de préciser la version

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE COMPOSANT LIKE '%'
    c'est sensé faire quoi?

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2005
    Messages : 93
    Points : 38
    Points
    38
    Par défaut
    sur la requête initiale, je filtre sur un type d'article...
    pour le débug, j'ai laissé % pour afficher toute la nomenclature...

    Oracle 8i release 8.1.7.0.0
    SQL Plus : 8.0.6.0.0

  5. #5
    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
    Il nous faudrait un pt'i jeu d'essai stp.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2005
    Messages : 93
    Points : 38
    Points
    38
    Par défaut
    voici un exemple avec le niveau, le code article et la qté du niveau:
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    000 PRODUIT_FINI_001   Qté niv = 1
    001   T08686  Qté niv =  .93 
    001   T08692  Qté niv =  .31 
    001   O#O39  Qté niv =  1 
    002     90-401_#P499  Qté niv =  1 
    002     90-401_#P500  Qté niv =  1 
    002     E01-110/85.5  Qté niv =  4 
    003       110_00_6000  Qté niv =  .0154 
    002     E01-92/43  Qté niv =  4 
    003       92_00_6700  Qté niv =  .0073 
    002     E63-20/10  Qté niv =  4 
    003       20_00_6700  Qté niv =  .00229 
    002     EXE001  Qté niv =  8 
    002     GOU88EP  Qté niv =  16 
    002     SPE-B1  Qté niv =  1 
    002     SPE-B1X  Qté niv =  1 
    002     SPE-E1  Qté niv =  2 
    001   R#R117  Qté niv =  2               
    002     422_#P42  Qté niv =  2        qté besoin devra être = 4 (qté produit fini * qté R#R117 * Qté 422_#P42 )
    002     422_#P44  Qté niv =  2        qté besoin devra être = 4
    001   R#R122  Qté niv =  4 
    002     IVR100  Qté niv =  .154575 
    002     P110  Qté niv =  5            qté besoin devra être = 20
    002     IP171  Qté niv =  1           qté besoin devra être = 4 
    002     VIS4.8*13  Qté niv =  12      qté besoin devra être = 48
    
    
    TABLE "NOMENCLATURE":
    COMPOSANT    NOT NULL VARCHAR2(40)
    COMPOSE      NOT NULL VARCHAR2(40)
    QUANTITE     NUMBER

  7. #7
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Bonjour,

    Tu peux nous donner le contenu de ta table Nomenclatures
    ?

  8. #8
    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
    Si j'ai bien compris :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    CREATE TABLE wmc_NOMENCLATURE
    (COMPOSANT    VARCHAR2(40),
    COMPOSE      VARCHAR2(40),
    QUANTITE     NUMBER
    )
     
     
    INSERT INTO wmc_Nomenclature(COMPOSANT, COMPOSE, QUANTITE)
    VALUES ('PRODUIT_FINI_001', 'ART1', 1);
     
    INSERT INTO wmc_Nomenclature(COMPOSANT, COMPOSE, QUANTITE)
    VALUES ('R122', 'PRODUIT_FINI_001', 4);
     
    INSERT INTO wmc_Nomenclature(COMPOSANT, COMPOSE, QUANTITE)
    VALUES ('P110', 'R122', 4);
     
    INSERT INTO wmc_Nomenclature(COMPOSANT, COMPOSE, QUANTITE)
    VALUES ('IP171', 'R122', 5);
     
    INSERT INTO wmc_Nomenclature(COMPOSANT, COMPOSE, QUANTITE)
    VALUES ('VIS4', 'R122', 12);
     
    INSERT INTO wmc_Nomenclature(COMPOSANT, COMPOSE, QUANTITE)
    VALUES ('R000', 'PRODUIT_FINI_001', 1);
     
    INSERT INTO wmc_Nomenclature(COMPOSANT, COMPOSE, QUANTITE)
    VALUES ('P110', 'R000', 4);
     
    INSERT INTO wmc_Nomenclature(COMPOSANT, COMPOSE, QUANTITE)
    VALUES ('IP171', 'R000', 5);
     
    INSERT INTO wmc_Nomenclature(COMPOSANT, COMPOSE, QUANTITE)
    VALUES ('VIS4', 'R000', 12);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	SELECT 	LEVEL AS niv, 
    			LPAD(' ', 2*LEVEL, '+ ') || Composant AS compo, 
    			quantite
    	FROM WMC_NOMENCLATURE
    	WHERE COMPOSANT LIKE '%' 
    	CONNECT BY (PRIOR Composant = Compose)
    	START WITH Compose = 'ART1'
    NIV COMPO QUANTITE [souhait]
    1 + PRODUIT_FINI_001 1 [ 1 ]
    2 + + R122 4 [ 1 x 4 (qte lev-1 x qte lev)]
    3 + + + P110 4 [ 1 x 4 x 4 = 16]
    3 + + + IP171 5 [ 1 x 4 x 5 = 20]
    3 + + + VIS4 12 [ 1 x 4 x 12 = 48 ]
    2 + + R000 1 [ 1 x 1 ]
    3 + + + P110 4 [ 1 x 1 x 4 = 4]
    3 + + + IP171 5 [ 1 x 1 x 5 = 5]
    3 + + + VIS4 12 [ 1 x 1 x 12 = 12]
    Donc faire une Somme des qte des level pour arriver à ce point.
    Sans curseur j'aurais du mal, j'ai regardé avec les fcts analytiques.. sans succès
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  9. #9
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    dans Oracle8, il te faudra écrire une fonction en plsql qui remonte les noeuds

    éventuellement (non testé en 8i)

    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
    24
    25
    26
    27
    28
    29
    30
    31
     
    alter session set "_new_connect_by_enabled"=TRUE; 
     
    create or replace function eval(s varchar2) 
        return number is i number;
        begin execute immediate 'select '||s||' from dual' into i;
        return i; end;
    /
     
    select to_char(level,'FM009'),ENAME,1||sys_connect_by_path(sal,'*') p, 
      eval(1||sys_connect_by_path(sal,'*')) besoin 
    from emp 
    connect by prior empno = mgr 
    start with ename='KING';
     
    TO_C ENAME      P                                  BESOIN
    ---- ---------- ------------------------- ---------------
    001  KING       1*5000                               5000
    002  JONES      1*5000*2975                      14875000
    003  SCOTT      1*5000*2975*3000              44625000000
    004  ADAMS      1*5000*2975*3000*1100      49087500000000
    003  FORD       1*5000*2975*3000              44625000000
    004  SMITH      1*5000*2975*3000*800       35700000000000
    002  BLAKE      1*5000*2850                      14250000
    003  ALLEN      1*5000*2850*1600              22800000000
    003  WARD       1*5000*2850*1250              17812500000
    003  MARTIN     1*5000*2850*1250              17812500000
    003  TURNER     1*5000*2850*1500              21375000000
    003  JAMES      1*5000*2850*950               13537500000
    002  CLARK      1*5000*2450                      12250000
    003  MILLER     1*5000*2450*1300              15925000000

    En 10g, c'est plus simple avec l'opérateur CONNECT_BY_ROOT

  10. #10
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    avec le create table de mcm ça donne
    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
     
    SQL> r
      1  select to_char(level,'FM009') niveau,
      2  LPAD(' ', 2*LEVEL)||Composant compos,
      3  quantite,
      4  eval(1||sys_connect_by_path(quantite,'*')) besoin
      5  FROM WMC_NOMENCLATURE
      6  CONNECT BY PRIOR Composant = Compose
      7* START WITH Compose = 'ART1'
    NIVE COMPOS                 QUANTITE          BESOIN
    ---- -------------------- ---------- ---------------
    001    PRODUIT_FINI_001            1               1
    002      R000                      1               1
    003        IP171                   5               5
    003        P110                    4               4
    003        VIS4                   12              12
    002      R122                      4               4
    003        IP171                   5              20
    003        P110                    4              16
    003        VIS4                   12              48

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2005
    Messages : 93
    Points : 38
    Points
    38
    Par défaut
    Merci pour votre aide, je vais tester...

  12. #12
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Bonjour,

    Voici la solution au problème sans utiliser la foction
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    /* Formatted on 2007/03/22 12:11 (Formatter Plus v4.8.8) */
    SELECT     *
          FROM (SELECT niv,
                       LPAD (' ', 2 * niv, '+ ') || nomenclature.composant compos,
                       nomenclature.composant, nomenclature.COMPOSE,
                       nomenclature.quantite * quantite_sup besoin_qte
                  FROM (SELECT DISTINCT LEVEL niv, composant, COMPOSE, quantite
                                   FROM nomenclature
                                  WHERE composant LIKE '%'
                             CONNECT BY PRIOR composant = COMPOSE
                             START WITH COMPOSE = 'ART1') nomenclature,
                       (SELECT DISTINCT LEVEL niv1, quantite quantite_sup,
                                        composant, COMPOSE
                                   FROM nomenclature
                                  WHERE composant LIKE '%'
                                    AND COMPOSE = nomenclature.COMPOSE
                             CONNECT BY (PRIOR nomenclature.COMPOSE =
                                                            nomenclature.composant
                                        )
                             START WITH nomenclature.composant = composant) nom
                 WHERE nom.composant = nomenclature.COMPOSE
                   AND nom.composant LIKE '%'
                UNION
                SELECT     LEVEL niv,
                              LPAD (' ', 2 * LEVEL, '+ ')
                           || nomenclature.composant compos,
                           composant, COMPOSE, quantite
                      FROM nomenclature
                     WHERE composant LIKE '%' AND LEVEL = 1
                CONNECT BY PRIOR composant = COMPOSE
                START WITH COMPOSE = 'ART1')
         WHERE composant LIKE '%'
    CONNECT BY PRIOR composant = COMPOSE
    START WITH COMPOSE = 'ART1'

  13. #13
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Citation Envoyé par salim11
    Bonjour,

    Voici la solution au problème sans utiliser la foction
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    /* Formatted on 2007/03/22 12:11 (Formatter Plus v4.8.8) */
    SELECT     *
          FROM /* selectionner l'aroborescence descendante père vers le fils */
                      (SELECT niv,
                       LPAD (' ', 2 * niv, '+ ') || nomenclature.composant compos,
                       nomenclature.composant, nomenclature.COMPOSE,
                       nomenclature.quantite * quantite_sup besoin_qte
                  FROM (SELECT DISTINCT LEVEL niv, composant, COMPOSE, quantite
                                   FROM nomenclature
                                  WHERE composant LIKE '%'
                             CONNECT BY PRIOR composant = COMPOSE
                             START WITH COMPOSE = 'ART1') nomenclature,
    /* selectionner l'aroborescence ascendante des fils vers le père*/
                       (SELECT DISTINCT LEVEL niv1, quantite quantite_sup,
                                        composant, COMPOSE
                                   FROM nomenclature
                                  WHERE composant LIKE '%'
                                    AND COMPOSE = nomenclature.COMPOSE
                             CONNECT BY (PRIOR nomenclature.COMPOSE =
                                                            nomenclature.composant
                                        )
                             START WITH nomenclature.composant = composant) nom
                 WHERE nom.composant = nomenclature.COMPOSE
                   AND nom.composant LIKE '%'
                UNION/* pour afficher le père */
                SELECT     LEVEL niv,
                              LPAD (' ', 2 * LEVEL, '+ ')
                           || nomenclature.composant compos,
                           composant, COMPOSE, quantite
                      FROM nomenclature
                     WHERE composant LIKE '%' AND LEVEL = 1
                CONNECT BY PRIOR composant = COMPOSE
                START WITH COMPOSE = 'ART1')
         WHERE composant LIKE '%'
    CONNECT BY PRIOR composant = COMPOSE
    START WITH COMPOSE = 'ART1'

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2005
    Messages : 93
    Points : 38
    Points
    38
    Par défaut
    Bonjour Salim11,

    je viens de tester ta proposition et j'ai le message d'erreur suivant :

    ERROR at line 8:
    ORA-01472: cannot use CONNECT BY on view with DISTINCT, GROUP BY, etc.

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2005
    Messages : 93
    Points : 38
    Points
    38
    Par défaut
    Après info, salim11 et en v10... et je suis en v8,
    d'où certainement l'origine du pb...

    merci pour votre aide...

Discussions similaires

  1. [Parcours Largeur d'abord][Calcul ensemble des partis] Je ne m'en sors pas
    Par bitou dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 10/05/2007, 03h41
  2. [DBA] Calcul des Statistiques sans privilèges DBA
    Par Krashtest dans le forum Administration
    Réponses: 14
    Dernier message: 06/05/2004, 16h08
  3. calculs des points
    Par rabi dans le forum OpenGL
    Réponses: 11
    Dernier message: 12/02/2004, 10h03
  4. Calcul des jours feriés
    Par obione dans le forum Langage
    Réponses: 5
    Dernier message: 07/11/2003, 12h36
  5. Calcul des numéros de semaine d'un calendrier
    Par Invité dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 06/11/2002, 21h29

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