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

Développement SQL Server Discussion :

Requête récursive pour le parcours d'une nomenclature produit [2012]


Sujet :

Développement SQL Server

  1. #1
    Membre éclairé
    Avatar de Asdorve
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 332
    Points : 718
    Points
    718
    Par défaut Requête récursive pour le parcours d'une nomenclature produit
    Bonjour,

    J'essaye de faire une requête récursive pour éclater la nomenclature d'un produit. Voici la requête qui fonctionne:

    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
     
    with
    	tree (code_fils, cc_fils, code_pere, cc_pere, qté_pere, BOMLevel)
    	AS (SELECT ComponentCode, AdditionalComponentCode, FinishedItemCode, FinishedAdditionalItemCode, ComponentQuantity, 0 as BOMLevel
    		FROM Production.BomRange I
    		WHERE FinishedItemCode = 'PK4512' AND FinishedAdditionalItemCode='9010'
    		UNION ALL
    		SELECT ComponentCode, AdditionalComponentCode, FinishedItemCode, FinishedAdditionalItemCode, ComponentQuantity,        BOMLevel + 1
    		FROM  Production.BomRange V
     
    			INNER JOIN tree t 
                     ON (t.code_fils = FinishedItemCode AND t.cc_fils = FinishedAdditionalItemCode )
    				 )
     
    	SELECT * FROM tree ;
    Cela fonctionne. Cependant, je n'arrive pas à gérer les quantités des niveaux inférieur, qui doit être la multiplication du niveau X par le niveau X+1.

    Par exemple, si mon composant point de départ est en quantité 1:
    Le sous composant 1 a une valeur de 2 unités
    Le sous composant 2 a une valeur de 5 unités

    si mon composant point de départ est en quantité 2:
    Le sous composant 1 a une valeur de 4 unités
    Le sous composant 2 a une valeur de 10 unités

    J'ai essayé différentes choses, mais la requête plante.

    auriez-vous une suggestion à faire?

    Merci d'avance,

    Xav
    Xavier

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Donnez le DDL de vos tables SVP
    https://www.developpez.net/forums/d9...vement-poster/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre éclairé
    Avatar de Asdorve
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 332
    Points : 718
    Points
    718
    Par défaut
    Je ne sais pas si c'est ce que vous voulez:

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    USE [PMI]
    GO
     
    /****** Object:  Table [Production].[BomRange]    Script Date: 27/08/2021 16:13:42 ******/
    SET ANSI_NULLS ON
    GO
     
    SET QUOTED_IDENTIFIER ON
    GO
     
    CREATE TABLE [Production].[BomRange](
    	[Id] [int] IDENTITY(1,1) NOT NULL,
    	[Company] [nvarchar](3) NOT NULL,
    	[FinishedItemCode] [nvarchar](18) NOT NULL,
    	[FinishedAdditionalItemCode] [nvarchar](6) NOT NULL,
    	[LineNumber] [int] NOT NULL,
    	[ComponentCode] [nvarchar](18) NULL,
    	[AdditionalComponentCode] [nvarchar](6) NULL,
    	[OperationCode] [nvarchar](6) NULL,
    	[ManualSequencingValue] [decimal](14, 2) NOT NULL,
    	[QueueTimeBeforeWorkstation] [decimal](15, 3) NOT NULL,
    	[OperatorTime] [decimal](15, 3) NOT NULL,
    	[ComponentDescription] [nvarchar](40) NULL,
    	[ManufacturingLandmark] [nvarchar](4) NULL,
    	[SubcontractingLandmark] [nvarchar](4) NULL,
    	[StopOnCalculation] [bit] NOT NULL,
    	[ReplaceAdditionalItemCode] [int] NOT NULL,
    	[ForcedOrderManufacturingIndex] [nvarchar](3) NULL,
    	[IsSequencing] [bit] NOT NULL,
    	[ForcedManagementCode] [int] NOT NULL,
    	[ForcedValueKind] [nvarchar](1) NULL,
    	[ForcedValue] [decimal](15, 3) NOT NULL,
    	[ConsumptionUnit] [nvarchar](2) NULL,
    	[StartupQuantityOrTime] [decimal](15, 3) NOT NULL,
    	[QuantityFactor] [decimal](15, 3) NOT NULL,
    	[PreparationTime] [decimal](15, 3) NOT NULL,
    	[OverlapRate] [decimal](14, 2) NOT NULL,
    	[GroupingQuantity] [decimal](14, 2) NOT NULL,
    	[YieldRate] [decimal](14, 2) NOT NULL,
    	[QualityNoteCode] [nvarchar](20) NULL,
    	[OperationDesignCode] [nvarchar](20) NULL,
    	[MachiningProgramCode] [nvarchar](20) NULL,
    	[FormulaTypeExe] [nvarchar](1) NULL,
    	[FormulaNumber] [nvarchar](3) NULL,
    	[ReplacementComponentCode] [nvarchar](18) NULL,
    	[ReplacementAdditionalComponentCode] [nvarchar](6) NULL,
    	[ReplacementStartDate] [datetime] NULL,
    	[ReplacementEndDate] [datetime] NULL,
    	[Tooling] [nvarchar](20) NULL,
    	[ToolingLocation] [nvarchar](10) NULL,
    	[CreationDate] [datetime] NOT NULL,
    	[ModificationDate] [datetime] NULL,
    	[OperatorCount] [decimal](15, 2) NOT NULL,
    	[MachineSetterCount] [decimal](15, 2) NOT NULL,
    	[ComponentQuantity] [decimal](15, 6) NOT NULL,
    	[Skill] [nvarchar](6) NULL,
    	[UseEquivalency] [bit] NOT NULL,
    	[LineOriginKind] [int] NOT NULL,
    	[ValidityStartDate] [datetime] NULL,
    	[ValidityEndDate] [datetime] NULL,
    	[ProductionUnitCode] [nvarchar](6) NULL,
    	[OperationKind] [nvarchar](6) NULL,
    	[LastUser] [nvarchar](4) NULL,
    	[RowVersion] [int] NOT NULL,
     CONSTRAINT [PK_Production.BomRange] PRIMARY KEY CLUSTERED 
    (
    	[Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    Xavier

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    with
    	tree (code_fils, cc_fils, code_pere, cc_pere, qte_pere, BOMLevel)
    	AS (SELECT ComponentCode, AdditionalComponentCode, FinishedItemCode, FinishedAdditionalItemCode, CAST(ComponentQuantity AS BIGINT) AS ComponentQuantity, 0 as BOMLevel
    		FROM   Production.BomRange I
    		WHERE  FinishedItemCode = 'PK4512' AND FinishedAdditionalItemCode='9010'
    		UNION  ALL
    		SELECT ComponentCode, AdditionalComponentCode, FinishedItemCode, FinishedAdditionalItemCode, ComponentQuantity * qte_pere, BOMLevel + 1
    		FROM   Production.BomRange V
                   INNER JOIN tree t 
                         ON t.code_fils = FinishedItemCode 
                            AND t.cc_fils = FinishedAdditionalItemCode
           )
    	SELECT * FROM tree ;
    Regardez si cela marche sinon, donnez le message d'erreur

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre éclairé
    Avatar de Asdorve
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 332
    Points : 718
    Points
    718
    Par défaut
    Bonjour,

    J'obtiens l'erreur suivante:

    Les types ne correspondent pas entre la partie d'ancrage et la partie récursive dans la colonne "qte_pere" de la requête récursive "tree"
    Xavier

  6. #6
    Membre éclairé
    Avatar de Asdorve
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 332
    Points : 718
    Points
    718
    Par défaut
    J'ai passé le type du CAST en FLOAT au lieu de BIGINT.
    Je n'ai pas l'erreur, je vais analyser les résultats remontés pour vérifier et je vous dis.
    Xavier

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    oui, c'est bon.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Membre éclairé
    Avatar de Asdorve
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 332
    Points : 718
    Points
    718
    Par défaut
    oui, les résultats sont corrects. Merci pour le coup de main.
    Xavier

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 16/02/2018, 17h25
  2. [AC-2010] Requête récursive pour parcourir une nomenclature
    Par Philippe PONS dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/07/2014, 09h48
  3. Requête récursive pour parcourir une nomenclature (Suite)
    Par Philippe PONS dans le forum Développement
    Réponses: 4
    Dernier message: 03/07/2014, 14h09
  4. [2012] Requête récursive pour parcourir une nomenclature
    Par Philippe PONS dans le forum Développement
    Réponses: 3
    Dernier message: 03/07/2014, 09h36
  5. Réponses: 2
    Dernier message: 22/01/2010, 11h34

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