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

Interfaces Graphiques en Java Discussion :

Comment extraire la valeur de la clé primaire suivant un choix combobox


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut Comment extraire la valeur de la clé primaire suivant un choix combobox
    j'ai une table étudiant:
    id_etudiant, nom, prénom, date_nais,code_filière
    table filière:
    code_filière, libelé_filière, nbr_années

    comment insérer la clé primaire code_filiere dans la table étudiant suivant le choix de la filière dans un combobox?

    j'ai essayé ça mais ça n'a rien donné:
    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
     
    public String getFiliere() throws Exception{
    		try{
    			String query = "SELECT code_filiere FROM filiere WHERE libele_filiere=?";
    			stat = cnx.prepareStatement(query);
    			stat.setString(1, (String) cmbFil.getSelectedItem());
    			rslt = stat.executeQuery();
     
    			stat.close();
     
    		}catch(Exception ex){
    			ex.printStackTrace();
    		}
    		return rslt.getString(1);
    	}
    merci

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Il faut récupérer le résultat avant de fermer le statement. Tu peux utiliser une structure try-with-resource pour te faciliter l'écriture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public String getFiliere() throws Exception{
       String query = "SELECT code_filiere FROM filiere WHERE libele_filiere=?";
       try ( PreparedStatement stat = cnx.prepareStatement(query) ) {
     
          stat.setString(1, (String) cmbFil.getSelectedItem()); // au lieu d'aller directement chercher la sélection, tu devrais plutôt avoir un paramètre à ta méthode
          rslt = stat.executeQuery();
          return rslt.getString(1);
     
       }catch(SQLException ex){
              ex.printStackTrace();
              return null; // retourne null en cas d'erreur
       }
    }
    Sinon tu peux aussi directement faire une requête qui récupère code et libellé pour construire la combo, utiliser une classe Filiere pour représenter les filières, par exemple :

    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
    public class Filiere {
       private final String code;
       private final String label;
       public Filiere(String code, String label) {
          this.code=code;
          this.label=label;
       }
     
       public String getCode() {
          return code;
       }
     
       public String getLabel() {
          return label;
       }
     
       @Override
       public String toString() {
          return label;
       }
     
    }
    Et faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((Filiere)combo.getSelectedItem()).getCode())  );
    Pour récupérer le code (sans avoir à faire une requête);

  3. #3
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    merci Joel mais est ce que je pourrai afficher les Items dans le combobox car j'ai cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public void fillComboFil(){
    		try{
    			String sql = "SELECT * FROM filiere";
    			stat = cnx.prepareStatement(sql);
    			rslt = stat.executeQuery();
     
    			while(rslt.next()){
    				cmbFil.addItem(rslt.getString("libele_f"));
    			}
    		}catch(Exception e){
    			JOptionPane.showMessageDialog(null, e);
    		}
    	}
    Comment faire pour que tout les libelés soient visibles de la base de données vers le combo?

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Comment faire pour que tout les libelés soient visibles de la base de données vers le combo?
    C'est pour ça que j'ai redéfini toString() dans Filiere : par défaut, la combo affichera la conversion des items par la méthode String.valueOf() qui appelle toString(). On peut aussi faire le rendu avec un ListCellRenderer,si on veut aller plus loin dans la façon d'afficher les items.

    Bien sûr, il faut remplir la combo avec des instances de Filiere et non plus de String.

    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
     
    public void fillComboFil(){
                    cmbFil.removeAllItems(); // supprime les items précédemment chargés
    		String sql = "SELECT * FROM filiere";
    		try (PreparedStatement stat = cnx.prepareStatement(sql) ) { // fait comme ça, pour ne pas avoir à fermer ni statement/ni resultset (sinon il le faut)
     
                            ResultSet rslt = stat.executeQuery(); // déclare tes variables le plus localement possible (avec le moins de portée possible, celle qui est nécessaire et suffisante)
     
    			while(rslt.next()){
    				cmbFil.addItem(new Filiere(rslt.getString("code_filiere"), rslt.getString("libele_f"))); // dans ton dernier code, c'est "libele_f", dans le premier c'est "libele_filiere" : tu mettras la bonne valeur... (NB accessoirement libellé s'écrit avec 2 l)
    			}
    		}catch(Exception e){
    			JOptionPane.showMessageDialog(null, e);
    		}
    	}

  5. #5
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    Merci beaucoup j'ai appris des choses de ce petit code , mais j'ai eu ce message:
    Nom : 2015-06-22_16-24-43.jpg
