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 parcourir une nomenclature (Suite)


Sujet :

Développement SQL Server

  1. #1
    Membre éprouvé
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Points : 1 166
    Points
    1 166
    Par défaut Requête récursive pour parcourir une nomenclature (Suite)
    Bonjour,

    Grâce à l'aide de F.Brouard, j'ai maintenant une requête qui donne les bons résultats sur un jeu de données bien précis.
    C'est à dire une table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE [dbo].[BOM3](
    	[BOM Number] [int] NULL,
    	[Item] [float] NULL,
    	[Mat Number] [int] NULL,
    	[Qty] [int] NULL
    ) ON [PRIMARY]
    Et le jeu de données suivant:
    BOM Number Item Mat Number Qty
    2000506 1 2000246 4
    2000837 1 2000246 7
    2001533 10 2000246 14
    2001780 10 2000246 4
    2002292 8 2000506 1
    2002565 2 2000837 1
    2000022 50 2001527 1
    2001527 10 2001528 1
    2001528 NULL 2001533 1
    2000022 20 2001770 1
    2001770 10 2001771 1
    2001771 NULL 2001772 1
    2001772 NULL 2001780 1
    2000246 2 2002005 1
    2002395 1 2002292 1
    2003496 10 2002395 1
    2002566 1 2002565 1
    2002875 1 2002566 1
    2003495 10 2002875 1
    2000022 60 2003495 1
    2000022 30 2003496 1

    On voit effectivement que les liens entre 2001528 et 2001533, et entre 2001771 et 2001772 étaient manquant.
    J'avais filtré la source de données pour avoir Item différents de zéro, mais ça m'a également exclus les item = NULL, or il faut les conserver.

    La véritable source de données est celle-ci:

    BOM Number Item Mat Number Qty
    2000246 0 2000246 1
    2000506 0 2000506 1
    2000837 0 2000837 1
    2001527 0 2001527 1
    2001528 0 2001528 1
    2001533 0 2001533 1
    2001770 0 2001770 1
    2001771 0 2001771 1
    2001772 0 2001772 1
    2001780 0 2001780 1
    2002292 0 2002292 1
    2002395 0 2002395 1
    2002565 0 2002565 1
    2002566 0 2002566 1
    2002875 0 2002875 1
    2003495 0 2003495 1
    2003496 0 2003496 1
    2000506 1 2000246 4
    2000837 1 2000246 7
    2002395 1 2002292 1
    2002566 1 2002565 1
    2002875 1 2002566 1
    2002565 2 2000837 1
    2000246 2 2002005 1
    2002292 8 2000506 1
    2001533 10 2000246 14
    2001780 10 2000246 4
    2001527 10 2001528 1
    2001770 10 2001771 1
    2003496 10 2002395 1
    2003495 10 2002875 1
    2000022 20 2001770 1
    2000022 30 2003496 1
    2000022 50 2001527 1
    2000022 60 2003495 1
    2001528 NULL 2001533 1
    2001771 NULL 2001772 1
    2001772 NULL 2001780 1


    Comment faire pour modifier la requête récursive pour qu'elle ne prenne pas en compte les lignes pour lesquelles Item=0, mais qu'elle prenne bien en compte celles avec Item=NULL?

    La requête:
    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 maBOM (PIECE_DEP, PIECE_ARV, STEPS, CHEMIN) 
    AS
       (SELECT DISTINCT [BOM Number], [Mat Number], 0, CAST([Mat Number] AS VARCHAR(MAX)) 
        FROM   BOM3
    	WHERE  [BOM Number]= '2000022'
     
        UNION  ALL
        SELECT [BOM Number], [Mat Number], b1.STEPS+1, 
    	       CAST(b1.CHEMIN AS VARCHAR(MAX)) + ', ' + CAST(b2.[Mat Number]  AS VARCHAR(MAX))  --Je cast, car mes colonnes sont en int
        FROM   maBOM AS b1
               INNER JOIN BOM3 AS b2
                     ON b1.PIECE_ARV = b2.[BOM Number]) 
    SELECT *
    FROM   maBOM
    WHERE PIECE_ARV='2002005'
    Merci d'avance pour votre aide.
    Philippe

  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 760
    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 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Philippe PONS Voir le message

    BOM Number Item Mat Number Qty
    2000246 0 2000246 1
    2000506 0 2000506 1
    2000837 0 2000837 1
    2001527 0 2001527 1
    2001528 0 2001528 1
    2001533 0 2001533 1
    2001770 0 2001770 1
    2001771 0 2001771 1
    2001772 0 2001772 1
    2001780 0 2001780 1
    2002292 0 2002292 1
    2002395 0 2002395 1
    2002565 0 2002565 1
    2002566 0 2002566 1
    2002875 0 2002875 1
    2003495 0 2003495 1
    2003496 0 2003496 1
    2000506 1 2000246 4
    2000837 1 2000246 7
    2002395 1 2002292 1
    2002566 1 2002565 1
    2002875 1 2002566 1
    2002565 2 2000837 1
    2000246 2 2002005 1
    2002292 8 2000506 1
    2001533 10 2000246 14
    2001780 10 2000246 4
    2001527 10 2001528 1
    2001770 10 2001771 1
    2003496 10 2002395 1
    2003495 10 2002875 1
    2000022 20 2001770 1
    2000022 30 2003496 1
    2000022 50 2001527 1
    2000022 60 2003495 1
    2001528 NULL 2001533 1
    2001771 NULL 2001772 1
    2001772 NULL 2001780 1
    SVP, respectez la charte de postage et donnez nous les ordres SQL INSERT INTO !

    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 éprouvé
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Points : 1 166
    Points
    1 166
    Par défaut
    Peut on les avoir automatiquement, grâce à une commande sql-server?
    Edit: ok, je regarde votre blog: Génération de commande INSERT avec les données d’une table

  4. #4
    Membre éprouvé
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Points : 1 166
    Points
    1 166
    Par défaut
    J'ai exécuté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE PROCEDURE P_RETRO_INSERTS
    La proc est bien dans ma base BOM_TEST
    Je l'exécute avec la commande intégrée: click droit/Exécuter la procédure stockée...
    J'ai le msg d'erreur suivant.
    La manip n'est pas bonne?
    Nom : Capture02.jpg
