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

Macro Discussion :

Macro dans une macro: ça boucle ! et de toute façon, ça ne fait pas ce que je veux :)


Sujet :

Macro

  1. #1
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut Macro dans une macro: ça boucle ! et de toute façon, ça ne fait pas ce que je veux :)
    (Re)(re)bonjour,

    dernier message de la journée, ne vous inquiétez pas
    je poste maintenant car demain c férié donc je n'aurai plus accès à mon code.

    après avoir tenté d'imbriquer une étape data dans une étape data - ce qui en brut n'est pas possible mais le devient grace à call execute - merci Bruno - je tente d'imbriquer une macro dans une macro.
    je sais que c'est possible car je l'ai déjà fait sauf qu'aujourd'hui, j'ai envie de tester des trucs de ouf.
    je veux imbriquer la macro X dans la macro X.

    mais j'ai 2 problèmes:
    1. ça tourne en boucle !
    2. au cas où vous arriveriez à ne plus le faire tourner en boucle, je ne récupère pas mes données en sortie car j'utilise les memes datasets donc ils s'ecrasent. or moi, je voudrais qu'ils se concatènent.

    voici l'explication de la situation globale:

    j'ai un dataset X de plusieurs milliers de lignes et une seule colonne.
    j'ai un dataset Y de plusieurs centaines de lignes et une seule colonne.

    le but est de trouver le mot de Y le plus proche pour chacune des lignes de X.
    donc je fais passer la fonction sas en essayant de croiser toutes les lignes de X avec toutes les lignes de Y.

    dans un premier temps, j'ai transposé mon dataset Y pour avoir tout en une seule ligne.
    dans un second temps, je prend la première ligne du dataset X que je fusionne avec le dataset Y transposé.
    ça me donne un dataset d'une seule ligne et plusieurs colonnes. Voici les colonnes:
    - TermToCode (issue du dataset X)
    - col1 (issue du dataset Y transposé)
    - col2 (issue du dataset Y transposé)
    - col3 (issue du dataset Y transposé)
    ...

    Je calcule res1, res2, ... qui est la distance entre TermToCode et col1/col2/...
    Le but du programme est d'associer TermToCode soit à col1 soit à col2 soit à col3...
    Le choix de col1, col2, col3 ... se fait en fonction de res1, res2, res3, ...
    Le choix de res1, res2, res3 ... se fait en fonction de la valeur de ces variables: c'est la valeur minimum qui gagne.

    si min(of res1-res...) est la valeur contenue dans res1 alors créer dataset contenant TermToCode et col1 et res1
    si min(of res1-res...) est la valeur contenue dans res2 alors créer dataset contenant TermToCode et col2 et res2
    si min(of res1-res...) est la valeur contenue dans res3 alors créer dataset contenant TermToCode et col3 et res3

    donc à la fin, j'aimerai que tous ces mini datasets d'une ligne et trois colonnes soient mis bout à bout pour me créer un giga dataset, avec 3 colonnes (TermToCode, col et res) et les milliers d'observations du dataset X d'origine.


    Je vous mets donc mon code ci dessous avec les endroits où ça me pose souci.

    Merci à vous de m'avoir lue jusqu'ici et merci d'avance pour votre aide.
    Si vous pensez que je m'y prends mal pour ce que je veux faire et qu'il y a un autre moyen plus simple ou plus performant ou les 2 à la fois, n'hésitez pas à m'en faire part.

    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
     
    /* datasetSource correspond au dataset X */
    /* datasetTemplate correspond au dataset Y */
    %macro CrossData(datasetSource,datasetTemplate);
     
    	data UniqueCase;
    		set &datasetSource;
    		where id=1;
    	run;
     
    	data MixSourceTemplate;	
    		merge UniqueCase &datasetTemplate;
    		by id;
    	run;
     
    	data DistMix;
    		set MixSourceTemplate;
    		array CompareData {*} termToCode col1-col30;
    		array res (*) res0-res30 ;
    	    do i=2 to dim(CompareData) ;
    	    	res[i]=complev(CompareData[1],CompareData[i]);
    			if CompareData[i]="" then do;
    				res[i]="999999999";
    			end;
    	    end ;
    		drop i;
    	run;
     
    	data DistMixInter;
    		set DistMix;
    		Closest=min(of res1-res30);
    		array TabRes{*} res1-res30;
    		array TabCol{*} col1-col30;
    		do i=1 to dim(TabRes);
    			if TabRes[i]=Closest then do;
    				Winner=TabCol[i];
    			end;
    		end;
    		drop i;
    	run;
     
    	data DistMixFinal (keep= TermToCode Winner Closest);
    		set DistMixInter;
    	run;
     
    	/* coller les uns aux autres les datasets d'une ligne */
     
    	data &datasetSource;
    		set &datasetSource;
    		if id=1 then delete;
    	run;
     
    	data &datasetSource;
    		set &datasetSource;
    		id=_N_;
    	run;
     
    	%CrossData(&datasetSource,&datasetTemplate); /* tourne en boucle */
     
    %mend;

  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
    Bonsoir.
    Excuse-moi de ne pas répondre directement à ton souhait de faire des macro-programmes récurrents, ce qui est toujours un peu pénible... et dangereux s'ils ne savent pas s'arrêter !
    j'ai un dataset X de plusieurs milliers de lignes et une seule colonne.
    j'ai un dataset Y de plusieurs centaines de lignes et une seule colonne.
    le but est de trouver le mot de Y le plus proche pour chacune des lignes de X.
    Ce que je ferais c'est quelque chose qui me semble plus simple : un produit cartésien de tes deux tables en SQL, et dans la même requête, le calcul pour chaque couple de mots de ta distance, et enfin le MIN de cette distance par mot de la table qui t'intéresse.
    En gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    PROC SQL ;
       CREATE TABLE work.plusProche AS
          SELECT tBase.mot,
                     tCompare.mot,
                     COMPLEV(tBase.mot, tCompare.mot) AS distance,
                     MIN(CALCULATED distance) AS minimum
          FROM tBase, tCompare
          GROUP BY tBase.mot
          HAVING distance = minimum
       ;
    QUIT ;
    Du coup, pas besoin de macros, mais ça prendra un peu de temps à l'exécution ! Et sinon, tu peux aussi faire un produit cartésien avec un double SET dans l'étape DATA, mais ce n'est pas vraiment intuitif... et ça ne sera pas forcément mieux optimisé.
    Bon courage et bon week-end.
    Olivier

  3. #3
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    Pour compléter le mot d'Olivier, je te suggère d'utiliser les autres fonctions de calculs de distance dans la SQL afin de vérifier la robustesse des résultats et de pouvoir choisir celle qui conviendra le mieux.

  4. #4
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    Bonjour,

    Merci à tous les deux. Je vais essayer cela dès lundi.

    J'avais tenté avec une macro car je ne voyais pas comment faire pour associer chaque ligne d'une table à chaque ligne de l'autre table donc je contournais le problème en réduisant à une ligne pour chaque table . Je tenterai la proc sql.

    Je ferai également tourner la fonction compged qui calcule la distance généralisée et semble plus performante que complev mais les docs disent que ça demande pas mal de puissance.

    Merci encore pour votre aide.
    Dès que ça a tourné, je vous tiens au courant.

    Bonne fin de week end

  5. #5
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut


    TROP COOL !!!!

    cette proc sql fait exactement ce que je voulais. en fait, le fait de vouloir toutes les lignes d'une table croisée avec toutes les lignes d'une autre table, je ne savais pas comment faire. et le fait de joindre les 2 tables sans mettre de table1.id=table2.id fait ce que je voulais.

    bon, j'ai testé seulement sur 20 lignes pour chaque table.
    demain (car il faudra bien une journée à mon ordi voire plus), je lancerai les tables complètes.

    un grand merci à vous olivier et datametric, aussi bien pour ce topic que pour ceux où vous m'avez déjà bien aidée.

    bonne fin de journée

  6. #6
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    euh de rien mais quel est le nombre de lignes de tes tables sur lesquelles tu vas faire ton produit cartésien ?

    Stéphane.

  7. #7
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    alors il va y avoir plusieurs groupes mais le maximum que je vais faire c'est environ 700000 x 20000.

    je t'en supplie, ne me dis pas que mon ordi peut y passer plusieurs jours ...
    (il met 40 minutes à copier les 700000 lignes dans le work).
    bon, enfin tant que ça dépasse pas le 30 septembre 2009, date de fin de stage, c'est bon

  8. #8
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    ...40 minutes ou 40 secondes

    Il faudrait que tu pédales plus vite

    essaie progressivement pour faire un calcul de temps peut-être.

    Combien de temps met ce programme chez toi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    data _700;
    array c(*) c1-c100;
    do j= 1 to 700000 ;
    	do i=1 to 100;
    	c(i) = int(ranuni(0)*12456);
    	end;output;
    end;
    run;
     
    data _7002;
    set _700;
    run;

  9. #9
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    Bonjour,

    alors j'ai fait tourner ton code ce matin:
    - 1ère partie (data _700): temps réel = 19 secondes
    - 2ème partie (data _7002): temps réel = 13 secondes

    j'ai regardé les tables en sortie et ça semble avoir fait ce qu'il fallait.

    pourtant, l'ordi met bien 40 minutes et non 40 secondes à copier 700000 lignes qui sont sur le serveur de la boite vers le work sur mon ordi. et une collègue l'a également fait sur son ordi: idem, 40 minutes. ce n'est qu'une copie d'une table vers une autre table, aucune modif de label, aucun ajout de variable ...

    ça pourrait provenir des droits restreints d'utilisateur ?

    car s'il faut 40 minutes pour une copie de 700000 lignes, as tu un moyen de savoir approximativement combien de temps prendrait le produit cartésien 700000*20000 ?

    merci

  10. #10
    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,
    tes 40 min passent surtout à faire une copie via le réseau de la boîte, pas à faire bosser SAS. D'ailleurs, pourquoi ne pas travailler sur le serveur ? Il est plus puissant, et si les tables s'y trouvent déjà, on évite la perte de temps d'une copie...

  11. #11
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    Effectivement tu ne fais que rapatrier des données via le réseau. le test est rassurant et montre que la partie SAS fonctionne bien. Ton produit cartésien ne sera pas fatal.

    Combien de temps prend la copie quand tu le fais depuis l'explorateur Windows ?

    Petit doute : quand tu copies, tu ne fais pas une étape DATA quand même, tu utilises bien une PROC COPY ?

    Pourquoi tes tables sont sur un serveur ? Est-ce que SAS n'est installé que sur ton PC et tes données sont stockées sur un serveur de partage windows ?
    Si c'est le cas, il faudrait demander à ton administrateur technique de passer ta WORK et UTILLOC sur le disque où sont tes données. Ca peut marcher, le moteur de traitement reste sur ton PC mais les I/O sont concentrés sur le serveur.

    Les risques : le DD réseau est plus lent ou arrive vite à saturation.

    SI tu n'as pas d'admin, je ferais le test là où je suis en ce moment et te dirais si ca marche.

  12. #12
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    je n'ai pas le droit de le faire ...
    dans la boite où je suis, personne ne travaille directement sur les vraies tables. il faut toujours les copier dans work, faire les data steps dans le work, lancer les proc dans le work. ça génère des output html que l'on conserve. mais on ne garde pas les tables créées dans le programme.

  13. #13
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    je viens de voir ton message datametric.

    ben si, je fais une étape data pour la copie . je vais regarder sur le net pour la proc copy.

    je suis en train de faire la copie dans l'explorateur windows. je te dirai combien de temps ça a mis.

    oui, il y a un admin réseau mais je pense qu'il n'acceptera pas de le faire. je ne suis que stagiaire et la seule chose qu'ils font depuis que j'ai commencé, c'est de faire des tests avec moi pour que j'ai le moins de droits possibles ... un jour, ils m'en ont tellement retiré que excel mettait 1 minute à s'ouvrir !

  14. #14
    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
    OK, personne ne travaille sur les vraies tables, mais tu peux bosser sur une session SAS du serveur, et copier dans SA work plutôt que de travailler en local ?
    La proc COPY optimise les duplications de tables sur une même session SAS, mais pas les copies client/serveur. Tu pourrais à la rigueur essayer une porc Download au lieu de l'étape Data, mais si le réseau est lent, il est lent.
    L'idéal c'est de rester sur le serveur autant que possible.

  15. #15
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    alors, le test de copie depuis l'explorateur windows a mis 37 minutes environ.

    si l'idéal est de travailler sur le serveur,
    1. quel est le paramètre dans sas (installé sur mon ordi) à modifier pour dire que l'on veut utiliser le work du serveur au lieu du work de l'ordi ?
    2. si je fais cela et que ma collègue fait cela, est ce que l'on va travailler sur le meme work ou bien ce seront 2 sessions séparées ?

    merci

  16. #16
    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
    En client/serveur, chacun a une Work séparée. En fait, chaque connexion au serveur SAS démarre une session distincte. Donc pas de risque de vous marcher sur les pieds avec ton collègue.
    Actuellement, pour récupérer les données, tu fais comment ? Tu vas dans SAS, et tu as une bibliothèque avec un globe sur son icone, qui correspond aux données du serveur ?
    Est-ce qu'il se passe quelque chose quand tu exécutes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    RUSBMIT ;
    PROC PRINT DATA=sashelp.class ;
    RUN ;
    ENDRSUBMIT ;
    Tu as des messages comment dans la Log ?

  17. #17
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    Actuellement pour récupérer les données,
    1. je crée un libname avec le chemin où est la vraie table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libname RealDataSet "C\...";
    2. je fais un data step où je copie la vraie table dans mon work
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    data NomCopieTable;
    set RealDataSet.NomVraieTable;
    run;


    J'ai executé ton programme. J'ai mis en pièce jointe le message sur la log: je n'ai pas le module SAS/CONNECT. C'est grave ?
    Images attachées Images attachées  

  18. #18
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    Oui tu n'as que le moteur SAS à un endroit : ton pc. Olivier pensait que le moteur SAS était également sur le serveur. Mais tu n'as qu'un serveur de données et non de traitement.

    Si tu avais le module il t'aurait mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ERREUR: Invalid or unspecified remote session id. Set OPTIONS REMOTE=session_id.
    ERREUR: Remote submit to UNKNOWN cancelled.

    Si le transfert windows met 37 minutes sur l'objet via l'explorateur, tu ne pourras pas aller plus vite : le tuyau est trop petit.

    Avant que l'on insulte tous ton admin, peux-tu lui expliquer que 37 minutes tous les jours c'est du temps perdu pour toi ou bien il faut que l'on vienne ?
    Plus sérieusement, pourquoi ne peux-tu pas sauver des tables ou des fichiers plats sur ton PC ou une clef USB de qq giga.

  19. #19
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    lol

    oui c du temps perdu. mais pas le mien en fait car pdt que je copie, je viens sur le forum ou je vais sur le net pour découvrir sas un peu plus: je m'auto-forme.

    ceci étant dit, la copie que j'ai faite ce matin sur mon ordi, je la conserve et je travaillerai dessus désormais. dc je changerai mes programmes pour ne plus que ce soit sur work.

    merci encore pour tous vos conseils.

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

Discussions similaires

  1. utiliser une macro dans une macro
    Par Calimero33 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/07/2010, 17h48
  2. Exécuter une macro dans une autre macro
    Par marc56 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/02/2008, 13h17
  3. résultat d'une macro dans une liste déroulante.
    Par Empty_body dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/01/2008, 15h58
  4. bouton d'appel d'une macro dans une feuille excel avec défilement
    Par fabrice44 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/01/2008, 15h30
  5. Exécution d'une macro dans une base Access en VB6
    Par Safaritn dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 25/05/2007, 17h00

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