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 :

Création d'une colonne SerialNumber Unique [2016]


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 62
    Points : 24
    Points
    24
    Par défaut Création d'une colonne SerialNumber Unique
    Bonjour à tous,

    J'aimerai créer une colonne avec a l'intérieur un serialNumber unique composé selon les besoins de mon tuteur (ici date, Code de la carte, guid ..).

    Chaque ligne correspond a un erreur. Il faudrait que le serialNumber soit le même pour chaque "Groupe" (un Groupe est une zone de carte pouvant comporter 0,1 ou plusieurs erreurs).

    J'ai donc créer le serialNumber sans soucis, mais 1) chaque fois que je re-execute la requete le serialNumber change, 2) chaque ligne a un serialNumber différents.

    Exemple en image : Nom : Sans titre.png
Affichages : 215
Taille : 447,0 Ko

    Merci d'avance !

    Edit : La requête =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CONCAT(NameBoard, SUBSTRING(MName,0,9),'-', SUBSTRING(DateTimer,0,11),'-', DateOfTest,'-', NEWID()) as SerialNum

  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,

    Le comportement est normal, vous utilisez NEWID qui renvoie justement des valeurs différentes à chaque appel.

    Quels est votre besoin fonctionnel concernant ce guid ?

  3. #3
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Une petite remarque à l'attention de "Ecxtazy"
    La fonction SUBSTRING est par défaut à base de 1, lorsque l'argument "Start" est strictement inférieur à 1 (dans vos exemples 0), le nombre de caractère retournés est la plus grande valeur entre la somme de l'argument (Start) et l'argument length-1 et 0.
    dans votre Exemple SUBSTRING(MName,0,9), Start = 0 et length = 9
    le nombre de caractères retournés est égale au max(0+9 -1 , 0) soit 8 caractères.
    Tout cela pour dire que le fait d'utiliser la base 0 (zéro ) au lieu de la base 1, peut rendre votre code, même s'il est juste, difficile à lire, voire même incompréhensible par d'autre personnes. Votre code sera aussi difficilement maintenable !

    Autre remarque qui n'a rien à voir avec le sujet traité.
    J'espère que votre pseudo "Ecxtazy" ne fait allusion à l' "Ecstasy", et auquel cas, il aurait du être interdit par les modérateurs de ce forum. En effet, beaucoup de jeunes consultent le présent Forum. Et il ne faut pas donner de mauvais exemples, ni envoyer des messages subliminaux nocifs !

    A+

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 62
    Points : 24
    Points
    24
    Par défaut
    Bonjour, je comprends votre explication du SUBSTRING, j'avais lu effectivement certaines choses au sujet du start = 0, mais pour moi avoir le 0 visuellement m'aide beaucoup à me repérer.
    Pour ce qui est du pseudo, je ne me drogue pas. Et en aucun cas ici je ne fais allusion à la drogue. C'est un pseudo que j'ai adopté dans les jeux vidéos depuis 3 ans et depuis je n'utilise que lui. Mais je comprends qu'il fasse penser à ça. Ce n’était pas l'intention. A la base mon pseudo vient de EX (origine dans les jeux pokemons un EX est un pokemon très fort et rare) et Taz pour le dessin animé avec le chien de Tasmanie qui a été un de mes surnoms. Au final, pour rendre ça plus joli mais encore masculin j'ai ajouté Tazy à Ex ça faisait Extazy. Mais vu que c'est SOUVENT pris, j'ai du rajouter un "c".

    Bonjour,

    Le comportement est normal, vous utilisez NEWID qui renvoie justement des valeurs différentes à chaque appel.

    Quels est votre besoin fonctionnel concernant ce guid ?
    La demande de mon tuteur se résume à : "Je veux un serialNum unique, constitué avec les champs Nom de la carte + date".

    Du coup, pour l'unicité je pensais à la clé primaire mais impossible puisque nous aurons plusieurs fois le même serialNum pour chaque erreur sur la même carte, sachant que 1 erreur = 1 ligne. Après mes recherches, j'ai trouvé l'utilisation de NEWID ou IDENTIFIER UNIQUE, et effectivement le fait que cela soit aléatoire permet de les rendre uniques. Mais oui, le souci c'est que chaque ligne a un ID différent à cause du select et de l'actualisation. Créer une table contenant des ID aurait été une bonne idée, mais le souci c'est que je dois rentrer les ID à la main dans la table, donc si j'ai 1000 carte, je vais devoir écrire imaginons 600 ID, sans compter le fait que je vais devoir joindre tel ID à telle carte.

    J'ai pas vraiment le temps de me former en SQL, du moins, de façon aussi poussée. Il me reste peu de temps avant la fin de mon stage, et j'aimerais quand même réussir ma mission car le projet sur lequel je travaille est essentiel à l'entreprise.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 338
    Points : 39 737
    Points
    39 737
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Ecxtazy Voir le message
    La demande de mon tuteur se résume à : "Je veux un serialNum unique, constitué avec les champs Nom de la carte + date".
    bonjour,
    Il s'agit donc de constituer une valeur à partir de deux colonnes distinctes, rien de bien compliqué
    Vous pouvez utiliser une vue qui restitue cette valeur unique à partir des colonnes "nom de la carte" et "date de l'erreur carte" de la table
    Une question tout de même : êtes vous certain de l'unicité, ne peut il pas y avoir plusieurs erreurs pour une même carte à la même date ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 62
    Points : 24
    Points
    24
    Par défaut
    Je crois que vous m'avez mal lu ou compris, j'ai déjà créé le serialNum et pour vous répondre oui on peut avoir plusieurs erreurs sur une même carte à la même date d’où l'utilisation du GUID grâce à la fonction NEWID(). Au final, le résultat n'est pas parfait car le NEWID() à chaque actualisation de la requête génère un nouveau serialNum. De plus, le serialNum devrait être le même pour chaque erreur sur une même carte. ^^

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 338
    Points : 39 737
    Points
    39 737
    Billets dans le blog
    9
    Par défaut
    OK, mais alors du coup, je ne comprends pas comment on concilie ces deux règles
    Citation Envoyé par Ecxtazy Voir le message
    La demande de mon tuteur se résume à : "Je veux un serialNum unique, constitué avec les champs Nom de la carte + date".

    Citation Envoyé par Ecxtazy Voir le message
    De plus, le serialNum devrait être le même pour chaque erreur sur une même carte. ^^
    A moins de considérer que le SerialNum est un attribut "nullable" de la carte, présent seulement lorsqu'il y a eu au moins une erreur, et dont la partie date serait la date de la première ou dernière erreur ?

  8. #8
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par Ecxtazy Voir le message
    Bonjour, je comprends votre explication du SUBSTRING, j'avais lu effectivement certaines choses au sujet du start = 0, mais pour moi avoir le 0 visuellement m'aide beaucoup à me repérer.
    Cela vous aide à vous, c'est très bien en soi, mais il faut penser aux autres, parce que vos travaux seront vraisemblablement repris par d'autres développeurs qui eux n'auront peut-être pas la même approche que vous et risquent d'être, un peu comme moi, perplexes avec cette base 0 (zéro). Mais bon, c'est votre choix. Syntaxiquement et sémantiquement l'expression est juste et je ne vais pas insister plus.

    Citation Envoyé par Ecxtazy Voir le message
    Pour ce qui est du pseudo, je ne me drogue pas. Et en aucun cas ici je ne fais allusion à la drogue. C'est un pseudo que j'ai adopté dans les jeux vidéos depuis 3 ans et depuis je n'utilise que lui. Mais je comprends qu'il fasse penser à ça. Ce n’était pas l'intention. A la base mon pseudo vient de EX (origine dans les jeux pokemons un EX est un pokemon très fort et rare) et Taz pour le dessin animé avec le chien de Tasmanie qui a été un de mes surnoms. Au final, pour rendre ça plus joli mais encore masculin j'ai ajouté Tazy à Ex ça faisait Extazy. Mais vu que c'est SOUVENT pris, j'ai du rajouter un "c".
    OK, je suis rassuré par rapport aux explications que vous avez données, relatives au choix de votre pseudo "Ecxtazy". Et je comprends donc qu'il n'y a aucune mal-intention de votre part. Même si qu'on le veuille ou non, votre pseudo "Ecxtazy" peut prêter à confusion, mais bon maintenant que vous avez eu l'honnêteté d'expliquer l'historique,.. je ne vous en tiendrai pas rigueur .

    Sinon, pour revenir au sujet et au problème posé, j'avoue que pour moi non plus, ce n'est pas très clair (?), et les questions posées ci-dessus par escartefigue me paraissent tout à fait sensées.

    A+

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 62
    Points : 24
    Points
    24
    Par défaut
    Enfaîte ce que je voulais dire par la, c'est que mon tuteur m'a demandé quelque chose de base non unique, on a alors décidé, suite a ma proposition, de rajouter le GUID a la fin. Bref, ce qu'il y a a retenir c'est que le SerialNum est unique et est une concaténation de champs.

    Pour te répondre : - Oui, SerialNum est nullable.
    - La date est fixe. Il n'y a pas de date de première erreur ou dernière étant donnée que dans la table on a 1 ligne = 1 erreur. On aura donc par exemple :

    BoardName SerialNum StartTimeTest TimeTest FailCmponent Panel Message


    B0035685AB B0035685AB-20170704-(GUID) 14:25:23 00:02:30 R4 Groupe20 Problème de résistance a droite du connecteur 54
    B0035685AB B0035685AB-20170704-(GUID) 14:25:23 00:02:30 R5 Groupe20 Problème de résistance a gauche du connecteur 54
    B004875FE B004875FE-20170704-(GUID) 14:30:25 00:01:50 D5 Groupe 14 Diode defectueuse

    Je précise que le jeu d'essai du dessus et le resultat que je souhaiterais. ^^

  10. #10
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Si j'ai bien compris, la logique voudrait que vous utiliseriez quelque chose comme indiqué ci-dessous :
    Code SQL : 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 CTE_NewIdent (NameBoard, MName, DateTimer, NewIdent )  
    AS  
    (  
        SELECT NameBoard, MName, DateTimer, NEWID() 
        FROM .... 
        WHERE ... 
        GROUP BY NameBoard, MName, DateTimer
     
    )  
    SELECT CONCAT(NameBoard, SUBSTRING(MName,0,9),'-', SUBSTRING(DateTimer,0,11),'-', DateOfTest,'-', NewIdent) as SerialNum
    FROM ...  AS A 
    INNER JOIN  CTE_NewIdent  
     ON   CTE_NewIdent.NameBoard = A.NameBoard 
     AND  CTE_NewIdent.MName = A.MName
     AND  CTE_NewIdent.DateTimer = A.DateTimer


    Sauf que le NewIdent généré à l'intérieur de la CTE, censé être unique par groupe (NameBoard, MName, DateTimer) ne le sera pas ! Mais sera unique pour chaque ligne du résultat final de la requête globale ! En effet, il s'agit d'un bug de SQL Server déjà déclaré dans connect n° 350485
    https://connect.microsoft.com/SQLSer...le-expressions
    Microsoft déconseille même l'utilisation de NEWID() dans les CTE !

    En conclusion, si vous retenez cette approche et pour palier à ce problème de NEWID() dans les CTE, il vous faudra créer une table temporaire dotées des 4 colonnes (NameBoard, MName, DateTimer, NewIdent) puis insérer les lignes à partir du Select .. group By pour générer de manière persistante les numéro NewID(), puis enfin effectuer une jointure entre votre table principale et la table temporaire préalablement remplie, jointure établie évidemment sur les colonnes de regroupement.

    Très schématiquement cela ressemblerait à ceci :
    Code SQL : 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
     -- 1 
     Create tabe #TMP_NewIdent
       (NameBoard  .... 
        MName        ..... 
        DateTimer .... 
        NewIdent) 
    -- 2 	 
    INSERT INTO #TMP_NewIdent
          (NameBoard, MName, DateTimer, NewIdent )  
    SELECT NameBoard, MName, DateTimer, NEWID() 
    FROM .... 
    WHERE ... 
    GROUP BY NameBoard, MName, DateTimer	 
     
    -- 3 
     SELECT 
     CONCAT(A.NameBoard, SUBSTRING(A.MName,0,9),'-', SUBSTRING(A.DateTimer,0,11),'-', A.DateOfTest,'-', T.NewIdent) as SerialNum
    FROM ...  AS A 
    INNER JOIN  #TMP_NewIdent T 
     ON   T.NameBoard = A.NameBoard 
     AND  T.MName = A.MName
     AND  T.DateTimer = A.DateTimer
    A+

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 62
    Points : 24
    Points
    24
    Par défaut
    D'accord, je comprends mieux. Ca me rassure que cela soit un bug SQL, j'avais peur que cela ne soit pas possible à coder.

    Votre proposition est juste et semble être ce que je recherche. Je dois tester cela pour être sûr. Mais quelque chose me pose problème.
    Le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     SELECT 
     CONCAT(A.NameBoard, SUBSTRING(A.MName,0,9),'-', SUBSTRING(A.DateTimer,0,11),'-', A.DateOfTest,'-', T.NewIdent) as SerialNum
    FROM ...  AS A 
    INNER JOIN  #TMP_NewIdent T 
     ON   T.NameBoard = A.NameBoard 
     AND  T.MName = A.MName
     AND  T.DateTimer = A.DateTimer
    Au final, je devais mettre le concat dans un requête déjà existante qui est dans l'image de mon premier message. Donc maintenant avec votre requête, je devrais utiliser deux requêtes différentes pour écrire dans la table c'est ça ? D'un cotés la requête SELECT CONCAT qui servira a entrer le serialNum et de l'autre ma requête déjà existante qui inserera le reste des valeurs dans le reste des champs ?

    Merci d'avance !

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 898
    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 898
    Points : 53 136
    Points
    53 136
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Ecxtazy Voir le message
    D'accord, je comprends mieux. Ca me rassure que cela soit un bug SQL
    En fait cela n'est pas du tout un bug, mais un fonctionnement normal d'une fonction qui est aléatoire de manière systématique quelque soit les circonstances. L'intitulé "BUG" est celui que l'auteur de la demande à mise, mais il est parfaitement justifié que tous les GUID soient toujours différents afin d'identifier des lignes de table quelque soit les circonstances à partir du moment ou ils doivent être générés dans une requête de type INSERT ou UPDATE. Ils sont juste là pour ça : différencier des lignes !
    Une solution est d'utiliser une procédure stockée qui réalise l'opération en deux temps : calcul des GUID unitaire puis projection de ces GUID sur les lignes de détail.

    A +

  13. #13
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par Ecxtazy Voir le message
    Au final, je devais mettre le concat dans un requête déjà existante qui est dans l'image de mon premier message. Donc maintenant avec votre requête, je devrais utiliser deux requêtes différentes pour écrire dans la table c'est ça ? D'un cotés la requête SELECT CONCAT qui servira a entrer le serialNum et de l'autre ma requête déjà existante qui inserera le reste des valeurs dans le reste des champs ?
    Oui, c'est cela. il y a 2 requêtes.
    En fait cela revient à procéder en deux temps
    1 - Par une requête (INSERT INTO #TMP_NewIdent SELECT ..) Vous générez dans une table temporaire les NewId selon un critère de regroupement (si j'ai bien compris c'est le triplet (NameBoard, MName, DateTimer)
    2 - Vous reformuler votre SELECT ( c.à.d. celui indiqué dans l'image de votre premier message) mais en y établissant une jointure avec la table temporaire, et ce, pour en extraire le NewId généré à l'étape 1.

    NB : Si vous voulez rendre persistant le résultat du SELECT de l'étape 2, il vous faudra effectivement transformer ce dernier par un INSERT INTO ... SELECT ...
    Exemple :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    -- Etape 2  (transformée) 
    INSERT INTO 
      dbo.MatableResutat( . ....) 
    -- ici, il suffit reprendre à l'identique la requête SELECT de l'étape 2 ci-dessus.   
    SELECT CONCAT(A.NameBoard, SUBSTRING(A.MName,0,9),'-', SUBSTRING(A.DateTimer,0,11),'-', A.DateOfTest,'-', T.NewIdent) as SerialNum
    ...

    A+

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 62
    Points : 24
    Points
    24
    Par défaut
    D'accord, merci à vous tous pour ces explications ! C'est plus clair, et je ne savais pas tout ça. Je mets en résolue, ça pourrait servir !

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

Discussions similaires

  1. SQL : Création d'une colonne en incrément automatique
    Par crashyear dans le forum Développement
    Réponses: 5
    Dernier message: 23/02/2009, 18h58
  2. Création d'une colonne d'un datagridView
    Par Redg9 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 22/01/2009, 18h35
  3. Réponses: 4
    Dernier message: 19/06/2008, 15h30
  4. Création d'une colonne récapitulative
    Par solorac dans le forum Excel
    Réponses: 4
    Dernier message: 21/04/2008, 08h52
  5. [Access] création d'une colonne avec un numéro d'occurence
    Par J-Menezo dans le forum Langage SQL
    Réponses: 9
    Dernier message: 30/01/2007, 08h34

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