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 :

Problème type de données dans requête récursive


Sujet :

Développement SQL Server

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    automatisme
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : automatisme

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Problème type de données dans requête récursive
    Bonjour à tous,

    Je suis bloqué sur cette requête récursive. A chaque exécution. L'erreur suivante m'est renvoyée:
    Msg*240, Niveau*16, État*1, Procédure*Act_PathFinder3, Ligne*148
    Les types ne correspondent pas entre la partie d'ancrage et la partie récursive dans la colonne "j_Way" de la requête récursive "journey".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create table   #Temp_Def_Section_Runtime 
    (			
    	 [Source]		varchar(max)
    	,[Destination]	varchar(max)
    	,[Type_ID]		int
    	,[Groupe01]		varchar(100)
    	,[Groupe02]		varchar(100)
    )
    ...

    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
    ;WITH
    journey (j_Dest, j_Step, j_Type_ID, j_Way) 
    AS
    (
    	SELECT DISTINCT 
    			Source
    			,0
    			,0
    			,cast (@Source  as varchar(max)) 
        FROM	#Temp_Def_Section_Runtime
        WHERE	Source = @Source
     
        UNION  ALL 
     
        SELECT	destination
    			,departure.j_Step + 1
    			,Type_ID
    			,cast(departure.j_Way +','+ cast(arrival.Destination as varchar(max))  as varchar(max))    
     
    	FROM   #Temp_Def_Section_Runtime AS arrival
               inner JOIN journey AS departure
                     ON departure.j_Dest = arrival.Source

    Je comprend bien que le problème vient d'une différence de format entre l'ancrage et la récursivité sur la colonne j_way mais je ne vois pas pourquoi...
    J'ai essayé de nombreuses et différentes façons de poser le CAST as varchar mais le résultat est toujours le même.

    Si j'utilise une table 'physique' à la place de la table temporaire précédemment décrite, cela fonctionne. A n'y rien comprendre !!!

    Merci d'avance pour votre aide.

    COrdialement

  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,

    Votre requête est correcte, et je pense qu'il s'agit plus d'un problème de parsing, car votre table temporaire existe. Lorsque vous faites une modification, pensez a supprimer la table temporaire avant de exécuter votre code complet, sinon SQL Server parse la commande en fonction de "l'ancienne" structure de votre table temporaire...

    Ceci expliquerait aussi pourquoi ça fonctionne avec une autre table

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    automatisme
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : automatisme

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci pour votre réponse

    A la fin de la procédure stockée, je fais un drop de la table temporaire et un create au début. Si la table était toujours existante au moment du create, j'aurai due avoir une erreur.
    Cela signifie que la table est bien inexistante au lancement de la procédure.

  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
    Comme vous ne supprimez la table qu'a la fin de la procédure, si votre code plante sur la requête, la table est créée, mais pas supprimée (code interrompu)

    Du coup, vous corrigez votre script, et vous relancez. A ce moment là, SQL Server analyse votre script (avant de commencer à exécuter).
    Il valide la syntaxe de CREATE TABLE temporaire (il ne vérifie pas l’existence d'une table ayant le même nom lors du parsing, vous aurez l'erreur à l’exécution)
    Puis il parse voter requête récursive... en se basant sur la table temporaire existante (crée lors de l’exécution précédente, avec possiblement une structure différente...)

    Avez vous testé le DROP TABLE (ou même tout simplement de changer le nom de votre table temporaire). ?

  5. #5
    Rédacteur


    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 757
    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 757
    Points : 52 534
    Points
    52 534
    Billets dans le blog
    5
    Par défaut
    Vous ne devez pas recaster dans cette partie :

    cast(departure.j_Way +','+ cast(arrival.Destination AS varchar(max)) AS varchar(max))

    Laissez faire sans les fonctions CAST.

    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/ * * * * *

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    automatisme
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : automatisme

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    J'ai changer le nom de table temporaire -> même probleme

    J'ai rajouter en début de procédure l'instruction pour vérifier l’existence ou pas de la table temporaire -> même probleme

    IF object_id('#Temp_Def_Section_Runtime') is not null
    drop table #Temp_Def_Section_Runtime



    D'autre part,en analysant le code, il semble que l'erreur de type vienne du membre arrival.Destination dans la partie récursive de la requète

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    automatisme
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : automatisme

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Vous ne devez pas recaster dans cette partie :

    cast(departure.j_Way +','+ cast(arrival.Destination AS varchar(max)) AS varchar(max))

    Laissez faire sans les fonctions CAST.

    A +
    J'ai essayé les syntaxes suivantes pour la partie récursive:

    ,departure.j_Way +','+ arrival.Destination

    ,departure.j_Way +','+ cast (arrival.Destination as varchar(max))

    ,cast ( departure.j_Way +','+ arrival.Destination as varchar(max))

    Et toujours la même erreur...

  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
    Citation Envoyé par patlepirate Voir le message
    J'ai rajouter en début de procédure l'instruction pour vérifier l’existence ou pas de la table temporaire -> même probleme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IF object_id('#Temp_Def_Section_Runtime') is not null
        drop table #Temp_Def_Section_Runtime
    Ce code ne supprimera pas la table temporaire : elle se trouve dans tempDB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if object_id('tempdb..#Temp_Def_Section_Runtime') IS NOT NULL drop table #Temp_Def_Section_Runtime
    Mais avant de relancer, sélectionnez juste la partie de code drop table #Temp_Def_Section_Runtime et exécutez (la table temporaire ne doit pas exister au moment où vous lancez l’exécution du script complet)

    Pourriez-vous poster votre code complet ?
    Il y a peut-être quelque chose ailleurs...

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    automatisme
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : automatisme

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    En faisant un simple DROP TABLE #Temp_Def_Section_Runtime, le système ne peut la supprimer car elle n'existe pas.

    Ci-joint le code complet de la procédure:


    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    ALTER      PROCEDURE [dbo].[Act_PathFinder2]
    	@TypeOP			as int
    	,@Source        as varchar(max)
    	,@Destination   as varchar(max)
    AS	
    SET NOCOUNT ON;
     
    -- Declaration des variables locales et tables temporaires
    DECLARE	 @Groupe01_Source		varchar(max)
    		,@Groupe02_Source		varchar(max)
    		,@Groupe01_Destination	varchar(max)
    		,@Groupe02_Destination	varchar(max)
     
    IF object_id('#Temp_Def_Section_Runtime') is not null
        drop table #Temp_Def_Section_Runtime
     
    create table #Temp_Def_Section_Runtime
    (			
    	[Source]		varchar(max)
    	,[Destination]	varchar(max)
    	,[Type_ID]		int
    	,[Groupe01]		varchar(max)
    	,[Groupe02]		varchar(max)
    )
     
    --******************************************************************************************************************************
     
    insert into #Temp_Def_Section_Runtime	
    		Select	source,Destination,Type_ID,Groupe01,Groupe02
    		from	T_Def_Section
    		where	Direction_OP <> 0 
     
    union all
     
    		Select	Destination,source, Type_ID,Groupe01,Groupe02
    		from	T_Def_Section
    		where	Direction_OP =2
     
    --******************************************************************************************************************************
    -- 
     
    select	@Groupe01_source= groupe01
    		,@Groupe02_Source= groupe02
    from	#Temp_Def_Section_Runtime
    where	Source=@Source
     
    select	@Groupe01_Destination= groupe01
    		,@Groupe02_Destination= groupe02
    from	#Temp_Def_Section_Runtime 
    where	Destination=@Destination
     
     
    --******************************************************************************************************************************
    -- Calcul de tous les chemins possibles en respectant les regles suivantes:
    --	Ne pas passer 2x par la meme connexion de pontage
    --	Ne pas passer 2x par la meme connexion de gare
    --  Ne pas passer 2x par le meme point
     
    ;WITH
    journey (j_Dest, j_Step, j_Type_ID, j_Way) 
    AS
    (
    	SELECT DISTINCT Source
    					,0 
    					,0
    					,cast(@Source as varchar(max))
        FROM   #Temp_Def_Section_Runtime
        WHERE  Source = @Source
     
        UNION  ALL 
     
        SELECT	destination
    			,departure.j_Step + 1
    			,Type_ID
    			,cast(departure.j_Way +','+ arrival.Destination  as varchar(max))
        FROM   #Temp_Def_Section_Runtime AS arrival
               inner JOIN journey AS departure
                     ON departure.j_Dest = arrival.Source
    	where	(	
    			(departure.j_Type_ID= 104 and arrival.Type_ID<>104)				-- Ne pas passer 2x par la meme connexion de pontage
    				or												-- 
    			(departure.j_Type_ID<>104 and arrival.Type_ID= 104)				--
    				or												--
    			(departure.j_Type_ID= 102 and arrival.Type_ID<>102)				-- Ne pas passer 2x par la connexion de cuve
    				or												--
    			(departure.j_Type_ID<>102 and arrival.Type_ID= 102)				--
    				or
    			(departure.j_Type_ID= 103 and arrival.Type_ID<>103 and arrival.Type_ID<>101)				-- Ne pas passer 2x par la connexion de Gare ou flexible
    				or 
    			(departure.j_Type_ID<>103 and departure.j_Type_ID<>101 and arrival.Type_ID= 103)	
    				or
    			(departure.j_Type_ID in (0,1,201,202,203,300) and arrival.Type_ID in (0,1,201,202,203,300)) -- Prise en compte des autres types de pontage sans restriction
    			)
    			and departure.j_Way not like '%' + arrival.Destination  + '%'		
    ) 
     
     
    --******************************************************************************************************************************
    -- Recuperation des 4 + courts chemins menant à Rome
    select	top 4	 
    		j_Step
    		,j_way 
    FROM	journey 
    where	j_Dest=@Destination   
    order by j_step
    option (maxrecursion 0)
     
    drop table #Temp_Def_Section_Runtime

  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
    C'était donc une fausse piste.

    Une autre alors... a tout hasard :

    Dans votre message d'erreur initial, il est question de la procédure stockée Act_PathFinder3, à la ligne 148
    La procédure que vous avez postée, c'est la Act_PathFinder2, qui fait 108 lignes...

    N’exécuteriez vous pas la mauvaise procédure ?

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    automatisme
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : automatisme

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    C'était donc une fausse piste.

    Une autre alors... a tout hasard :

    Dans votre message d'erreur initial, il est question de la procédure stockée Act_PathFinder3, à la ligne 148
    La procédure que vous avez postée, c'est la Act_PathFinder2, qui fait 108 lignes...

    N’exécuteriez vous pas la mauvaise procédure ?


    Je faisais des tests sur deux procédures . Mais c'est bien la SP Act_PathFinder2 qui est concernée

    Msg*240, Niveau*16, État*1, Procédure*Act_PathFinder2, Ligne*156
    Les types ne correspondent pas entre la partie d'ancrage et la partie récursive dans la colonne "j_Way" de la requête récursive "journey".

  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
    il doit pourtant bien y avoir une erreur quelque part...

    Votre erreur indique la ligne 156, mais votre sp n'en fait que 108...

    Notez que votre SP compile et s’exécute correctement sur mon environnement de test... (j'ai juste commenté le INSERT INTO sur la table temporaire)
    (de plus, votre erreur n'est pas logique, car dans le code que vous postez, vous effectuez bien un CAST explicite sur la colonne indiquée dans l'erreur...)

  13. #13
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Je ne me plonge pas dans toute la discussion ici mais je me permets une suggestion à tout hasard.

    Plutôt que de commencer par récupérer juste "0" (zéro) dans votre première ligne, récupérez plutôt "CAST(0 AS BIGINT)".
    C'est la première ligne qui fixe le type, alors quand ça coince, il peut être utile d'y utiliser le type qui couvre la plus grande plage de cas (BIGINT > INT > SMALLINT > TINYINT > BIT).

    Par ailleurs essayer N'<mon texte>' quand votre objectif est d'arriver à du N(VAR)CHAR
    Most Valued Pas mvp

  14. #14
    Rédacteur


    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 757
    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 757
    Points : 52 534
    Points
    52 534
    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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    DECLARE @Source NVARCHAR(max)
     
    ;WITH
    journey (j_Dest, j_Step, j_Type_ID, j_Way) 
    AS
    (
    	SELECT DISTINCT 
    			Source
    			,0
    			,0
    			, Source 
        FROM	#Temp_Def_Section_Runtime
        WHERE	Source = @Source
     
        UNION  ALL 
     
        SELECT	Destination
    			,departure.j_Step + 1
    			,Type_ID
    			,cast(departure.j_Way +','+ cast(arrival.Destination AS varchar(max))  AS varchar(max))    
     
    	FROM   #Temp_Def_Section_Runtime AS arrival
               INNER JOIN journey AS departure
                     ON departure.j_Dest = arrival.Source)
    SELECT * FROM journey
    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/ * * * * *

  15. #15
    Candidat au Club
    Homme Profil pro
    Responsable Automatismes et Systèmes
    Inscrit en
    Avril 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable Automatismes et Systèmes
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ;WITH
    journey (j_Dest, j_Step, j_Type_ID, j_Way) 
    AS
    (
    	SELECT DISTINCT 
    			Source
    			,0
    			,0
    			,cast (@Source  AS varchar(max)) 
        FROM	#Temp_Def_Section_Runtime
        WHERE	Source = @Source
    Le souci est dans la partie point de départ de la requête recursive en ligne 9. Remplacer Cast(@Source As varchar(max) par Source (colonne source de #Temp_Def_Section_Runtime). Comme l'a d'ailleurs indiqué SQLPro.

  16. #16
    Candidat au Club
    Homme Profil pro
    Responsable Automatismes et Systèmes
    Inscrit en
    Avril 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable Automatismes et Systèmes
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Voici donc le code modifié qui fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ;WITH
    journey (j_Dest, j_Step, j_Type_ID, j_Way) 
    AS
    (
    	SELECT DISTINCT 
    			Source
    			,0
    			,0
    			,cast (Source  AS varchar(max)) 
        FROM	#Temp_Def_Section_Runtime
        WHERE	Source = @Source
    Un @ ca peut faire du mal!

  17. #17
    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
    Le @Source me semble correcte. Surtout qu'il est déclaré en varchar(max) également, et qu'en plus (ceinture et bretelles), il est transtypé explicitement. Du coup, avec le WHERE Source = @Source ça revient au même...

    Je ne pense pas que l'erreur soit dans le code lui-même, puisqu'il est correct. Il y a surement quelque chose ailleurs qui provoque cette erreur...

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/02/2012, 15h36
  2. Réponses: 6
    Dernier message: 15/02/2006, 14h02
  3. Réponses: 3
    Dernier message: 07/02/2006, 13h26
  4. Problème: condition sur formulaire dans requête
    Par decour dans le forum Access
    Réponses: 1
    Dernier message: 17/10/2005, 23h27
  5. Vérification du type de données dans une procédure stockée
    Par biroule dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/09/2004, 11h20

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