Problème affichage données SQL dans JTable

H4rDBuG Messages postés 47 Date d'inscription jeudi 14 janvier 2010 Statut Membre Dernière intervention 26 juillet 2011 - 4 juil. 2011 à 13:14
H4rDBuG Messages postés 47 Date d'inscription jeudi 14 janvier 2010 Statut Membre Dernière intervention 26 juillet 2011 - 5 juil. 2011 à 16:06
Bonjour a toutes et a tous,

J'ai un nouveau soucis (encore un :/) avec une JTable qui se remplit par une requete SQL, le soucis est qu'il ne prends pas toutes mes colonnes en compte (alors qu'elles sont bien séléctionnées dans la requete ...)

Voila le code :

package gestionstocks;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

/**
*
* @author ggeffray
* @version 1.0b
*
*/

//class pour afficher la liste des produits
public class tabProduit extends JFrame
{
JTable table;//instancition de JTable pour le remplissage des données a partir de la BDD
Statement statement;//creation du statement à partir de la chaine de connexion pour les requetes
ResultSet resultRequete;//conteneur du resultat de la requete excutée

public tabProduit()
{
table = remplirTable();//la table sera initialisée par la liste des produits envoyée par la fct 'remplirTable()'
table.setPreferredScrollableViewportSize(new Dimension(500,120));//prendre la dimension de la table
// Un panneau, placé dans la fenêtre
JScrollPane panneau = new JScrollPane(table);//mettre la table dans ascenceur
getContentPane().add(panneau, BorderLayout.CENTER);//centraliser le panneau dans la fenetre
this.pack();
this.setLocation(100, 100);
this.setVisible(true);
}

/** Requête et résultats dans une JTable */
JTable remplirTable()
{
Vector tabLignes=new Vector(), nomCols=new Vector();
int i;
try
{
String requeteMysql = "Select RefProduit, LibProduit, PrixHTProduit, PrixTTCProduit, PoidsProduit, NomFourn, NomCateg "
+ "From Produit, Categorie, Fournisseur "
+ "Where Produit.Nocateg = Categorie.NoCateg "
+ "And Produit.NoFourn = Fournisseur.NoFourn";//chaine contenant la requete a executée
statement = (Statement) new BDD().conn.createStatement();//creation du statement a partir de la chaine de connexion qui est placée dans la classe de connexion au MYsql
resultRequete = (ResultSet) statement.executeQuery(requeteMysql);//excuter la requete et la mettre dans une variabale ResulatSet
// Extraire noms des colonnes; les placer dans Vector nomCols
ResultSetMetaData md = resultRequete.getMetaData();
nomCols = new Vector();
for( i=1; i<=md.getColumnCount (); i++)
{
nomCols.add( md.getColumnLabel(i));
System.out.println(nomCols);
// Mémoriser le résultat dans la JTable
while( resultRequete.next())
{
//placer les valeurs dans Vector ligne
Vector ligne=new Vector();
for(i=1; i<=1; i++)
{
String ch=resultRequete.getString(i);
ligne.add(ch);
}
tabLignes.add(ligne);
}
}
}
catch(Exception e)
{
System.out.print("erreur1 "+e.getMessage());//récuperer le message d'erreur en cas d'erreur
}
return new JTable(tabLignes,nomCols);//type de retour qui initialise le JTable par la liste des vecteur envoyées remplis des tables
}
}

la classe est complète et est indépendante du reste.
Dans ma requete je souhaite afficher la refproduit, le libproduit, le prix (ht et ttc) le nofourn et le nocateg et c'est la que le problème survient, il m'affiche bien toutes les colonnes excepté la colonne du libproduit (pour une raison inconnu, aucune exception n'est levée).

Cependant quand je spécifie dans ma requete que je ne veut afficher que la colonne libproduit, il me l'affiche sans aucun soucis ...

Je suis dans une impasse je vois pas trop d'ou peut venir le problème, avez-vous des idées ?

23 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
4 juil. 2011 à 13:58
Le problème est sur cette ligne :

//Tu fais une boucle de 1 à 1 : le for est donc inutile
//Il faut aller jusqu'à colomnCount
for(i=1; i<=1; i++)
{
String ch=resultRequete.getString(i);
ligne.add(ch);
}
tabLignes.add(ligne); 
0
H4rDBuG Messages postés 47 Date d'inscription jeudi 14 janvier 2010 Statut Membre Dernière intervention 26 juillet 2011
4 juil. 2011 à 14:06
Oui je me doutais que le problème venait de la, je savais pas trop quelle valeur mettre étant donné que si je mt 2 il m'affiche 4 colonnes, si je met 6 il m'en affiche qu'une sans les données ... il part un peu dans tout les sens :/ je test et je te tiens au courant
0
H4rDBuG Messages postés 47 Date d'inscription jeudi 14 janvier 2010 Statut Membre Dernière intervention 26 juillet 2011
4 juil. 2011 à 14:46
Je viens de tester, toujours la meme erreur, il ne m'affiche que la colonne RefProduit ...
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
4 juil. 2011 à 15:02
Oui, c'est normal, tu ne créé qu'un seul Vector, tu devrais créer un tableau de String : String[][] pour afficher les résultats.

Tu es assez loin d'avoir un code correct.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
H4rDBuG Messages postés 47 Date d'inscription jeudi 14 janvier 2010 Statut Membre Dernière intervention 26 juillet 2011
4 juil. 2011 à 15:08
Pour aider dans le raisonnement, j'ai fait des tests avec différentes valeurs (a la place de 1 dans la boucle for)
jusqu'a 1 :
affiche la colonne refproduit avec toutes les ref de produits

jusqu'a 2 :
affiche refproduit avec toutes les refproduit
affiche prixttcproduit avec tout les libproduit
affiche poidsproduit vide
affiche nofourn vide
affiche nocateg vide

jusqu'a 3 :
affiche refproduit avec toutes les refproduit
affiche poidsproduit avec tout les libproduit
affiche tout les nomfourn avec les prixht
affiche nomcateg vide

jusqu'a 4 :
affiche refproduit avec toutes les refproduit
affiche nomfourn avec tout les libproduit
affiche nomcateg avec tout les prixht

jusqu'a 5 :
affiche refproduit avec toutes les refproduit
affiche nomcateg avec tout les libproduit

jusqu'a 6 et plus :
affiche refproduit avec toutes les refproduit

Voila pour le jeu de test, j'ai fait aussi un println des colonnes et voila le resultat :
[RefProduit]
[RefProduit, PoidsProduit]
[RefProduit, PoidsProduit, NomFourn]
[RefProduit, PoidsProduit, NomFourn, NomCateg]

peu importe le chiffre que je met dans le for, il me saute toujours la colonne libproduit, pourtant quand je fait un println de md.getColumnCount() il me retourne bien 6 = le nombre de colonne ... c'est a n'y rien comprendre :/
0
H4rDBuG Messages postés 47 Date d'inscription jeudi 14 janvier 2010 Statut Membre Dernière intervention 26 juillet 2011
4 juil. 2011 à 15:11
(j'avais pas vu que tu avais répondu entre temps)
j'ai bien créé plusieurs vectors :

Vector tabLignes=new Vector(), nomCols=new Vector();

nomCols = new Vector();

for( i=1; i<=md.getColumnCount (); i++)
{
.
.
.
Vector ligne=new Vector();
for(i=1; i<=1; i++)
{
.
.
.
}
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
4 juil. 2011 à 15:18
Est ce que tu peux écrire ton code entre les balises faites pour ca : troisième bouton en partant de la droite puis java
0
H4rDBuG Messages postés 47 Date d'inscription jeudi 14 janvier 2010 Statut Membre Dernière intervention 26 juillet 2011
4 juil. 2011 à 15:22
package gestionintendance;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.Vector;
 
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

/**
 *
 * @author ggeffray
 * @version 1.0b
 * 
 */
 
//class pour afficher la liste des produits
public class tabProduit extends JFrame
{
JTable table;//instancition de JTable pour le remplissage des données a partir de la BDD
Statement statement;//creation du statement à partir de la chaine de connexion pour les requetes
ResultSet resultRequete;//conteneur du resultat de la requete excutée

public tabProduit()
{
     table = remplirTable();//la table sera initialisée par la liste des produits envoyée par la fct 'remplirTable()'
     table.setPreferredScrollableViewportSize(new Dimension(500,120));//prendre la dimension de la table
     // Un panneau, placé dans la fenêtre
     JScrollPane panneau = new JScrollPane(table);//mettre la table dans ascenceur
     getContentPane().add(panneau, BorderLayout.CENTER);//centraliser le panneau dans la fenetre
     this.pack();
     this.setLocation(100, 100);
     this.setVisible(true);
}
 
/** Requête et résultats dans une JTable */
JTable remplirTable() 
        {
      Vector tabLignes=new Vector(), nomCols=new Vector();
      int i;
      try 
              {
                    String requeteMysql = "Select RefProduit, LibProduit, PrixHTProduit, PrixTTCProduit, PoidsProduit, NomFourn, NomCateg "
                                        + "From Produit, Categorie, Fournisseur "
                                        + "Where Produit.Nocateg = Categorie.NoCateg "
                                        + "And Produit.NoFourn = Fournisseur.NoFourn";//chaine contenant la requete a executée
                    statement = (Statement) new BDD().conn.createStatement();//creation du statement a partir de la chaine de connexion qui est placée dans la classe de connexion au MYsql
                    resultRequete = (ResultSet) statement.executeQuery(requeteMysql);//excuter la requete et la mettre dans une variabale ResulatSet 
                    // Extraire noms des colonnes; les placer dans Vector nomCols
                    ResultSetMetaData md = resultRequete.getMetaData();
                    nomCols = new Vector();
                    for( i=1; i<=md.getColumnCount (); i++)
                    {
                        nomCols.add( md.getColumnLabel(i));
                        System.out.println(nomCols);
                        // Mémoriser le résultat dans la JTable
                        while( resultRequete.next()) 
                        {
                            //placer les valeurs dans Vector ligne
                            Vector ligne=new Vector();
                            for(i=1; i<=3; i++) 
                            {
                                String ch=resultRequete.getString(i);
                                ligne.add(ch);
                            }
                            tabLignes.add(ligne);
                        }
                    }
              }
     catch(Exception e) 
             { 
         System.out.print("erreur1 "+e.getMessage());//récuperer le message d'erreur en cas d'erreur
     }
     return new JTable(tabLignes,nomCols);//type de retour qui initialise le JTable par la liste des vecteur envoyées remplis des tables
}
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
4 juil. 2011 à 15:33
Voilà qui est mieux présenté, je regarde ca.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
4 juil. 2011 à 15:37
Ok, le problème est simple à résoudre (très simple) il suffit que tu commences ton for à 0.
0
H4rDBuG Messages postés 47 Date d'inscription jeudi 14 janvier 2010 Statut Membre Dernière intervention 26 juillet 2011
4 juil. 2011 à 15:58
Le premier ou deuxieme for ?
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
4 juil. 2011 à 16:01
Les deux je dirais
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
4 juil. 2011 à 16:01
Oui, les deux (je pense)
0
H4rDBuG Messages postés 47 Date d'inscription jeudi 14 janvier 2010 Statut Membre Dernière intervention 26 juillet 2011
4 juil. 2011 à 16:04
je viens de tester et il me retourne :

erreur1 Column index out of range.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
4 juil. 2011 à 16:34
et il te donne quoi comme index associé à outOfRange.

Essaye de le mettre uniquement sur un des deux for pour voir.
0
H4rDBuG Messages postés 47 Date d'inscription jeudi 14 janvier 2010 Statut Membre Dernière intervention 26 juillet 2011
5 juil. 2011 à 09:06
avec le premier for a 1 et le deuxieme a 0 :

erreur1 Column Index out of range, 0 > 7

avec le premier for a 0 et le deuxieme a 1 :

erreur1 Column index out of range.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
5 juil. 2011 à 09:41
La borne sup doit être au maximum 6

for(int i=0; i<7; i++)
0
H4rDBuG Messages postés 47 Date d'inscription jeudi 14 janvier 2010 Statut Membre Dernière intervention 26 juillet 2011
5 juil. 2011 à 09:49
pour le premier ou deuxieme ou les 2 for qui commence a 0 :

erreur1 Column index out of range

:/
0
H4rDBuG Messages postés 47 Date d'inscription jeudi 14 janvier 2010 Statut Membre Dernière intervention 26 juillet 2011
5 juil. 2011 à 12:04
Sinon plutot que de chercher la raison d'une telle erreur et de pas trouver, t'aurais pas un exemple (meme basique) de code de JTable remplit par SQL ? ca serait plus simple je pense, je peine depuis hier et il me reste ca et un dernier problème (certainement un futur post) pour en finir définitivement avec cette application...
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
5 juil. 2011 à 13:42
Je n'ai pas ca sous le coude, en général, le lien bdd-vue n'est pas direct, on passe par du code métier.

Celà dit, tu devrais trouver ca sur internet je pense
0
Rejoignez-nous