Listes doublement chainees

Résolu
jeeb2009 Messages postés 75 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 31 mars 2009 - 19 févr. 2009 à 09:50
jeeb2009 Messages postés 75 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 31 mars 2009 - 23 févr. 2009 à 10:34
bonjour a tous,

je souhaite inserrer les resultats de ma requete dans une liste doublement chainees alors je ne sais comment m y prendre....
a l aide je vous en prie...

24 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
19 févr. 2009 à 13:26
Salut,

m_oButtonBeforeClick est tout simplement un Listener que je déclenche avant de naviguer dans la base de données afin de permettre d'annuler l'action (d'où le getCancel).

Donc en gros :
if (m_oButtonsBeforeClick != null) {

m_oButtonsBeforeClick.actionPerformed(EVENT_NEXT);

if (m_oButtonsBeforeClick.getCancel()) {

return;

}

Ce bout de code permet de déclencher l'événément EVENT_NEXT si toutefois un listener a été enregistré, et au retour de l'événement, je teste si le cancel vaut true.

try {

m_oResultSet.next();

refresh();

}

catch (SQLException e) {

System.out.println("CConnectBar.m_btnNext_Click : Erreur lors du déplacement.");

}

Ca c'est le bout de code qui t'intéresse : je fais un next sur mon resultset global, puis je raffraîchit les contrôles liés à mon CConnectBar (par ma méthode refresh).

if (m_oButtonsClick != null) {

m_oButtonsClick.actionPerformed(EVENT_NEXT);

}

}
Ce bout de code permet de déclencher l'événement EVENT_NEXT après le click afin de notifier ce qui le veulent du clic sur le bouton.

Je vois pas trop ce que tu n'as pas pu comprendre dans le bout de code que je t'avais donné : je reprenais juste ton code et je le corrigeais pour que ca marche...

______________________________________
DarK Sidious
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
20 févr. 2009 à 17:25
Salut,

Et voilà le gros inconvénient de travailler avec un outil graphique pour faire ses interfaces : on ne sait pas comment cà marche et on perd un temps fou avec des choses pourtant si simple ! Encore un bon exemple de perte de temps incroyable à cause de l'utilisation d'un outil de conception d'interface graphique... Je déconseille très fortement l'utilisation de ce genre d'outils qui produisent un code tellement immaintenable qu'il est impossible de s'y retrouver quelques mois après avoir développé le projet... Bref, j'espère que ca te servira de leçon...

Il faut soit que ta classe possèdant le resultSet implémente le ActionListener (ca ne fais que 2 jours que je te dis de faire comme cà...), soit tu fais un getter de ton resultset dans ta classe principale, et tu en récupère l'instance dans la classe qui fait le actionPerformed (cf l'exemple de code que je t'ai passé ce matin...).
______________________________________
DarK Sidious
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
19 févr. 2009 à 10:52
Salut,

Comment veux-tu qu'on t'aide avec si peu de détails ???

Quelle requête ? Quel type de données ? Qu'est-ce que tu n'arrive pas à faire ?
______________________________________
DarK Sidious
0
jeeb2009 Messages postés 75 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 31 mars 2009
19 févr. 2009 à 11:21
voici le script de ma table pour les differentes donnees manipuler

CREATE TABLE `contac` (
`Nom` varchar(30) NOT NULL,

`Prenom` varchar(30) NOT NULL,

`Email` varchar(40) NOT NULL,

`Pays` tinytext NOT NULL,

`CNI` bigint(15) NOT NULL,

`Telephone1` tinytext NOT NULL,

`Telephone2` tinytext,

`Telephone3` tinytext,

`Titre` tinytext,

`Entreprise_Employee` text,

`commentaire_add` text,

`date_crea` varchar(20) NOT NULL,

`date_modif` varchar(20) NOT NULL,

`Groupe` varchar(20) NOT NULL,

PRIMARY KEY (`CNI`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

//voici ma connexion te

try {Class.forName("com.mysql.jdbc.Driver");
url="jdbc:mysql://localhost/mabase";
con = DriverManager.getConnection(url, user, pass);
statmnt = con.createStatement();
results = statmnt .executeQuery("SELECT * FROM mabase")}
catch(SQLException ex){System.out.println("SQL Error:" + ex.getMessage());}
catch(Exception e) {
System.out.print("erreur1 "+e.getMessage());//récuperer le message d'erreur en cas d'erreur
}

Merci Darksidious!!
0

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

Posez votre question
jeeb2009 Messages postés 75 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 31 mars 2009
19 févr. 2009 à 11:31
voici le script de ma table pour les differentes donnees manipuler

CREATE TABLE `contac` (
`Nom` varchar(30) NOT NULL,

`Prenom` varchar(30) NOT NULL,

`Email` varchar(40) NOT NULL,

`Pays` tinytext NOT NULL,

`CNI` bigint(15) NOT NULL,

`Telephone1` tinytext NOT NULL,

`Telephone2` tinytext,

`Telephone3` tinytext,

`Titre` tinytext,

`Entreprise_Employee` text,

`commentaire_add` text,

`date_crea` varchar(20) NOT NULL,

`date_modif` varchar(20) NOT NULL,

`Groupe` varchar(20) NOT NULL,

PRIMARY KEY (`CNI`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

//voici ma connexion te

try {Class.forName("com.mysql.jdbc.Driver");
url="jdbc:mysql://localhost/mabase";
con = DriverManager.getConnection(url, user, pass);
statmnt = con.createStatement();
results = statmnt .executeQuery("SELECT * FROM contac")}
catch(SQLException ex){System.out.println("SQL Error:" + ex.getMessage());}
catch(Exception e) {
System.out.print("erreur1 "+e.getMessage());//récuperer le message d'erreur en cas d'erreur
}

Merci Darksidious!!
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
19 févr. 2009 à 11:40
Salut,

Ok, t'as répondu à ma première question, mais les deux autres restent d'actualité :
Quel type de données ? Qu'est-ce que tu n'arrive pas à faire ?

Quand tu poses une question sur un forum d'entraide comme ici, c'est à toi d'être le plus explicite possible, et non à nous de te poser des questions pour réussir à t'aider...
______________________________________
DarK Sidious
0
jeeb2009 Messages postés 75 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 31 mars 2009
19 févr. 2009 à 11:50
desole Darksidious je souhaite passer d unenregistrement a l autre sans gene...
afin de resoudre le probleme de precedent/suivant car j ai pas pu adapter ton code
"CConnectorBar"...

pour les types de donnees le script de la bd ne suffit pas??
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
19 févr. 2009 à 12:17
Salut,

Tu galère encore avec ton previous et next ?

Il sera bien plus efficace d'utiliser un resultSet plutôt que de lire toutes tes données pour les stocker dans une liste !!! Crois moi ! Il suffit que tu ai un millier d'enregistrements et déjà tu fera écrouler les performances, alors je te raconte pas pour un dixième de millier ou plus...

Tu avais essayé le bout de code que je t'avais donné ?
______________________________________
DarK Sidious
0
jeeb2009 Messages postés 75 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 31 mars 2009
19 févr. 2009 à 12:41
je ne l ai pas deja compris stp jette un coup d oeil dessus....

dans ta classe CConnectorBar, voici le code du bouton previous peus tu me le commenter??/ ke represente m_oButtonsBeforeClick??
et pour moi ki utilise nebeans 6.5 est ce je dois implementer de la mm facon??

private void m_btnPrevious_Click(){
m_btnNext_Click() {
if (m_oButtonsBeforeClick != null) {
m_oButtonsBeforeClick.actionPerformed(EVENT_NEXT);
if (m_oButtonsBeforeClick.getCancel()) {
return;
}
}
try {
m_oResultSet.next();
refresh();
}
catch (SQLException e) {
System.out.println("CConnectBar.m_btnNext_Click : Erreur lors du déplacement.");
}
if (m_oButtonsClick != null) {
m_oButtonsClick.actionPerformed(EVENT_NEXT);
}
}
0
jeeb2009 Messages postés 75 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 31 mars 2009
19 févr. 2009 à 12:53
desole c est plutot comme ceci kelle est ta methode...

private void m_btnNext_Click() {
if (m_oButtonsBeforeClick != null) {
m_oButtonsBeforeClick.actionPerformed(EVENT_NEXT);
if (m_oButtonsBeforeClick.getCancel()) {
return;
}
}
try {
m_oResultSet.next();
refresh();
}
catch (SQLException e) {
System.out.println("CConnectBar.m_btnNext_Click : Erreur lors du déplacement.");
}
if (m_oButtonsClick != null) {
m_oButtonsClick.actionPerformed(EVENT_NEXT);
}
}
0
jeeb2009 Messages postés 75 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 31 mars 2009
19 févr. 2009 à 13:59
en fait je t explique bien le truc.
je recherche des contacts dans ma bd par Nom,prenom, email.. lorsque le contact set present, les differents identifiants s affichent dans les jtextfield de mon interface.....
voici de nouveau ce que je fais pour le boouton precedent a partir de ton code
ERROR:SQL Error:Before start of result set

le code:

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {

try{Class.forName("com.mysql.jdbc.Driver");
url = "jdbc:mysql://localhost/contactmanager";
con = DriverManager.getConnection(url,"root","stockaj");
st = con.createStatement();
if(jComboBox1.getSelectedItem()=="Nom"){
rs = st.executeQuery("SELECT * FROM contac_man WHERE (Nom LIKE '"+jTextField1.getText()+'%'+"')");
rs.previous();
jTextField3.setText(rs.getString(1));
jTextField4.setText(rs.getString(2));
jTextField5.setText(rs.getString(3));
jComboBox2.setSelectedItem(rs.getString(4));
jTextField2.setText(rs.getString(5));
jTextField6.setText(rs.getString(6));
jTextField7.setText(rs.getString(7));
jTextField8.setText(rs.getString(8));
jTextField9.setText(rs.getString(9));
jTextField10.setText(rs.getString(10));
jTextArea1.setText(rs.getString(11));
jComboBox3.setSelectedItem(rs.getString(14));

}

}
catch(SQLException ex){System.out.println("SQL Error:" + ex.getMessage());}
catch(ClassNotFoundException cnfe){
System.out.println(cnfe.getMessage());
}}
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
19 févr. 2009 à 14:22
Salut,

Ah ben là c'est clair : il te manque le test de premier enregistrement (depuis le temps que je te le dit celui là !!!) :

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                        

       try{Class.forName("com.mysql.jdbc.Driver");

            url = "jdbc:mysql://localhost/contactmanager";

            con = DriverManager.getConnection(url,"root","stockaj");

            st = con.createStatement();

             if(jComboBox1.getSelectedItem()=="Nom"){

            rs = st.executeQuery("SELECT * FROM contac_man WHERE (Nom LIKE '"+jTextField1.getText()+'%'+"')");

            if (!res.isFirst()) {
                rs.previous();

            }
            jTextField3.setText(rs.getString(1));

            jTextField4.setText(rs.getString(2));

            jTextField5.setText(rs.getString(3));

            jComboBox2.setSelectedItem(rs.getString(4));

            jTextField2.setText(rs.getString(5));

            jTextField6.setText(rs.getString(6));

            jTextField7.setText(rs.getString(7));

            jTextField8.setText(rs.getString(8));

            jTextField9.setText(rs.getString(9));

            jTextField10.setText(rs.getString(10));

            jTextArea1.setText(rs.getString(11));

            jComboBox3.setSelectedItem(rs.getString(14));

             }

          }

        catch(SQLException ex){System.out.println("SQL Error:" + ex.getMessage());}

        catch(ClassNotFoundException cnfe){

        System.out.println(cnfe.getMessage());

        }}

rs.previous();

______________________________________
DarK Sidious
0
jeeb2009 Messages postés 75 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 31 mars 2009
19 févr. 2009 à 14:40
meme erreur generee que precedemment....

SQL ERROR: Before start of result set
0
jeeb2009 Messages postés 75 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 31 mars 2009
19 févr. 2009 à 14:49
autre chose a noter l execution pas a pas s arrete juste a la premiere ligne de l affichage... et le "rs" n a aucune valeur... faut il d abord le parcourir en suite faire rs.previous();???
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
19 févr. 2009 à 14:50
Salut,

Ben pourtant ce test permet justement d'éviter cette erreur...

essaye ceci :
try{Class.forName("com.mysql.jdbc.Driver");
            url = "jdbc:mysql://localhost/contactmanager";
            con = DriverManager.getConnection(url,"root","stockaj");
            st = con.createStatement();
             if(jComboBox1.getSelectedItem()=="Nom"){
            rs = st.executeQuery("SELECT * FROM contac_man WHERE (Nom LIKE '"+jTextField1.getText()+'%'+"')");
            rs.first();
            if (!rs.isFirst()) {
                rs.previous();
            }
            jTextField3.setText(rs.getString(1));
            jTextField4.setText(rs.getString(2));
            jTextField5.setText(rs.getString(3));
            jComboBox2.setSelectedItem(rs.getString(4));
            jTextField2.setText(rs.getString(5));
            jTextField6.setText(rs.getString(6));
            jTextField7.setText(rs.getString(7));
            jTextField8.setText(rs.getString(8));
            jTextField9.setText(rs.getString(9));
            jTextField10.setText(rs.getString(10));
            jTextArea1.setText(rs.getString(11));
            jComboBox3.setSelectedItem(rs.getString(14));

             }

          }
        catch(SQLException ex){System.out.println("SQL Error:" + ex.getMessage());}
        catch(ClassNotFoundException cnfe){
        System.out.println(cnfe.getMessage());
        }}

Sinon, est-ce que ton resultset contient bien des enregistrements ?
______________________________________
DarK Sidious
0
jeeb2009 Messages postés 75 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 31 mars 2009
19 févr. 2009 à 16:14
oui mon result set possede ses enregistrements sinon ca markerai null...
pour avoir le coeur net j ai declare j ai fais:

String s1;

s1 = rs.getString(1); la valeur de s1 correspond bel et bien a celle presente dans ma table...

la question ke j aimerai te poser est : lorske tu fais if(!rs.isFirst()) ca veut bien dire:"si ce n est pas le premier enregistrement..." n est ce pas? alors le premier enregistrement de la Table ou le premier enregistrement du resultat de la requete??

et lorsque j execute ton code aucune erreur ne se produit mais l execution pas a pas saute l instruction

rs.previous();
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
19 févr. 2009 à 17:23
Salut,

En fait la fonction isFirst va tester si le resultset est positionné sur le premier enregistrement (pas le premier enregistrement de ta table mais des enregistrements résultant de l'exécution de la requête SQL). Cela permet de savoir s'il existe des enregistrements précendents ou pas.

Du coup, si tu es sur le premier enregistrement, tu ne peux plus faire de previous (sinon, exception, comme tu as pu le voir !). C'est pour cela que j'insistais sur ce test là.

Je pense que le problème dans ton code d'origine (celui de ton topic précédent avec le nullPointer), c'est que tu essaye d'accèder au resultset "rs" dans une classe qui ne le possède pas : typiquement, dans une classe qui implémente un ActionListener si tu essaye d'accèder à la variable rs qui elle est déclarée dans la classe contenant ta JFrame...
______________________________________
DarK Sidious
0
jeeb2009 Messages postés 75 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 31 mars 2009
20 févr. 2009 à 11:10
Salut DarkSidious,

j ai toujours pas avancee avec mes boutons suivant et precedent toi tu as trouve une astuce?? ou alors si tu maitrise mieux les lites doublement chainees de grace j ai besoin de savoir comment y inserer mon resulset...et comment et afficher les donnees...

merci
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
20 févr. 2009 à 12:31
Salut,

Je te dis : laisse tomber l'idée des listes tu vas avoir de gros problème de performances !

Si j'ai trouvé une astuce ? Ben ca marche très bien chez moi les resulsets... Je n'aurais pas publié mon CConnectBar s'il ne marchait pas. Il faut juste comprendre qu'il faut accéder à l'instance du resulset qui est ouvert :

Test test = new Test(); // histoire d'avoir l'instance de la classe test quelque part

class Test {
   Resulset res;
   public Test() {
      tonBouton.addActionListener(new Test2());
   }
   public Resultat getRes() {
      return res;
   }
}

class Test2 implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      res.previous(); // là forcément ca va planter : NullPointerException !

     // façon de faire :
      if (!test.getRes().isFirst())
          test.getRes().previous(); // là ok ca marchera !
   }
}
______________________________________
DarK Sidious
0
jeeb2009 Messages postés 75 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 31 mars 2009
20 févr. 2009 à 13:14
avant d effectuer le test j aimerai savoir un truc l instruction:
tonbouton.addActionPerformed(...) c est le bouton ki permet d afficher ou c est le bouton precedent???
0
Rejoignez-nous