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

JDBC Java Discussion :

Afficher une JTable comprenant plusieurs tables SQL


Sujet :

JDBC Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 48
    Points : 37
    Points
    37
    Par défaut Afficher une JTable comprenant plusieurs tables SQL
    Bonjour à tous

    je suis occupé sur un projet java où j'utilise une base de données où je fais des ajouts, modifications, suppression et donc je voudrais afficher une JTable qui affiche le résultat d'une requete sql utilisant plusieurs table access

    Imaginons car mon exemple est plus long, que j'ai une table club qui comprend plusieurs champs dont un indice (identifiant) et un libellé, j'ai une autre table joueur qui comprend toutes les informations concernant un joueur (numero, nom, prenom, adresse, ... et le club dans lequel il est affilié)

    donc la requête SQL donnerait :
    Select j.Nom, j.Prenom, j.Club, c.Libelle
    From Joueur j, Club c
    Where c.Indice = j.Club
    and j.Club = indiceClubChoisi;

    Je voudrais donc trouver le moyen d'afficher cette JTable



    je vous mets un exemple de méthode d'une requete et la classe de la JTableModel s'y rapportant dans le cas où je n'utilise qu'une seule table access

    Code Java :

    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
    public Vector<Joueur> getAllJoueurs() throws PasIdentification, AllJoueursException 
    	{
     
    		Vector <Joueur> allJoueurs = new Vector <Joueur>();
     
    		try
    		{
    			Joueur joueur;
    			String instructionSQL = "select * from Joueur order by NumeroAffiliation";
     
    			PreparedStatement prepStat = MyConnection.getConnect().prepareStatement(instructionSQL);
    			ResultSet donnees = prepStat.executeQuery();
     
    			while(donnees.next())
    			{
    				joueur = new Joueur(donnees.getInt(1),donnees.getString(2),donnees.getString(3), new GregorianCalendar(), donnees.getString(5), donnees.getString(6), donnees.getString(7), donnees.getInt(8), donnees.getInt(9),donnees.getString(10), donnees.getBoolean(11), donnees.getString(12), donnees.getString(13));
     
    				joueur.getDateNaiss().setTime(donnees.getDate(4));
    				allJoueurs.add(joueur);
    			}
    		}
    		catch(SQLException e)
    		{
    			throw new AllJoueursException(e.getMessage());
    		}
    		return allJoueurs;
    	}


    et voilà la classe qui crée la JTable

    Code Java :
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    package Model;
     
    import java.util.Date;
    import java.util.Vector;
     
    import javax.swing.table.AbstractTableModel;
     
    public class AllJoueursModel extends AbstractTableModel
    {
    	private Vector<String> columnNames = new Vector<String>();
    	private Vector<Joueur> vectJoueur = new Vector<Joueur>();
     
    	public AllJoueursModel(Vector<Joueur> vectAllJoueurs)
    	{
    		vectJoueur = vectAllJoueurs;
     
    		columnNames.add("Numero affiliation");
    		columnNames.add("Nom");
    		columnNames.add("Prenom");
    		columnNames.add("Date naissance");
    		columnNames.add("Nationalite");
    		columnNames.add("Classement");
    		columnNames.add("Nom rue");
    		columnNames.add("Num rue");
    		columnNames.add("Code postal");
    		columnNames.add("Localite");
    		columnNames.add("Droitier");
    		columnNames.add("Club");
    		columnNames.add("Fonction");		
    	}
     
    	public int getColumnCount() 
    	{
    		return columnNames.size();
    	}
     
    	public int getRowCount()
    	{
    		return vectJoueur.size();
    	}
     
    	public String getColumnName(int col)
    	{
    		return columnNames.elementAt(col); 
    	}
     
    	public Object getValueAt(int row, int col) 
    	{
    		Joueur j = vectJoueur.elementAt(row);
    		switch (col)
    		{
    			case 0 : return j.getAffiliation();
    			case 1 : return j.getNom();	
    			case 2 : return j.getPrenom();
    			case 3 : return j.getDateNaiss().getTime();
    			case 4 : return j.getNationalite();
    			case 5 : return j.getClassement();
    			case 6 : return j.getNomRue();
    			case 7 : return j.getNumeroRue();
    			case 8 : return j.getCodePostal();
    			case 9 : return j.getLocalite();
    			case 10: return j.getDroitier();
    			case 11: return j.getClub();
    			case 12: return j.getFonction();
    			default: return null;
    		}
    	}	
     
    	public Class<?> getColumnClass(int col)
    	{	
    		Class c = Integer.class;
    		switch (col)
    		{
    			case 0 : c = Integer.class; break;
    			case 1 : c = String.class; break;
    			case 2 : c = String.class; break;
    			case 3 : c = Date.class; break;
    			case 4 : c = String.class; break;
    			case 5 : c = String.class; break;
    			case 6 : c = String.class; break;
    			case 7 : c = Integer.class; break;
    			case 8 : c = Integer.class; break;
    			case 9 : c = String.class; break;
    			case 10: c = Boolean.class; break;
    			case 11: c = String.class; break;
    			case 12: c = String.class; break;
    		}
    		return c;
    	}
     
    	public Joueur getJoueurAtLine (int i)
    	{
    		return vectJoueur.elementAt(i);
    	}
    }




    PS : indiceClubChoisi étant obtenu par une JComboBox
    PS 1 : A chaque table SQL correspond un objet, d'où le Joueur joueur et c'est pareil pour le club


    si vous avez des questions sur le code, n'hesitez pas car je tourne en rond à tenter de trouver le moyen tout en suivant la logique que j'ai respecté


    et déjà merci pour les conseils et/ou réponses

  2. #2
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut Je ne comprends pas votre problème
    Vous donnez vous-même la réponse.
    Il n'y a rien à changer dans votre méthode de création du JTable.
    Il suffit de remplacer votre requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM Joueurs ORDER BY NumeroAffiliation
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT Joueurs.Nom, Joueurs.Prenom, Clubs.Libele FROM Joueurs, Libele WHERE Joueurs.Club=Clubs.Indices ORDER BY Joueurs.NumeroAffiliation
    Et si vous voulez tous les champs de Joueurs ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT Joueurs.*, Clubs.Libele FROM Joueurs, Libele WHERE Joueurs.Club=Clubs.Indices ORDER BY Joueurs.NumeroAffiliation
    ???

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 48
    Points : 37
    Points
    37
    Par défaut
    ce n'est pas au niveau de la requete que le bas blesse mais dans le reste

    1er problème) vu que Joueur et Club sont deux objets, je ne peux pas faire comme je le faisais pour Joueur
    while(donnees.next())
    {
    joueur = new Joueur(donnees.getInt(1),donnees.getString(2),donnees.getString(3), new GregorianCalendar(), donnees.getString(5), donnees.getString(6), donnees.getString(7), donnees.getInt(8), donnees.getInt(9),donnees.getString(10), donnees.getBoolean(11), donnees.getString(12), donnees.getString(13));

    joueur.getDateNaiss().setTime(donnees.getDate(4));
    allJoueurs.add(joueur);
    }

    donc que dois-je mettre dans le while(donnees.next()) en utilisant deux objets?? j'ai pensé à y mettre un vecteur mais je ne dois pas m'y prendre correctement car rien ne fonctionne


    2ème problème selon moi) se trouve dans ce que je dois mettre dans le getValueAt(int row, int col) vu que j'ai une nouvelle fois deux objets


    c'est surement une bêtise mais je n'arrête pas de tourner à rond et tout ce à quoi je pense ne fonctionne pas

  4. #4
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut J'ai du mal à comprendre
    Vos objets Joueur et Club, ce sont des classes à vous, des JTable ?
    Quels rapport entre vos objets Joueurs et Club et un JTable.
    Je ne vous demande pas de me fournir tout votre code bien sur, j'essai simplement de comprendre.
    Jusque là, je croyais que vous cherchiez simplement à créer un JTable à partir du résultat d'une requete, tout simplement....

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 48
    Points : 37
    Points
    37
    Par défaut
    j'ai créé moi-même les classes Joueur et Club où on y retrouve constructeurs, les méthodes get() pour chaque attribut, toString()

    et je cherche effectivement à créer la JTable de la requete, et c'est là mon problème

    bon je fais essayer de mettre toutes les étapes que je fais, vous me direz si vous auriez fait la même chose :

    1)
    contrairement à ce que je fais pour la méthode
    public vector<Joueur> getAllJoueurs() ... {

    je devrais faire :
    public vector<Object> getInfos() ... {

    2)
    Je crée un vecteur d'object
    => Vector<Object> vect = new Vector<Object>();

    3) je fais le try/catch

    4) j'y insère la requête, le PreparedStatement et le ResultSet

    5) ensuite
    while(donnees.next())
    {
    // Souci que dois-je mettre avant de spécifier le type des données??
    ?? = new ??? (donnees.getString(1), ...);
    vect.add(??);
    }

    6) je termine par mon catch



    ensuite dans l'autre classe


    ..

    public TableModel(Vector<Object> vect)
    {
    // je donne un nom aux différentes colonnes de la JTable


    les méthodes
    - getColumnCount()
    - getRowCount()
    - getColumnName(int col)

    ne doivent pas varier

    par contre la méthode getValueAt(int row, int col) j'essaie différents truc, je ne vois pas comment je dois faire

    getColumnClass(int col), je spécifie le type des données que contiendra les colonnes, y'a pas de souci


    voilà j'espere avoir été clair, maintenant si vous avez une résolution, je veux bien évidemment la tester

  6. #6
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut D'accord, continuons
    Ok, je n'ai malheureusement pas le temps de décortiquer les précisions que vous donnez.
    En attendant, voilà comment je ferai pour créer un JTable à partir des informations que vous donnez :

    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
     
    JTable tableResultats = null;
    Vector<String> nomsColonnes = new Vector<String>();
    Vector<Vector> lignes = new Vector<Vector>();
    Vector<String> ligne = new Vector<String>();
    nomsColonnes.add("Nom");
    nomsColonnes.add("Joueur");
    nomsColonnes.add("Club");
    nomsColonnes.add("Libelle");
    nomsColonnes.trimToSize();
    try {
       String instructionSQL = "SELECT Joueur.Nom, Joueur.Prenom, Joueur.Club, Club.Libelle FROM JOueur, Club WHERE Joueur.Club=Club.Indice AND Joueur.Club=\"valeurTest\" ORDER BY Joueur.Nom, Joueur.Prenom";
       java.sql.PreparedStatement prepStat = connexion.prepareStatement(instructionSQL);
       ResultSet donnees = prepStat.executeQuery();
       while(donnees.next()) {
          for (int i = 1 ; i < 5 ; i++) ligne.add(donnees.getObject(i).toString());
          ligne.trimToSize();
          lignes.add((Vector)ligne.clone());
          ligne.clear();
          }
       lignes.trimToSize();
       }
    catch (Exception e) {
       e.printStackTrace();
       }
    tableResultats = new JTable(lignes, nomsColonnes);
    Je l'ai testé avec une connexion MySQL, j'obtiens bien un JTable qui contient le résultat de ma requete SQL...

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 48
    Points : 37
    Points
    37
    Par défaut
    on peut clore la discussion

    merci à toi, j'ai utilisé autre chose

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/12/2014, 18h21
  2. [Swing] Afficher une JTable speciale en java
    Par benssj5 dans le forum Composants
    Réponses: 6
    Dernier message: 12/03/2013, 20h21
  3. [MySQL] Afficher les données de plusieurs tables par date en une seule liste.
    Par Romanodi13 dans le forum PHP & Base de données
    Réponses: 22
    Dernier message: 08/09/2011, 21h45
  4. [SQL] Une requête dans plusieurs tables
    Par Anduriel dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/12/2005, 16h23
  5. Comment rechercher une chaine dans plusieurs tables ?
    Par tsing dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/11/2005, 18h04

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