Affichages : 377
Taille : 64,7 Ko

    le problème est dans le code:
    cmbFil.addItem(new Filiere(rslt.getString("code_f"), rslt.getString("libele_f"))); //une ligne rouge sous "addItem"

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Il faut que tu créés la JComboBox de cette manière : new JComboBox<Filiere>(). Ce qu'il y a entre le < et > est les type des données qu'on y affiche : ce ne sont plus des String, mais des Filiere.

  7. #7
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    mais il manque quelque chose très important! où est le code qui envoi les valeurs de la base vers la classe Filiere sinon le get ne servira à rien puisqu'il trouve rien je ne comprends pas

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Hind4Dev Voir le message
    mais il manque quelque chose très important! où est le code qui envoi les valeurs de la base vers la classe Filiere sinon le get ne servira à rien puisqu'il trouve rien je ne comprends pas
    C'est le code que je t'ai mis dans le message http://www.developpez.net/forums/d15...x/#post8295039

  9. #9
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    Alors Mr Joel, j'ai appliqué la même chose sur plusieurs tables que j'ai pour pouvoir exécuter mon formulaire , j'ai eu une bonne dizaine d'erreurs

  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Ni le code, ni les messages d'erreur ! Qu'est-ce que tu veux que je te dise ?

  11. #11
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    alors j'ai créé cette classe:
    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
     
    public class Filiere {
     
     
        private final String code;
           private final String fil;
           public Filiere(String code, String fil) {
              this.code=code;
              this.fil=fil;
           }
     
           public String getCode() {
              return code;
           }
     
           public String getfil() {
              return fil;
           }
     
           @Override
           public String toString() {
              return fil;
           }
     
    }
    et ces deux méthodes dans la classe du formulaire:
    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
     
    public void fillComboFil(){
            cmbFil.removeAllItems(); 
            String sql = "SELECT * FROM filiere";
            try (PreparedStatement stat = cnx.prepareStatement(sql) ) { 
     
                            rslt = stat.executeQuery(); 
     
                while(rslt.next()){
                    cmbFil.addItem(new Filiere(rslt.getString("code_f"), rslt.getString("libele_f"))); 
                }
            }catch(Exception e){
                JOptionPane.showMessageDialog(null, e);
            }
        }
     
    public String getFiliere() throws Exception{
            String query = "SELECT code_f FROM filiere WHERE libele_f=?";
               try ( PreparedStatement stat = cnx.prepareStatement(query) ) {
     
                  stat.setString(1, (String) cmbFil.getSelectedItem());
                  rslt = stat.executeQuery();
                  return rslt.getString(1);
     
               }catch(SQLException ex){
                      ex.printStackTrace();
                      return null; 
               }
        }
    j'ai eu l'erreur disant que le cast to String n'est pas permis pour le combobox

  12. #12
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Bah, oui ! Je t'ai dit que ta méthode getFiliere() avec requête pouvait être remplacée par la méthode avec la classe Filiere pour éviter de faire la requête.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public Filiere getFiliere() { // devrait plutôt s’appeler getSelectedFiliere()
        return (Filiere) cmbFil.getSelectedItem());
    }
    Ce code suffit maintenant à récupérer la filière sélectionnée (plus besoin de requête). Si tu as besoin du libellé, tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // ...
    Filiere selectedFiliere = getFiliere();
    if ( selectedFiliere!=null ) {
        System.out.println("Filière sélectionnée : " + selectedFiliere.getFil()); // à quoi sert cette économie de caractères ? getFiliere() pour le nom de la méthode ça ne mange pas de pain, et c'est plus clair !
    }
    else {
        System.out.println("Aucun filière sélectionnée");
    }
    // ...

  13. #13
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    merci, désolée mais je sens que j'ai rien compris
    cette méthode me retourne la clé primaire dont j'ai besoin

  14. #14
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    La méthode getFiliere() retourne un objet qui représente une filière, et qui a toutes les propriétés dont tu as besoin à priori : code et libelle.
    Pour avoir le code (si c'est bien le code la clef primaire), il suffit de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Filiere selectedFiliere = getFiliere();
    if ( selectedFiliere!=null ) {
        System.out.println("Code de la filière sélectionnée : " + selectedFiliere.getCode()); 
    }
    else {
        System.out.println("Aucun filière sélectionnée");
    }
    Accessoirement, s'il te faut un autre champ de la table filiere, il suffit de modifier la classe Filiere et la méthode fillComboFil : tu as un exemple pour 2 propriétés (code_f, et libele_f), pour les autres c'est exactement pareil.

  15. #15
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    mais comment j'appel une fonction dans elle même ça n'a aucun sens je suis dans getFiliere et vous voulez que je fasse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Filiere selectedFiliere = getFiliere();

  16. #16
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Bah tu l'appelles là où tu as besoin (là où tu déjà appelais l'autre que tu avais écrite)

Discussions similaires

  1. Réponses: 9
    Dernier message: 09/07/2014, 19h33
  2. Réponses: 4
    Dernier message: 28/01/2011, 17h03
  3. Réponses: 3
    Dernier message: 19/04/2010, 16h18
  4. Réponses: 4
    Dernier message: 02/04/2008, 14h27

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