L'application est fonctionnelle (même si ca craint à deux trois endroits...)
En plus de la connexion avec MySQL, on a vu ensemble comment faire des requêtes préparées en JAVA.
Je vais continuer à améliorer le code...
Je ne suis pas très doué pour les discours mais en tout cas, un grand merci pour votre aide et tout particulièrement Népomucène
Je reviens vers vous d'ici 5 min avec plein d'autre problème lol... non je plaisante mais je vais passé à la partie mise à jour automatique du soft donc..
Me revoilà niak niak niak
J'aurais besoin d'un petit "tips". Voici le code :
Ici, pas moyen de faire une requête préparée. Pourtant j'aurais besoin de faire fonctionner ceci sachant que nonSociete est ici equivalent à "L'église".
Code : Sélectionner tout - Visualiser dans une fenêtre à part Utilitaire.remplirTextField(jTextFieldActiviteST, "SELECT ActiviteSociete FROM Societe WHERE NomSociete ='"+nomSociete+"';");
Oui L'église... j'aime bien ce mot pour mes testes
Comment pourrais-je faire fonctionner ceci ? sachant que j'ai déjà essayé cela:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 String req = "SELECT ActiviteSociete FROM Societe WHERE NomSociete ='"+societeP.getNom()+"' order by NomSociete;"; Utilitaire.remplirTextField(jTextFieldActivite, req);
Ce qu'il y a à faire est clair : modifier remplirTextField
Au lieu de lui passer le texte d'une requête, il faut lui passer un Resultset déjà rempli par l’exécution d'un PreparedStatement
Tu peux poster la méthode remplirTextField ?
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
Oui bien sûr :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public static void remplirTextField(JTextField tf, String query) { try { Connexion connexion = new Connexion(); ResultSet resultats = connexion.getResultSet(query); while (resultats.next()) { tf.setText(resultats.getString(1)); } } catch (Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog(null,e.getMessage()); } }
C'est une blague ?
On appelle cela une machine de Goldberg
C'est un machin compliqué qui va parcourir tous les enregistrements d'une requête ... qui ne compte probablement qu'un seul enregistrement !
après il écrit dans le JTextField le contenu de la 1ère colonne !!!
Tu vas me faire le plaisir de simplifier cela d'urgence !
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
Aie aie aie... ok, j'attaque ca de suite !
Je ne suis pas trop sûr de moi mais ceci est correct ?
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 static void remplirTextField(JTextField tf, String query) { try { Connexion connexion = new Connexion(); ResultSet resultats = connexion.getResultSet(query); resultats.next(); tf.setText(resultats.getString(1)); //while (resultats.next()) //{ // tf.setText(resultats.getString(1)); //} } catch (Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog(null,e.getMessage()); } }
C'est déjà mieux mais est-ce que chaque JTextField va être rempli un par un avec remplirTextField ?
Parce que si on a 15 JTextField à remplir alors on aura 15 requêtes !!!!!
En principe on fait une seule requête dans laquelle on récupère toutes les informations qui serviront à renseigner les champs en une passe.
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
Ouais j'imagine mais bon, restons concentré sur notre cap. Ce qui était restera tant que c'est fonctionnel... (même si c'est catastrophique j'entends bien..)
En revanche, ce qui me bloque ici c'est pas que ca fasse 15 requêtes mais bien cette histoire de requête non préparées.
Dans cette situation, comment puis-je rusé pour tout de même faire une prépared ?
Créer une méthode dans Utilitaire qui me prépare une requête ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 private void jComboBoxSocieteRecupererActiviteSociete(java.awt.event.FocusEvent evt) { Societe societeP = new Societe(); societeP.setNom((String) jComboBoxSociete.getSelectedItem()); String req = "SELECT ActiviteSociete FROM Societe WHERE NomSociete ='"+societeP.getNom()+"' order by NomSociete;"; Utilitaire.remplirTextField(jTextFieldActivite, req); }
A la louche :
Il faut préparer le Resultset avant et le donner à la méthode
Mais du coup, on ne gagne pas grand chose à utiliser cette méthode !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public static void remplirTextField(JTextField tf, Resultset resultats) { resultats.next(); tf.setText(resultats.getString(1)); } catch (Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog(null,e.getMessage()); } }
Est-elle très utilisée ???
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
Elle n'est utilisée que 3 fois dans le projet apparemment...
Je l'ai transformé ainsi, que'est ce que tu en dis ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 private void jComboBoxSocieteRecupererActiviteSociete(java.awt.event.FocusEvent evt) { Societe societeP = new Societe(); societeP.setNom((String) jComboBoxSociete.getSelectedItem()); Connexion connexion = new Connexion(); PreparedStatement ps = connexion.getConnexion().prepareStatement("" + "SELECT ActiviteSociete " + "FROM Societe " + "WHERE NomSociete = ? order by NomSociete;"); ps.setString(1, societeP.getNom()); ResultSet resultats = ps.executeQuery(); resultats.next(); jTextFieldActivite.setText(resultats.getString(1)); //Utilitaire.remplirTextField(jTextFieldActivite, req); }
Oui c'est bon. Il faudra penser à fermer la connexion.
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
Bonjour !
Cette semaine, on passe à la phase de test !
Mais avant, j'ai un petite erreur (je sais vraiment pas comment ca fonctionnait avant ...) :
Je comprend que la variable est vide, c'est pourquoi j'ai rajouter un test != null :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 java.sql.SQLException: Illegal operation on empty result set. at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860) at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:790) at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5228) at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5151) at coactivite4.Fenetre.jComboBoxCCFocusGained(Fenetre.java:7499)
Mais bien sûr, ca ne fonctionne pas... Mais bon, cette erreur est nouvelle et ne correspond pas au NullPointException que j'aurais pu traiter ainsi...
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 private void jComboBoxCCFocusGained(java.awt.event.FocusEvent evt) { String NomSociete = (String)jComboBoxSociete.getSelectedItem(); try{ Connexion connexion = new Connexion(); PreparedStatement ps = connexion.getConnexion().prepareStatement("" + "SELECT NomCC, PrenomCC " + "FROM ChefChantier " + "WHERE ChefChantier.IdSociete IN (" + "SELECT IdSociete " + "FROM Societe " + "WHERE NomSociete = ?);"); ps.setString(1, NomSociete); ResultSet resultats = ps.executeQuery(); resultats.next(); if (resultats.getString(1) != null ) { Utilitaire.remplirComboBoxCC(jComboBoxCC, resultats.getString(1)); } jTextFieldTelCC.setText(ChefChantier.recupererTelCC(jComboBoxCC)); } catch (Exception e) { e.printStackTrace(); } }
Une idée ?
Regarde bien le message d'erreur : operation on empty result set.
Ce qui veut dire qu'il n'y a rien dans ton resultset -> le résultat de la requête est vide (pas d'enregistrement)
Comment on vérifie ? resultats.getString(1) != null ne marche pas avec resultats vide
C'est avec le resultats.next(); situé juste avant que l'on sait si on peut utiliser le Resultset.
next() renvoie : vrai s'il y a des données, faux sinon.
tu dois donc le faire comme cela :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 boolean resultatOk = resultats.next(); if (resultatOk ) { Utilitaire.remplirComboBoxCC(jComboBoxCC, resultats.getString(1)); }
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
Pourquoi ne pas faire un simple jointure pour la requête:
A+.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 "SELECT c.NomCC, c.PrenomCC " + "FROM ChefChantier c join Societe s on c.IdSociete=s.IdSociete " + "WHERE NomSociete = ? ");
Merci pour vos réponses.
J'ai un autres soucis compliqué à expliquer...
Je un textFiled qui ne réagit pas comme un autre, (normal me direz vous) mais j'aimerais justement qu'il réagisse de la même manière :
A l'ajout d'un nouveau sous traitant, mon champ activité ne se met pas à jour tandis que celui derrière oui...
nom des champs :
En front : jTextFieldActiviteST
en back : jTextFieldActivite
J'ai déjà essayé de renommer jTextFieldActiviteST en jTextFieldActivite mais il n'aime pas trop.
Comment pourrais faire pour qu'il réagisse de la même manière ?
Si je comprends bien, dans l'écran principal, l'activité s'affiche dès qu'on a choisi une société (un sous-traitant en fait) avec une activité déjà enregistrée.
Par contre, dans la boîte de dialogue "Ajout de sous-traitant", l'activité n'est pas encore là puisque justement on doit l'indiquer ... non ?
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
C'est presque ca ! Mais d'après ce que je comprend, il faudra valider pour que ce soit bien pris en compte...
Mais :
1) je créer une société (jusqu'ici tout va bien, c'est une troisieme fenetre)
2) je sélectionne ma societé (dans la front de l'image précedente)
3) je clique dans la jTextFieldActiviteST pour que l'activité s'affiche (je sais je sais... c'est pas moi qui ai codé ca...)
==> mais à ce moment, la jTextFieldActivite (du back) se met à jour mais pas la jTextFieldActiviteST (du front)...
C'est pour cette raison que je voulais marier les deux.
ps : j'ai un autre petit soucis, le menu déroulant des chef de chantiers ne load pas... (j'ai un peu de mal a naviger dans le graphique...)
soit la requête est foireuse mais pas d'erreur catch
soit c'est complètement pété !
est-ce que l'activité est créée dans cette boîte de dialogue "société" (que nous n'avons pas vue)1) je créer une société (jusqu'ici tout va bien, c'est une troisieme fenetre)
Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)
Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager