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

SAS Base Discussion :

Gestion des erreurs dans une étape DATA


Sujet :

SAS Base

  1. #1
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut Gestion des erreurs dans une étape DATA
    Bonsoir,

    J'ai un programme de retraitement de chaines de caractères qui pour certaines observations va immanquablement créer des erreurs.
    J'aimerais dans ce cas là que la variable sur laquelle s'est produite l'erreur ai une modalite "***ERREUR***" (pour "se souvenir" du lieu des erreurs voir créer un embranchement pour des traitements ad hoc que je définirais ensuite) pour cette observation, et par ailleurs que les erreurs spécifiques ne soient pas écrites dans la log (je souhaiterais faire une "interception" d'erreur en quelque sorte).

    Pour être plus explicite voici un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    DATA Table;
     
    Var='éèûâïËÂÔ';OUTPUT;
    Var='éèûâÝ';OUTPUT;
    Var='éèûâïËÂÔ';OUTPUT;
    Var='éèûâ”';OUTPUT;
    Var='';OUTPUT;
    run;
     
    DATA Table2; SET Table;
    Reverse=input(Var,$utf8x350.);
    Reverse2=input(input(Var,$utf8x350.),$utf8x350.);
    run;
    Voici la log

    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
     
    1230
    1231  DATA Table2; SET Table;
    1232  Reverse=input(Var,$utf8x350.);
    1233  Reverse2=input(input(Var,$utf8x350.),$utf8x350.);
    1234  run;
     
    NOTE: Invalid argument to function INPUT at line 1233 column 10.
    Var=éèûâÝ Reverse=Ã©Ã¨Ã»Ã¢Ý Reverse2=  _ERROR_=1 _N_=2
    NOTE: Invalid argument to function INPUT at line 1233 column 10.
    Var=éèûâïËÂÔ Reverse=éèûâïËÂÔ Reverse2=  _ERROR_=1 _N_=3
    NOTE: Invalid argument to function INPUT at line 1232 column 9.
    NOTE: Invalid argument to function INPUT at line 1233 column 16.
    Var=éèûâ” Reverse=  Reverse2=  _ERROR_=1 _N_=4
    NOTE: There were 5 observations read from the data set WORK.TABLE.
    NOTE: The data set WORK.TABLE2 has 5 observations and 3 variables.
    NOTE: DATA statement used (Total process time):
          real time           0.02 seconds
          cpu time            0.00 seconds
    voici la table de sortie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                             Obs    Var                                    Reverse             Reverse2
     
                              1     éèûâïËÂÔ    éèûâïËÂÔ    éèûâïËÂÔ
                              2     éèûâÝ                     éèûâÝ
                              3     éèûâïËÂÔ                       éèûâïËÂÔ
                              4     éèûâ”
                              5
    voici la table que j'aimerais avoir en sortie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                           Obs    Var                                    Reverse             Reverse2
     
                            1     éèûâïËÂÔ    éèûâïËÂÔ    éèûâïËÂÔ
                            2     éèûâÝ                     Ã©Ã¨Ã»Ã¢Ý           ***ERREUR***
                            3     éèûâïËÂÔ                       éèûâïËÂÔ            ***ERREUR***
                            4     éèûâ”                              ***ERREUR***        ***ERREUR***
                            5

  2. #2
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour Jérôme.
    Oui, on peut rattraper à la volée une erreur dans l'étape DATA.
    Quand il y a un souci, SAS met à jour une variable interne de son vecteur de travail appelée _ERROR_. Par défaut, celle-ci vaut 0. Elle montre des signes d'énervement en prenant n'importe quelle valeur positive (qui dépend de l'erreur évidemment, mais je ne sais pas où se trouve le dictionnaire des valeurs).
    Bref, tu la reconfigures à la volée car elle n'est pas protégée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DATA Table2; SET TABLE;
    Reverse=input(Var,$utf8x350.);
    Reverse2=input(input(Var,$utf8x350.),$utf8x350.);
    IF _error_>0 THEN DO ;
      Reverse ="***ERREUR***" ;
      Reverse2="***ERREUR***" ;
      _error_=0 ;
    END ;
    run;
    ... Peut-être que quelques vieux barbons comme moi auront une bouffée de nostalgie, ça vient de rappeler la programmation en CAML de mes 18 ans : on faisait des RAISE ERROR et des CATCH ensuite, je crois. En fait SAS c'est beaucoup plus cool que CAML comme langage, il y a plus de surprises.
    Bonne journée et merci de cette petite piqûre nostalgique.

    PS : c'est évidemment super dangereux de prendre l'habitude de planquer l'erreur sous le tapis. Il faudrait tester plus finement le code erreur, ou compliquer la condition (REVERSE2 est vide par exemple) pour ne pas enterrer tous les problèmes dans le même trou.
    Bon courage.
    Olivier

  3. #3
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Merci olivier, je vais tester ça.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Je viens de regarder plus en détails,

    malheureusement l'erreur ne disparait pas totalement, car celle dans la fonction s'affiche toujours

    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
     
    proc fcmp outlib=sasuser.MyFuncs.ChrFuncs;
    function conv(string $) $200;
    length conv $200;
    conv=input(string,$utf8x200.);
    return (conv);
    endsub;
    run; 
     
    options cmplib=sasuser.MyFuncs;
     
     
    data a;
    length var $100;
    var='é';output;
    var='éé';output;
    var='éééé';output;
    run;
     
    data b; set a;
    length var1 $100;
    var1=put(var,$utf8x100.);
    var2=substr(var1,1,5);
    var3=conv(var2);
    if _error_>0 then _error_=0;
    run;
    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
     
    119  data b; set a;
    120  length var1 $100;
    121  var1=put(var,$utf8x100.);
    122  var2=substr(var1,1,5);
    123  var3=conv(var2);
    124  if _error_>0 then _error_=0;
    125  run;
     
     
    ERROR: Un argument interdit est utilisé dans l'appel de la fonction dans la fonction 'INPUTC' dans l'instruction numéro 2,
           ligne 6, colonne 1.
           L'instruction était :
        0      (6:1)     conv = INPUT( string="ééÃ
                      ", $UTF8X200.(969996900) )
    ERROR: Exception occurred during subroutine call.
    NOTE: There were 3 observations read from the data set WORK.A.
    NOTE: The data set WORK.B has 3 observations and 4 variables.
    NOTE: DATA statement used (Total process time):
          real time           0.41 seconds
          cpu time            0.23 seconds

    Il s'agit donc de faire également la même interception d'erreur au niveau de la fonction, j'ai bricolé un peu le même code avec if _error_>0 then _error_=0 mais cela ne semble pas fonctionner dans la proc fcmp de la même façon que dans l'étape DATA

  5. #5
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Je ne sais pas si on peut facilement manipuler _error_ dans la fonction, car il y a un risque que ça soit une variable locale par défaut.
    Il faudrait mettre _error_ en paramètre "update" de la fonction, ou quelque chose de ce genre ; rien de simple en somme.
    Bon courage.
    Olivier

  6. #6
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Bonjour Olivier et merci,
    parce qu'en fait cette erreur se produit des centaines de milliers de fois et gonfle un ficher .txt où je stocke la log de cette étape.
    Et SAS prend beaucoup, beaucoup de temps à écrire dans cette log.

    Je cherche à ce qu'il y a plus aucune impression en log concernant cette étape alors si il n'y a pas moyen faire autrement, car les fichier log.txt de plusieurs Go ça sert à rien et ça ralenti....

    Je suis obligé de passer par ceci http://sas.developpez.com/faq/sas/?page=1.3#101 ?
    Cela permet bien de lancer quelque chose sans rien écrire dans la log ou quelque part d'autre (et donc sans perdre le temps en conséquence...) ?

  7. #7
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Vu que la solution http://sas.developpez.com/faq/sas/?page=1.3#101 ne semble pas marcher non plus,

    Finalement j'ai donc ajouté un test dans la fonction pour limiter sérieusement le cas des données invalides (je n'évalue la fonction que sur les données qui ont une chance d'être réellement modifiées par la fonctions, celles qui ne seront de toute façon modifiées et qui produisent des erreurs en nombre je ne les soumet plus, ça permet par la même occasion une petite optimisation du code) ce qui réduit drastiquement la taille du fichier log.txt à quelques dizaines de Mo limitant ainsi la perte de temps en écriture dans la log.

    Mais je demeure intéressé par une solution au problème de l'interception/gestion des erreurs dans les fonctions créées via fcmp

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1
    Points : 3
    Points
    3
    Par défaut
    As-tu essayé avec le caractère ? devant le format ?
    Cela évite l'affichage des erreurs mais continue d'alimenter la variable _error_.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DATA Table3; SET TABLE;
     Reverse=input(Var,?$utf8x350.);
     Reverse2=input(input(Var,?$utf8x350.),?$utf8x350.);
     IF _error_>0 THEN DO ;
       Reverse ="***ERREUR***" ;
       Reverse2="***ERREUR***" ;
       _error_=0 ;
     END ;
     run;

  9. #9
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Bonjour,

    oui j'ai essayé le ? devant comme tu le propose mais les erreurs demeurent

  10. #10
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Il manque un espace entre le caractère '?' et le nom du format.
    Consultez les FAQs et les anciens postes avant de poser vos questions. Merci

  11. #11
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    J'étais passé à d'autres travaux en attendant, je regarde dans la semaine sur ce point précis.

    Merci.

  12. #12
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 1 625
    Points : 3 403
    Points
    3 403
    Par défaut
    Je ne crois pas que c'est du à l'espace non laissé entre ?? et l'informat.

    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
     
     
    data dte;
    input var $10.;
    cards;
    12/03/2011
    11/09/2010
    30/06/2000
    11/09/2010
    31/06/2000
    00/09/2010
    30/06/2000
    32/09/2010
    30/00/2000
    11/09/2010
    30/06/2000
    ;run;
     
    data dte_1;
    set  dte;
    var1= input (var,??ddmmyy10.);
    run;
     
    data dte_2;
    set  dte;
    var1= input (var,?? ddmmyy10.);
    run;
     
    data dte_3;
    set  dte;
    var1= input (var,?ddmmyy10.);
    run;
     
    data dte_4;
    set  dte;
    var1= input (var,? ddmmyy10.);
    run;
     
    proc sql;
    create table dte_5 as select input (var,?? ddmmyy10.) from dte;
    quit;
     
     
    proc sql;
    create table dte_6 as select input (var,??ddmmyy10.) from dte;
    quit;
     
     
    proc sql;
    create table dte_7 as select input (var,?ddmmyy10.) from dte;
    quit;
     
     
    proc sql;
    create table dte_8 as select input (var,? ddmmyy10.) from dte;
    quit;
    Je dirai plutôt :
    pour n'imprimer que 1 seul MSG d erreur de chaque type d'erreur.
    Exemple:
    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
     
    data dte;
    input var $10.;
    cards;
    12/03/2011
    11/09/2010
    30/06/2000
    11/09/2010
    31/06/2000
    00/09/2010
    30/06/2000
    32/09/2010
    30/00/2000
    11/09/2010
    30/06/2000
    ;run;
    option error=1;
    data dte_1;
    set  dte;
    var1= input (var,ddmmyy10.);
    run;
     
    option error=200;
    data dte_2;
    set  dte;
    var1= input (var, ddmmyy10.);
    run;
    on voit bien que dans la première étape data SAS n'a imprimé qu'un seul message erreur de même type d'erreur. et dans la deuxième étape Data j'ai demandé d'imprimer jusqu'à 200 message du même type d erreur.
    j'espère que sa pourra t'aider.
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  13. #13
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    oui oui, mais c'est toujours la même histoire, ça limite les erreurs de l'étape data, mais pas celles de la fonction, et c'est celles ci qui me posent problème et que je n'arrive pas à supprimer.


    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
     
     
    proc fcmp outlib=sasuser.MyFuncs.ChrFuncs;
    function fonc(var$);
    return (input(var,ddmmyy10.));
    endsub;
    run;
    options cmplib=sasuser.MyFuncs;
     
     
    OPTION error=1;
    DATA dte_3;
    SET  dte;
    var1= fonc(var);
    run;

    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
     
    131
    132  OPTION error=1;
    133  DATA dte_3;
    134  SET  dte;
    135  var1= fonc(var);
    136  run;
     
     
    ERROR: Un argument interdit est utilisé dans l'appel de la fonction dans la fonction 'INPUTN' dans l'instruction numéro 2,
           ligne 5, colonne 1.
           L'instruction était :
        0      (5:1)     _fonc_ = INPUT( var="31/06/2000", DDMMYY10.(105088000) )
    ERROR: Une exception s'est produite durant l'appel du sous-programme.
    WARNING: La limite définie par l'option ERRORS= a été atteinte.  Les prochaines erreurs de ce type ne s'afficheront pas.
    var=31/06/2000 var1=. _ERROR_=1 _N_=5
     
    ERROR: Un argument interdit est utilisé dans l'appel de la fonction dans la fonction 'INPUTN' dans l'instruction numéro 2,
           ligne 5, colonne 1.
           L'instruction était :
        0      (5:1)     _fonc_ = INPUT( var="00/09/2010", DDMMYY10.(105088000) )
    ERROR: Une exception s'est produite durant l'appel du sous-programme.
     
    ERROR: Un argument interdit est utilisé dans l'appel de la fonction dans la fonction 'INPUTN' dans l'instruction numéro 2,
           ligne 5, colonne 1.
           L'instruction était :
        0      (5:1)     _fonc_ = INPUT( var="32/09/2010", DDMMYY10.(105088000) )
    ERROR: Une exception s'est produite durant l'appel du sous-programme.
     
    ERROR: Un argument interdit est utilisé dans l'appel de la fonction dans la fonction 'INPUTN' dans l'instruction numéro 2,
           ligne 5, colonne 1.
           L'instruction était :
        0      (5:1)     _fonc_ = INPUT( var="30/00/2000", DDMMYY10.(105088000) )
    ERROR: Une exception s'est produite durant l'appel du sous-programme.
    NOTE:  11 observation(s) lue(s) dans la table WORK.DTE.
    NOTE: La table WORK.DTE_3 a 11 observation(s) et 2 variable(s).
    NOTE: L'étape DATA a utilisé (Durée totale du traitement) :
          temps réel          0.33 secondes
          temps UC            0.09 secondes
    Quand aux ? ou ?? devant l'informat , blanc ou pas blanc, ça créé une erreur de compilation.


    En fait le titre est trompeur, ce fil est trop ancien je pense pour en changer le titre, mais "Gestion des erreurs dans la proc fcmp" serait plus indiqué.

    Enfin à présent c'est juste pour savoir, vu que finalement j'ai préfèré mettre le code en macro %fonc plutot que dans une fonction , ce qui a l'avantage de faire des erreurs dans l'étape DATA...dont on peu limiter le nombre comme vous me l'avez indiqué.

Discussions similaires

  1. gestion des erreurs dans une transaction mysql
    Par ytoutou dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/12/2010, 23h21
  2. Gestion des erreurs dans une boucle While
    Par Gregory.M dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/08/2008, 20h57
  3. Gestion des erreurs dans une requête "IF"
    Par tineighty dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/10/2007, 18h22
  4. Gestion des erreurs dans une classe
    Par gregb34 dans le forum ASP.NET
    Réponses: 10
    Dernier message: 26/07/2007, 09h59
  5. [VB6] Gestion des erreurs dans une dll
    Par zimba-tm dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/08/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