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

C++ Discussion :

Mon programme de gestion des stocks ...


Sujet :

C++

  1. #21
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut
    Et bien justement. Notre ami mouchT8 semble effrayer par l'utilisation d'un unique fichier.

    Oui mais dans ce cas, il me faudra réécrire TOUTES les fiches contenu dans ce fichier à chaque modification, c'est trop casse tête
    Ou encore réussir à trouver les 6 lignes correspondants à DAFALGAN par exemple dans ce fichier gigantesque et ensuite les modifier ou supprimer et là j'avoue...
    Je pense donc que l'utilisation d'un unique fichier ini peut lui faciliter la tache.
    Il est extrêmement simple de modifier, supprimer, ajouter et bidouiller ce genre de fichier de part sa convention.

    [ASPIRINE]
    quantite=3435
    quantite_alerte=100
    fournisseur=toto
    ...

    [SIROP]
    quantite=12353
    quantite_alerte=1000
    fournisseur=tutu
    ...
    De cette manière il n'utilise qu'un seul fichier, ce qui est plus propre. Et comme tu le dit dans l'un de tes posts :

    [...] l'idéal reste quand même de ne manipuler qu'un seul fichier contenant l'ensemble des produits ...
    Après, ceci n'est qu'une proposition, qui a le mérite d'être simple (mono fichier, simple a manipuler, structuré et humainement lisible ... ). Bref, vous l'aurez compris, je suis partisan de l'utilisation d'un seul et unique fichier

    En espérant avoir aidé.
    Cordialement,

    PKO

  2. #22
    Membre confirmé Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Citation Envoyé par Altess Voir le message
    Je pense donc que l'utilisation d'un unique fichier ini peut lui faciliter la tache.
    Il est extrêmement simple de modifier, supprimer, ajouter et bidouiller ce genre de fichier de part sa convention.
    Ca à l'air une bonne solution également
    Il va me falloir par contre un tuto pour que je me familiarise avec ce type de fichier, car je ne les connais pas

  3. #23
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par mouchT8 Voir le message
    Windows XP pro sp2 !
    voilà déjà une bonne chose
    Oui mais dans ce cas, il me faudra réécrire TOUTES les fiches contenu dans ce fichier à chaque modification, c'est trop casse tête
    En tout cas, beaucoup moins "casse tête" que de vouloir gérer des centaines ou des milliers de petits fichier potentiels (même si je t'ai donné une piste dans cette optique)
    Ou encore réussir à trouver les 6 lignes correspondants à DAFALGAN par exemple dans ce fichier gigantesque et ensuite les modifier ou supprimer et là j'avoue...
    Ce que tu n'a pas l'air de comprendre, c'est qu'un fichier ne sert qu'à une et unique chose: permettre de récupérer les informations après avoir éteint l'ordinateur ou quitté l'application.

    Au niveau de l'application, cela revient à peut de chose près à créer trois fonctions:
    1. initialize qui lit le contenu du fichier
    2. work qui te permet travailler sur les différents produits directement au départ de la mémoire
    3. finalize qui écrit le contenu du fichier

    avec un code dont le squelette pourrait être très proche de
    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
    void initialize(std::map<std::string, TypeProduit> & lamap)
    {
       /* on lit le fichier, 
        * on crée  une instance de TypeProduit pour chaque fiche rencontrée
        * dans le fichier
        * et on place la fiche dans la map
        */
    }
    void work (std::map<std::string, TypeProduit> & lamap)
    {
       /* une fonction "principale secondaire" qui nous
        * permet d'assurer la gestion du stock au quotidien
        */
    }
    void finalize(std::map<std::string, TypeProduit> & lamap)
    {
       /* on ouvre le fichier de manière à l'écraser 
        * pour chaque produit de la map
        * on l'écrit dans le fichier
        */
    }
    /* la fonction principale pouvant être réduite à sa plus simple expression:
     */
    int main()
    {
        std::map<std::string, TypeProduit>  prods;
        initialize(prods);
        work(prods);
        finalize(prods);
        return 0;
    }
    J'aime bien cette solution
    Je pense que c'est la meilleure des choses à faire peut etre vu mon niveau en tout cas ? A méditer encore un peu...
    disons que c'est en tout cas peut être la moins mauvaise solution

    Allez, je vais être gentil, je vais même aller jusqu'à te donner le code des fonctions que j'ai nommée initialize et finalize:
    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
    void initialize(std::map<std::string TypeProduit> & lamap)
    {
        /* ouvrons le fichier  contenant les produits */
        std::ifstream ifs("fichier.txt"); 
        /* il nous faut des variables temporaires pour les différentes données
         * à lire
         */
       std::string nom;
       std::string info;
       std::string etagère;
       double prix;
       int stock;
       int alerte;
       /* le nom tient sur une ligne complete
        * nous retournons dans la boucle tant qu'on trouve un nom
        */
       while(std::getline(ifs,nom))
       {
            /* l'info tient aussi sur une ligne  complète*/
           std::getline(ifs,info);
           /* les trois dernières infos tiennent sur une seule ligne */
           ifs>>prix>>stock>>alerte;
           /* créons la fiche produit sur base de ce qu'on a lu, et
            * plaçons la dans la map
            */
           FicheProduit p(nom,info,prix,stock,alerte);
           lamap.insert(std::make_pair(nom,p));
       }
       /* fini :D */
    }
    void finalize(std::map<std::string TypeProduit> & lamap)
    {
       /* ouvrons le fichier en écrasement  */
       std::ofstream ofs("fichier.txt");
       /* tant que l'on trouve une fiche produit, nous l'écrivons dans le fichier
        */
       for(std::map<std::string TypeProduit>::const_iterator it=lamap.begin();
           it!=lamap.end();++it)
           (*it).second.write(ofs);
       /*fini  :D */
    }
    Il ne manque plus que la fonction membre (write de ta classe TypeProduit, qui doit juste respecter les spécifications indiquées dans initialize

    Ce pourrait être de l'ordre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void TypeProduit::write(std::ostream& ofs)
    {
        ofs<<nom<<std::endl
           <<info<<std::endl
           <<etagere<<" "
           <<prix<<" "
           <<stock<<" "
           <<alerte<<std::endl;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #24
    Membre confirmé Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    ME REVOILA!!

    Bon eh bien, ça avance !

    J'ai donc choisit la solution de créer une liste de tous les noms des produits (dans un fichier Fiches.txt)
    Et à coté de ça de créer un fichier par produit (Produit.txt)

    Ainsi l'utilisateur consulte la liste des produits quand il le veut (oui elle est longue ^^) et si il veut supprimer un produit, le nom du produit est supprimé de la liste.

    Certes le fichier Produit.txt n'est pas supprimé mais comme le disait mon ami plus haut ^^ le fichier n'étant pas "énormissime", cela ne pose pas vraiment de problème...
    Et puis imaginons qu'après avoir supprimé le produit TOTO, 6 mois plus tard, le revoilà mit en vente !! Il ne suffira à monsieur le pharmacien que de rajouter le nom du produit à la liste et le fichier TOTO.txt sera déjà là...
    Reste à le mettre à jour.
    Enfin bref!

    J'ai donc instauré un

    qui contient cette liste de produit, que je recopie dans mon fichier "Fiches.txt" quand cela est nécessaire..

    Mon petit problème est que j'aimerais que mon vector classe alphabétiquement mes produits!!
    Comme ça lorsque j'affiche la liste, l'utilisateur pourra plus facilement se repérer dans cette liste! Sinon c'est l'orgie totale!

    J'ai donc consulter des tutaux sur "vector" et j'ai trouvé cette fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::sort( stock.begin(), stock.end() );
    seulement c'est pour trier par ordre croissant des données de type int, dans cet exemple..

    Existe-t-il une fonction pour trier par ordre alphabétique?

  5. #25
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    std::sort trie selon l'opérateur "<".

    Donc soit cela a un sens de redéfinir l'opérateur < pour ton objet, soit pour ce cas spécifique, tu crées une fonction de comparaison :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool compareMonType(const MonType& t1, const MonType& t2)
    qui renvoie vrai si t1 est inférieur à (c'est à dire, à placer avant) t2.

    Et ensuite, tu appelles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::sort(v1.begin(), v1.end(), compareMonType);

  6. #26
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par mouchT8 Voir le message

    J'ai donc consulter des tutaux sur "vector" et j'ai trouvé cette fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::sort( stock.begin(), stock.end() );
    seulement c'est pour trier par ordre croissant des données de type int, dans cet exemple..

    Existe-t-il une fonction pour trier par ordre alphabétique?

    Non sort s'appuie par défaut comme dis par white tentacle sur l'op < donc si tu as des int il compare les int si c'est des string il compare par ordre alphabétique.

    Il y'a une surcharge qui te permet de spécifier l'ordre de comparaison que du souhaites.
    http://bakura.developpez.com/tutoriel/cpp/tri/#LII-A

  7. #27
    Membre confirmé Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Merci

  8. #28
    Membre confirmé Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    J'ai ici ma fonction de suppression ...

    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
    void Supprimer_Fiche(){
     
    int i;
    string nomm;  
     
    cout<<"**********************************"<<endl;
    cout<<"***SUPPRESSION DE FICHE PRODUIT***"<<endl;
    cout<<"**********************************"<<endl;
    cout<<endl;
    cout<<endl;
     
    //ici on se contente de supprimer le nom du produit dans la liste Fiches.txt
    //ainsi il ne figure plus parmis les noms de produits courants
    //toutefois, le fichier "produit".txt n'est pas supprimé
    //le fichier n'étant pas de grande taille cela ne posera pas de problème -
    //quant à son stockage sur le disque dur
    //De plus, il pourrait etre nécessaire de garder en stock ce fichier
    //si un jour on vient a remettre ce produit en stock: il restera alors juste 
    //à mettre les informations à jour
     
    cout<<"Veuillez saisir le nom du produit \205 supprimer: ";
    cin>> nomm;
    cout<<endl;
     
     
     
    for(size_t i=0, size=stock.size(); i<size; ++i){
     
                      if(stock[i]==nomm){       
     
        stock[i]== "" ; //suppression du nom               
    }
    save_pd();
     
    }
     
    cout<<"Fiche supprim\202e."<<endl;
    cout<<endl;
     
    cout<<"Op\202ration termin\202e!"<<endl;
    cout<<"Retour au menu principal.. (appuyer sur une touche pour continuer)"<<endl;
    cout<<endl;
    getchar();
    getchar();
     
    }


    la fonction save_pd() qu'elle contient est ici:

    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
     
    void save_pd(){
     
         cout<<"***SAUVEGARDE DU PRODUIT DANS LA LISTE***"<<endl;
         cout<<"*****************************************"<<endl;
         cout<<endl;
     
     
         //on trie..
     
         ofstream fichier("Fiches.txt", ios::out | ios::ate); //ouverture du fichier Fiches.txt
                                        //qui contient la liste des produits
     
         if(fichier){
     
                     for(size_t i=0; i<stock.size(); i++){ 
                                //on parcours le tableau contenant tous
                                               //les noms de produits ...   
     
                     fichier << stock[i] << endl; //et on le copie dans le fichier
     
     
                     }
                     fichier.close();
         }
     
     
     
         else {cout<< "ERREUR lors de l'ouverture du fichier Fiches.txt"<<endl;
         //retour au menu...
         }
     
    }

    Mon problème c'est tout simplement que le nom du produit que je supprime...
    ne se supprime pas justement!

    J'ai pourtant créer mon
    vector<string>stock
    qui contient les noms des produits...

    que je recopie dans le fichier Fiches qui contient la liste des produits..
    une fois avoir chercher et supprimer (dans stock) le nom à supprimer!

    J'ai du oublier ou mettre quelque chose quelque part qui fait que ma fonction réécrit le nom du produit..
    ou alors un problème de syntaxe dans ma suppression ou encore dans ma recherche?

    Ca fait 1h que je gob devant ce problème sans aucune (bonne) solution

    Quelqu'un voit mon erreur?

  9. #29
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    En fait tu dois supprimer de manière effective l'élément "nom du produit" de la collection de noms.

    Une fois que tu as effectué un tri de ton tableau, tu peux utiliser la fonction find pour trouver l'élément à retirer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void suppression_produit(std::vector<std::string>& tab, std::string const &prod)
    {
        std::vector<std::string>::iterator it=std::find(tab.begin(),tab.end(),prod);
        if (it!=tab.end())
            tab.erase(it);
    }
    J'ai considéré que le nom du produit à supprimer est demandé par ailleurs et fournit sous la forme de la std::string prod...

    Cela permet, encore une fois, de séparer la partie "métier" (qui n'est en définitive que le fait de supprimer un élément) de la partie "interface utilisateur" dans laquelle tu va faire le nécessaire, dans le cas présent, d'obtenir d'une manière ou d'une autre le nom du produit de la part de l'utilisateur

    EDIT: d'ailleurs, de manière générale, il est intéressant de faire cette distinction de manière systématique entre ce qui a un but informatif ou de questionnement de l'utilisateur et ce qui correspond au travail à réellement effectuer.

    Dans ce sens, toute la partie d'affichage lors de la sauvegarde de la liste des produits (et sans doute aussi ce qui concerne l'ouverture du fichier, car le but pourrait très bien de créer un flux à envoyer sur le réseau), devrait faire partie d'une fonction séparée de la partie qui s'occupe réellement de l'enregistrement des noms de produits.
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #30
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ofstream fichier("Fiches.txt", ios::out | ios::ate);
    Une petite chose :
    ofstream = out file stream, donc inutile de mettre ios::out en paramètre.

    Mais surtout :
    ios::ate = at end, donc le fichier "Fiches.txt" est ouvert en positionant le flux à la fin, c'est à dire en rajoutant des informations à chaque fois que l'on écrit dedans. Est-ce que c'est bien le comportement attendu ?

  11. #31
    Membre confirmé Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Merci, mon sauveur !! lol

  12. #32
    Membre confirmé Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ofstream fichier("Fiches.txt", ios::out | ios::ate);
    Une petite chose :
    ofstream = out file stream, donc inutile de mettre ios::out en paramètre.

    Mais surtout :
    ios::ate = at end, donc le fichier "Fiches.txt" est ouvert en positionant le flux à la fin, c'est à dire en rajoutant des informations à chaque fois que l'on écrit dedans. Est-ce que c'est bien le comportement attendu ?

    Oupsssss !!! Non

  13. #33
    Membre confirmé Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Programme terminé (enfin presque) manque plus que les retouches!
    Merci pour votre aide!

    Une dernière petite question, qui pourrait rendre tout ça plus "joli":

    Existe t il un moyen d'effacer tout ce qui a été précédemment écrit sur l'écran d'exécution?
    Voyez? pour pas que tout s'écrive à la suite, pouvoir insérer cette petite chose à certains endroit pour que par exemple a la fin de telle recherche, au moment ou on retourne au menu principal, que tout ce qui a été écrit disparaisse.

    Est ce que je m'explique correctement?

  14. #34
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Par défaut
    En C++, non. Effacer la console relève de l'environnement d'exécution de ton programme.

    Néanmoins on peut toujours bricoler avec la fonction system (qui se trouve dans le header cstdlib). Sous Linux :
    Sous Windows :
    Comme tu le vois, ce n'est ni propre ni portable. D'une façon générale il est déconseillé de vouloir effacer la console de l'utilisateur... pas sûr qu'il apprécie.

  15. #35
    Membre confirmé Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Arf!

    OK!

    Ben c'est pas grave ça restera comme ça

    Merci !

  16. #36
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Sinon, c'est possible de faire ça avec ncurses (il me semble que ça a été porté sous win).

  17. #37
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Ouaip, et ça répond au nom de pdcurses.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [XL-2013] Programme Gestion des stocks
    Par marlene65 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/12/2014, 12h12
  2. [DB2] calcul, gestion des stocks
    Par moineaux44 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/06/2006, 14h06
  3. Gestion des Stocks
    Par laklak dans le forum Bases de données
    Réponses: 4
    Dernier message: 07/06/2006, 15h52
  4. [MS-DOS] Application de gestion des stocks
    Par ¤dinky¤ dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 30/01/2006, 15h25
  5. gestion des stocks
    Par gekondo dans le forum Access
    Réponses: 1
    Dernier message: 30/09/2005, 12h41

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