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

MS SQL Server Discussion :

Recherche des parents d'un dossier [2000]


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Points : 73
    Points
    73
    Par défaut Recherche des parents d'un dossier
    Bonjour,
    Je travaille sur SQL Server 2000.
    J'ai une table Dossier :

    id parent date
    -----------------
    1 0 12/04/13
    2 1 null
    3 2 null

    Je voudrais obtenir le premier parent qui a une date non nulle sachant que l'id 1 se trouve sous la racine et que que je n'ai pas un enregistrement d'id 0.

    j'ai essayé ça:
    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
    CREATE FUNCTION dbo.parent(@pId INT)
    RETURNS INT
    AS
    BEGIN
    	DECLARE @code INT
     
    	SET @code = @pId 
     
    	SELECT  @code = Code
    	FROM    Dossier
    	WHERE   (Code = (SELECT  CodeParent
    	                 FROM    Dossier
    	                 WHERE   Code = @pId AND Date IS NULL)
    		)
     
    	IF @@ROWCOUNT <> 0
    		SET @code = dbo.parent(@code)
     
    	RETURN @code
    END
    GO
     
    SELECT dbo.parent(3)
    go
    Le problème est que si toutes les dates sont nulles :

    id parent date
    -----------------
    1 0 null
    2 1 null
    3 2 null

    Le résultat est 1 alors qu'il doit être 0.

    Merci.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Vous pouvez soit mettre à jour votre SQL server et faire une requete recursive soit ecrire votre fonction comme ceci :

    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
     
    ALTER FUNCTION dbo.parent(@pId INT)
    RETURNS INT
    AS
    BEGIN
    	DECLARE @code INT
    	DECLARE @Fin BIT
     
    	SELECT  @code = Enfant.codeParent, @Fin = CASE WHEN Parent.Code IS NULL THEN 1 ELSE 0 END
    	FROM    Dossier Enfant
    	LEFT  JOIN Dossier Parent
    		ON		Parent.code = Enfant.codeParent
    		AND		Parent.dte IS NULL
    	WHERE Enfant.code = @pId
     
     
     
    	RETURN CASE WHEN @Fin = 1 THEN @code ELSE dbo.parent(@code) END 
    END
    GO

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    Merci aieeeuuuuu, j'ai testé et ça marche.
    En fait je veux récupérer la date la plus proche si plus qu'un parent a une date non nulle :

    id parent date
    -----------------
    1 0 20/04/2013
    2 1 30/04/2013
    3 2 null

    Dans ce cas je dois avoir 1 -> 20/04/2013.
    Merci.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    ce n'est plus le même besoin !!

    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
     
     
    ALTER FUNCTION dbo.parent(@code INT, @dte DATETIME)
    RETURNS INT
    AS
    BEGIN
    	DECLARE @LeCode INT
     
    	SET @LeCode = @code
     
    	WHILE( @Code <> 0 ) 
    	BEGIN	
    		SELECT  
    				@code = Enfant.codeParent
    			,	@LeCode = CASE WHEN Parent.dte < @dte OR @dte IS NULL THEN Enfant.CodeParent ELSE @LeCode END
    			,	@dte = CASE WHEN Parent.dte < @dte OR @dte IS NULL THEN Parent.Dte ELSE @dte END
     
    		FROM    Dossier Enfant
    		LEFT  JOIN Dossier Parent
    			ON		Parent.code = Enfant.codeParent
    		WHERE Enfant.code = @code
    	END 
     
     
    	RETURN @LeCode
    END

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    Merci aieeeuuuuu pour ta réponse.
    La première solution fonctionne mieux mais la fonction retourne le premier parent ayant une date non nulle alors que mon besoin est de récupérer le dossier parent qui a la date la plus proche parmi toute l'arborescence des parents du dossier en paramètre.

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    J'avais mal interprété
    La date la plus proche

    essayez ceci :
    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
    ALTER FUNCTION dbo.parent(@code INT)
    RETURNS INT
    AS
    BEGIN
    	DECLARE @LeCode INT
    	DECLARE @NbJours INT
     
    	SET @LeCode = @code
     
    	WHILE( @Code <> 0 ) 
    	BEGIN	
    		SELECT  
    				@code = Enfant.codeParent
    			,	@LeCode = CASE WHEN ABS(DATEDIFF(DAY,GETDATE(), Parent.Dte)) < @NbJours OR @NbJours IS NULL THEN Enfant.CodeParent ELSE @LeCode END
    			,	@NbJours = CASE WHEN ABS(DATEDIFF(DAY,GETDATE(), Parent.Dte)) < @NbJours OR @NbJours IS NULL THEN ABS(DATEDIFF(DAY,GETDATE(), Parent.Dte)) ELSE @NbJours END
     
    		FROM    Dossier Enfant
    		LEFT  JOIN Dossier Parent
    			ON		Parent.code = Enfant.codeParent
    		WHERE Enfant.code = @code
    	END 
     
     
    	RETURN @LeCode
    END

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    J'ai testé votre code, j'ai eu l'erreur suivante :
    Utilisation incorrecte de 'getdate' à l'intérieur d'une fonction.
    J'ai fait une petite recherche et j'ai trouvé ce lien

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    placez la date de référence en paramètre...

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    Pouvez-vous expliquer ?

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    La procédure sans getdate() :
    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
     
    ALTER FUNCTION dbo.parent(@code INT, @LaDate Datetime)
    RETURNS INT
    AS
    BEGIN
    	DECLARE @LeCode INT
    	DECLARE @NbJours INT
     
    	SET @LeCode = @code
     
    	WHILE( @Code <> 0 ) 
    	BEGIN	
    		SELECT  
    				@code = Enfant.codeParent
    			,	@LeCode = CASE WHEN ABS(DATEDIFF(DAY,@LaDate, Parent.Dte)) < @NbJours OR @NbJours IS NULL THEN Enfant.CodeParent ELSE @LeCode END
    			,	@NbJours = CASE WHEN ABS(DATEDIFF(DAY,@LaDate, Parent.Dte)) < @NbJours OR @NbJours IS NULL THEN ABS(DATEDIFF(DAY,@LaDate, Parent.Dte)) ELSE @NbJours END
     
    		FROM    Dossier Enfant
    		LEFT  JOIN Dossier Parent
    			ON		Parent.code = Enfant.codeParent
    		WHERE Enfant.code = @code
    	END 
     
     
    	RETURN @LeCode
    END

    et pour l’appeler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT dbo.parent(3, GETDATE())

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    J'ai testé la fonction, elle boucle à l'infini.

  12. #12
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    vous devez avoir des incohérences dans vos données :

    par exemple une racine dont la code parent n'est pas 0, on un enfant qui manque, voire une boucle dans votre arborescence

    Qu'est ce que ça donne si vous remplacez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHILE( @Code <> 0)
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHILE (@@ROWCOUNT > 0 )

  13. #13
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    La boucle s'est arrêtée mais elle renvoie toujours l'id 3.
    sachant que l'id 1 se trouve sous la racine et que que je n'ai pas un enregistrement d'id 0.
    En réalité je n'ai pas besoin de tester sur la racine : la racine est un dossier particulier, elle ne se trouve pas dans la base de données et elle n'a pas la propriété Date.

  14. #14
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Points : 73
    Points
    73
    Par défaut
    Bonjour,
    Puisque je travaille avec ASP, j'ai résolu mon problème en créant une procédure ASP récursive au lieu d'appeler une procédure stockée.
    Merci aieeeuuuuu pour ton aide.

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

Discussions similaires

  1. [Lazarus] Dossier de recherche des sources
    Par Louis Griffont dans le forum Lazarus
    Réponses: 3
    Dernier message: 22/02/2010, 14h51
  2. recherche des parents d'un pixel
    Par fattouna dans le forum Images
    Réponses: 5
    Dernier message: 30/06/2009, 23h22
  3. rechercher des fichiers dans tous les dossiers
    Par nitteo dans le forum MFC
    Réponses: 4
    Dernier message: 23/06/2006, 18h08
  4. [VB.NET] Rechercher des dossiers système.
    Par leSeb dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/10/2004, 14h58

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