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

Delphi Discussion :

Problème de mise à jour d’une table sqlite depuis un DBLookupCombobox sous delphi 12.


Sujet :

Delphi

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Problème de mise à jour d’une table sqlite depuis un DBLookupCombobox sous delphi 12.
    Bonjour à tous.

    Je débute en programmation de base de données et avant de me lancer dans le grand bain pour mon application j’ai voulu faire mes armes sur un projet simple. En l’occurrence une base de données pour livres. Malgré la simplicité de ma base je bute sur un point. Après des jours de recherche et de test infructueux je me permets de vous sollicité.

    Contexte de développement :
    Delphi 12 community edition
    Sqlite

    La structure de ma base de données est la suivante
    Nom : Structure base donnees2.png
Affichages : 78
Taille : 30,6 Ko

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    CREATE TABLE tableEditeurs(
       id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
       editeur VARCHAR(50) NOT NULL,
       collection VARCHAR(50)
    );
     
    CREATE TABLE tableAuteurs(
       id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
       nom VARCHAR(50) NOT NULL,
       prenom VARCHAR(50)
    );
     
    CREATE TABLE tableSeries(
       id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
       serie VARCHAR(150) NOT NULL UNIQUE
    );
     
    CREATE TABLE tableLivres(
       id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
       numero INTEGER NOT NULL,
       titre VARCHAR(150) NOT NULL,
       lu BOLEEN NOT NULL,
       acquit BOLEEN NOT NULL,
       autreNumero INTEGER,
       auteurs_id INTEGER NOT NULL,
       serie_id INTEGER NOT NULL,
       Editeur_id INTEGER NOT NULL,
       FOREIGN KEY(serie_id) REFERENCES tableSerie(id)
    );
     
    CREATE TABLE tableLivres_tableAuteurs(
       livre_id INTEGER NOT NULL,
       auteurs_id INTEGER NOT NULL,
       FOREIGN KEY(livre_id) REFERENCES tableLivres(id),
       FOREIGN KEY(auteurs_id) REFERENCES tableAuteurs(id),
       PRIMARY KEY(livre_id, auteurs_id) UNIQUE
    );
     
    CREATE TABLE tableLivres_tableEditeurs(
       livre_id INTEGER NOT NULL,
       editeurs_id INTEGER NOT NULL,
       FOREIGN KEY(livre_id) REFERENCES tableLivres(id),
       FOREIGN KEY(editeurs_id) REFERENCES tableEditeurs(id),
       PRIMARY KEY(livre_id, editeurs_id) UNIQUE
    );

    Pour les trois tables ‘tableserie’, ‘tableediteurs’ et ‘tableauteurs’ je n’ai aucun problème de gestion ni de maintenance.
    Pour la table livre j’ai voulu utiliser des DBLookupCombobox pour la gestion et c’est la que je rencontre un problème. Mes données sont affichées dans un DBGrid avec la requête suivante.

    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
     
      GrilleQuery.sql.Clear;
      GrilleQuery.sql.Add('SELECT');
      // Champs affichés
      GrilleQuery.sql.Add
        ('tablelivres.numero AS N°, tablelivres.present AS Acquis, tablelivres.titre AS Titre,');
      GrilleQuery.sql.Add
        ('tableediteurs.editeur  AS Editeur, tableediteurs.collection AS Collection, tableSeries.serie AS Série,');
      GrilleQuery.sql.Add
        (' tableAuteurs.nom AS Nom, tableAuteurs.prenom AS Prénom, tablelivres.lu AS Lu');
      // Depuis la table
      GrilleQuery.sql.Add('FROM tableLivres');
     
      // Récupère la série liée au titre
      GrilleQuery.sql.Add
        ('LEFT JOIN tableSeries on tablelivres.serie_id = tableSeries.id');
     
      // Récupère le ou les auteurs liés au titre
      GrilleQuery.sql.Add
        ('JOIN tableLivres_tableAuteurs ON tableLivres_tableAuteurs.livre_id = tablelivres.id');
      GrilleQuery.sql.Add
        ('JOIN tableAuteurs ON tableLivres_tableAuteurs.auteurs_id = tableAuteurs.id');
     
      // Récupère le ou les éditeurs liés au titre
      GrilleQuery.sql.Add
        ('JOIN tableLivres_tableediteurs ON tableLivres_tableediteurs.livre_id = tablelivres.editeur_id');
      GrilleQuery.sql.Add
        ('JOIN tableediteurs ON tableLivres_tableediteurs.editeurs_id = tableediteurs.id');
     
      GrilleQuery.sql.Add('ORDER BY numero ASC');
      GrilleQuery.Open;
    Les paramètres du DBLookupCombobox sont :

    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
     
      // ==== test N° ============================================================
       AuteurNomQuery := TFDQuery.Create(self);
       AuteurNomQuery.Connection := U_Data.Data.FDConnection1;
       AuteurNomQuery.sql.Clear;
       AuteurNomQuery.Open('SELECT nom FROM tableauteurs ORDER BY nom ASC');
     
       AuteurNomDataSource := TDataSource.Create(self);
       AuteurNomDataSource.DataSet := AuteurNomQuery;
     
       EdAuteurNom.ListSource := AuteurNomDataSource;
    //   EdAuteurNom.ListField := 'nom';
       EdAuteurNom.KeyField := 'nom';
     
       EdAuteurNom.DataSource := GrilleSource;
       EdAuteurNom.DataField := 'nom';
     
       EdAuteurNom.DropDownWidth := 150;
      // ===========================================================================
    La liste déroulante du DBLookupCombobox est bien mise à jour avec les bonnes valeurs.

    Nom : Image3.PNG