Affichages : 365
Taille : 30,8 Ko

    En fait la commande intégrée plante, car elle ne prend pas schema_name et table_name.
    J'ai ajouté ces 2 paramètres à la main dans la requête générée.

    Mais idem avec cette instruction:
    Nom : Capture03.jpg
Affichages : 338
Taille : 19,9 Ko

    Merci d'avance.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Points : 1 166
    Points
    1 166
    Par défaut
    Voici le script pour créer la table BOM3, et lui ajouter les données.
    Avec les lignes avec Item = 0, le requête sort en erreur: L'instruction a été terminée. La récursivité maximale 100 a été épuisée avant la fin de l'instruction.
    Après avoir supprimé ces lignes, elle fourni les résultats attendus.

    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
    CREATE TABLE [dbo].[BOM3](
    	[BOM Number] [int] NULL,
    	[Item] [int] NULL,
    	[Mat Number] [int] NULL,
    	[Qty] [int] NULL
    ) ON [PRIMARY]
     
    BEGIN TRANSACTION;
    INSERT INTO [dbo].[BOM3]([BOM Number], [Item], [Mat Number], [Qty])
    SELECT 2000022, 20, 2001770, 1 UNION ALL
    SELECT 2000022, 30, 2003496, 1 UNION ALL
    SELECT 2000022, 50, 2001527, 1 UNION ALL
    SELECT 2000022, 60, 2003495, 1 UNION ALL
    SELECT 2000246, 0, 2000246, 1 UNION ALL
    SELECT 2000246, 2, 2002005, 1 UNION ALL
    SELECT 2000506, 0, 2000506, 1 UNION ALL
    SELECT 2000506, 1, 2000246, 4 UNION ALL
    SELECT 2000837, 0, 2000837, 1 UNION ALL
    SELECT 2000837, 1, 2000246, 7 UNION ALL
    SELECT 2001527, 0, 2001527, 1 UNION ALL
    SELECT 2001527, 10, 2001528, 1 UNION ALL
    SELECT 2001528, 0, 2001528, 1 UNION ALL
    SELECT 2001528, NULL, 2001533, 1 UNION ALL
    SELECT 2001533, 0, 2001533, 1 UNION ALL
    SELECT 2001533, 10, 2000246, 14 UNION ALL
    SELECT 2001770, 0, 2001770, 1 UNION ALL
    SELECT 2001770, 10, 2001771, 1 UNION ALL
    SELECT 2001771, 0, 2001771, 1 UNION ALL
    SELECT 2001771, NULL, 2001772, 1 UNION ALL
    SELECT 2001772, 0, 2001772, 1 UNION ALL
    SELECT 2001772, NULL, 2001780, 1 UNION ALL
    SELECT 2001780, 0, 2001780, 1 UNION ALL
    SELECT 2001780, 10, 2000246, 4 UNION ALL
    SELECT 2002292, 0, 2002292, 1 UNION ALL
    SELECT 2002292, 8, 2000506, 1 UNION ALL
    SELECT 2002395, 0, 2002395, 1 UNION ALL
    SELECT 2002395, 1, 2002292, 1 UNION ALL
    SELECT 2002565, 0, 2002565, 1 UNION ALL
    SELECT 2002565, 2, 2000837, 1 UNION ALL
    SELECT 2002566, 0, 2002566, 1 UNION ALL
    SELECT 2002566, 1, 2002565, 1 UNION ALL
    SELECT 2002875, 0, 2002875, 1 UNION ALL
    SELECT 2002875, 1, 2002566, 1 UNION ALL
    SELECT 2003495, 0, 2003495, 1 UNION ALL
    SELECT 2003495, 10, 2002875, 1 UNION ALL
    SELECT 2003496, 0, 2003496, 1 UNION ALL
    SELECT 2003496, 10, 2002395, 1
    COMMIT;
    RAISERROR (N'[dbo].[BOM3]: Insert Batch: 1.....Done!', 10, 1) WITH NOWAIT;
    GO
    Toute la question est donc de modifier la requête récursive pour qu'elle ne prenne pas en compte les lignes avec Item=0.

Discussions similaires

  1. [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
  2. [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
  3. [MySQL] Requête SQL pour charger une structure récursive
    Par FMaz dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 19/07/2009, 05h00
  4. Fonctions récursives pour parcourir un arbre
    Par mikedavem dans le forum C
    Réponses: 4
    Dernier message: 05/06/2006, 12h00
  5. Requête SQL pour insérer une donnée BINAIRE ?
    Par Najdar dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 22/05/2006, 10h21

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