Affichages : 75
Taille : 3,7 Ko

    La sélection d’un champ dans le DBGrid met bien à jour le champ de saisie du DBLookupCombobox.

    Nom : Image2.PNG
Affichages : 76
Taille : 22,1 Ko

    Par contre il met impossible de sélectionner une valeur dans la liste déroulante et de mettre à jour le champ correspondant du DBGrid.

    Pouvez me renseigner sur mon erreur et si j’utilise la bonne méthode pour la gestion de ma base. D’avance merci.

    PS : Pas trop de termes trop techniques sur les bases de données je débute et ce n’est que ma première base de données.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 789
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 789
    Points : 25 777
    Points
    25 777
    Par défaut
    Pour débuter le DBLookupCombobox n'est pas du tout le controle DB le plus aisé

    KeyField devrait plutôt être auteurs_id avec les SELECT de ListSource contenant auteurs_id et nom donc SELECT auteurs_id, nom FROM tableauteurs ORDER BY nom ASC;
    Le premier pour la jointure, le second pour l'affichage
    Donc KeyField := 'auteurs_id' et ListField := 'nom', évidemment DataField := 'auteurs_id';


    En plus si il y a une relation N-N, je pense que rédéfinir dans un TUpdateSQL les SQL de INSERT et UPDATE ne serait pas un luxe
    Je suppose que tu gères un Auteur principale directement dans la table tableLivres et les co-auteurs dans tableLivres_tableAuteurs comme par exemple DUNE: LA Communauté des sœurs écrit par Brian Herbert co-écrit avec Kevin J Anderson.

    Code DB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    tableAuteurs(1000, 'Herbert', 'Franck')
    tableAuteurs(1001, 'Herbert', 'Brian')
    tableAuteurs(1002, 'Anderson', 'Kevin J.')
     
    tableEditeurs(2000, 'Robert Laffont', 'Ailleurs et Demain')
     
    tableSeries(5000, 'DUNE')
     
    tableLivres(60000, 100, 'DUNE: LA Communauté des sœurs', True, True, 666, 1001, 5000, 2000)
     
    tableLivres_tableAuteurs(60000, 1002)



    Ensuite provoquer le reflet dans la TDBGrid d'une modification du auteurs_id ne sera pas automatique, en fait dans la DataSet, cela ne modifie que auteurs_id, il te faudra manuellement récupéré le nom
    Tu devrais explorer la piste du LookupDataSet, je l'utilise surtout avec des TClientDataSet, j'ai pas fait d'IHM de ce genre depuis quelques années au profit d'une programmation exclusivement server, mais j'ai toujours détesté le DBLookupCombobox même après 15 ans d'expérience en Delphi, souvent on manque de liberté et l'expérience utilisateur n'est pas terrible avec ce contrôle DB.

    Tu peux aussi utiliser une PickList directement dans la TDBGrid, je l'ai utilisé pas mal en D3 même si je lui préféré un OnElipsis avec un éditeur de colonne maison.



    Personnellement, je n'utilise jamais les controles DB pour faire les mises à jour directement sur la Base, je préfère de loin générer mon propre SQL (via une couche Entity lié à TClientDataSet et Delta) pour maitriser tout ce qui se passe.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 365
    Points : 41 921
    Points
    41 921
    Billets dans le blog
    65
    Par défaut
    Bonjour et bienvenue,

    j'attendais que ShaiLeTroll réponde avant de me lancer à mon tour (apparemment on regarde le forum plus ou moins en même temps).
    Je ferais les mêmes remarques que lui :
    - Il faut un TFDUpdateQuery.
    - Mais, je n'utiliserai qu'un seul combobox pour l'auteur affichant nom et prénom SELECT auteurs_id, nom,prénom FROM tableauteurs ORDER BY nom ASC; avec KeyField := 'auteurs_id' et ListField := 'nom,prenom';

    je suggère aussi de compacter un peu cette écriture du SQL assez difficile à lire pour une écriture comme celle-ci utilisant aussi les noms d'alias de table

    ce n'est qu'une ébauche. Comme la bonne idée a été de fournir le SQL de création des tables

    Attention aux espaces à conserver
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    const SQLGrille = 'SELECT L.numero AS N°, L.Acquit, L.titre AS Titre,l.Serie_id,'+
           'E.editeur  AS Editeur, E.collection AS Collection, LS.serie AS Série,'+
           'A.nom AS Nom, A.prenom AS Prénom,L.lu AS Lu'+
    ' FROM tableLivres L'+
    ' LEFT JOIN tableSeries  LS on LS.id = l.serie_i'+
    ' JOIN tableLivres_tableAuteurs LA ON LA.livre_id = L.id'+
    ' JOIN TableAuteurs A ON A.id=LA.auteurs_id'+
    ' JOIN tableLivres_tableediteurs LE ON LE.livre_id = L.editeur_id'+
    ' JOIN tableediteurs E ON LE.editeurs_id = E.id'+
    ' ORDER BY numero ASC';
    begin
     
    GrilleQuery.Open(SQLGrille);
    P.S. depuis D12 une possibilité d'écriture de texte plus facile (des chaînes littérales multilignes), toutefois on ne peut plus y mettre de commentaires et banni le reformatage de code (Ctrl+D) sous peine de mauvaises surprises

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    const SQLGrille = '''
                             SELECT L.numero AS N°, L.Acquit, L.titre AS Titre,l.Serie_id,
                             E.editeur  AS Editeur, E.collection AS Collection, LS.serie AS Série,
                            A.nom AS Nom, A.prenom AS Prénom,L.lu AS Lu
                            FROM tableLivres L
                            LEFT JOIN tableSeries  LS on LS.id = l.serie_i
                            JOIN tableLivres_tableAuteurs LA ON LA.livre_id = L.id
                            JOIN TableAuteurs A ON A.id=LA.auteurs_id
                            JOIN tableLivres_tableediteurs LE ON LE.livre_id = L.editeur_id
                            JOIN tableediteurs E ON LE.editeurs_id = E.id
                            ORDER BY numero ASC
                              ''' ;
    j'ai ajouté la colonne l.serie_id qui sera nécessaire mais je pense qu'il en manque d'autres (en fait, dans le cadre d'un FDUPdateSQL il faut mettre toutes les colonnes de tableLivres)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 365
    Points : 41 921
    Points
    41 921
    Billets dans le blog
    65
    Par défaut
    Dommage qu'il n'y ait pas de script de remplissage de données pour parfaire mon test (j'ai des doutes pour certaines jointures)

    pour la partie FDUpdateSQL
    Nom : Capture.png
Affichages : 50
Taille : 56,1 Ko

    (SQL moches à cause de l'utilisation de * mais j'ai utilisé ces SQLs)
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT L.*,
           E.editeur  AS Editeur, E.collection AS Collection, LS.serie AS Série,
           A.nom AS Nom, A.prenom AS Prénom
    FROM tableLivres L
    LEFT JOIN tableSeries  LS on LS.id = l.serie_id
    JOIN tableLivres_tableAuteurs LA ON LA.livre_id = L.id
    JOIN TableAuteurs A ON A.id=LA.auteurs_id
    JOIN tableLivres_tableediteurs LE ON LE.livre_id = L.editeur_id
    JOIN tableediteurs E ON LE.editeurs_id = E.id
    ORDER BY numero ASC
    après avoir généré les SQLs (fleche), il faudra, a minima, modifier la clause fetchrow en
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT L.*,
           E.editeur  AS Editeur, E.collection AS Collection, LS.serie AS Série,
           A.nom AS Nom, A.prenom AS Prénom
    FROM tableLivres L
    LEFT JOIN tableSeries  LS on LS.id = l.serie_id
    JOIN tableLivres_tableAuteurs LA ON LA.livre_id = L.id
    JOIN TableAuteurs A ON A.id=LA.auteurs_id
    JOIN tableLivres_tableediteurs LE ON LE.livre_id = L.editeur_id
    JOIN tableediteurs E ON LE.editeurs_id = E.id
    ORDER BY numero ASC
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour et merci à tous les deux pour ces réponses rapides.

    Une petite question pour « ShaiLeTroll » dans le select tu recommande de mettre auteurs_id

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT auteurs_id, nom FROM tableauteurs ORDER BY nom ASC,
    Hors auteurs_id ne fait pas partie de la table auteurs mais de la table de jonction « tableLivres_tableAuteurs »
    Pour les mises à jour je ne connaissais pas le composant TUpdateSQL(Je vais regarder), actuellement je fais mes mises à jour comme suit.

    Exemple sur les auteurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if Resultat <> -1 then
      begin
        Query.SQL.Clear;
        Query.SQL.Add('UPDATE');
        Query.SQL.Add('tableauteurs');
        Query.SQL.Add('SET nom = :PNom, prenom = :PPrenom');
        Query.SQL.Add('WHERE tableauteurs.id = :PNum');
        Query.ParamByName('PNom').AsString := EdNom.Text;
        Query.ParamByName('PPrenom').AsString := EdPrenom.Text;
        Query.ParamByName('PNum').AsInteger := Resultat;
        Query.ExecSQL;
    Sinon je gère tous les auteurs dans la table tableauteurs. La table tableLivres_tableAuteurs mes sert de jonction entre un livre et ces auteurs.
    « Echeque à la raison » de Jean-louis et Doris Le may. Deux entrées dans la table de jonction.
    LookupDataSet encore un composant que je n’ai pas utilisé.

    SergioMaster, j’ai volontairement supprimé les alias de table pour le développement. A un moment je mélangeais les TL, TL_TE, TE, … et autres alias.

    Sinon tu vas un peut trop vite pour ma compréhension. Je n’ai pas encore assimilé ni testés vos remarques.

    Cela fait beaucoup de chose à tester. Je vais tester les composants cités, voir si je peux les utilisés dans mon code et si cela améliore ma compréhension sur la gestion des bases de données.

    Je pense que je ne maitrise pas la relation entre les composants et les données quand on utilise une table maître « tablelivres » et une table détail « tableauteurs » en passant par une table de jonction « tablelivres_tableauteurs ». Si vous avez des tutoriels ou documentions explicites sur ces principes je suis preneur.

    Mon temps imparti étant limité et ma compréhension lente, je pense en avoir pour quelques jours à mettre tout ça en œuvre.
    Encore un grand merci à vous deux pour vos réponses.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 789
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 789
    Points : 25 777
    Points
    25 777
    Par défaut
    Citation Envoyé par skaith Voir le message

    Une petite question pour « ShaiLeTroll » dans le select tu recommande de mettre auteurs_id

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT auteurs_id, nom FROM tableauteurs ORDER BY nom ASC,
    Hors auteurs_id ne fait pas partie de la table auteurs mais de la table de jonction « tableLivres_tableAuteurs »
    Evidemment que je parlais du tableauteurs.id donc SELECT id, nom FROM tableauteurs ORDER BY nom ASC,;
    Je n'avais pas fait attention que les champ PK s'appelait tous 'ID' ...
    Ce que j'éviterais d'ailleurs, leur préférant un nom dédié comme dans les tables de jointure, cela évite les confusions et les noms ambiguës

    Citation Envoyé par skaith Voir le message
    Pour les mises à jour je ne connaissais pas le composant TUpdateSQL(Je vais regarder), actuellement je fais mes mises à jour comme suit.
    Comme on avait aucune information à ce sujet, je n'ai pu que proposer un conseil général, maintenant si cela fonctionne avec un DataSet en mode cache type local update et que tu fais les SQL manuellement, cela fonctionne aussi très bien
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. [Lazarus] Mise à jour affichage DbGrid et table Sqlite
    Par ovni76 dans le forum Lazarus
    Réponses: 1
    Dernier message: 31/03/2010, 09h16
  2. Mise à jour d'une Table-Sqlite pendant son parcours
    Par fadsys dans le forum PureBasic
    Réponses: 1
    Dernier message: 02/10/2009, 14h34
  3. [Access] Mise à jour de table depuis une autre
    Par Marcant dans le forum Langage SQL
    Réponses: 4
    Dernier message: 03/06/2006, 17h53
  4. Mise à jour d'une une table sql depuis table importée
    Par Yohann_x dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 09/03/2006, 12h43
  5. Transfert de table entre base de données sous delphi
    Par gregcommune dans le forum Bases de données
    Réponses: 3
    Dernier message: 27/07/2004, 08h56

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