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

Java Discussion :

Double boucle pour un resultset


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 41
    Par défaut Double boucle pour un resultset
    Bonjour,

    Je fais un select sur une table commandeClient qui est composé de ligneCommande. Mon but est de créer une ArrayList de Commande client.
    Je cale un peu pcq je boucle pour avoir les infos sur ma commandes et dans cette boucle je boucle pour prendre toutes les lignes. Au début j'avais fais deux while(donnees.next) mais alors quand je passe à la nouvelle commande il lit deux fois. du coup j'ai essayé avec un donnees.islAst mais il n'en veut pas.
    Et quand je test ce code il me trouve qu'une commande alors qu'il y en a deux.

    PS : les méthodes constructionCommande et constructionLigneCommande ne font que garnir les objets

    Merci

    Voilà le code
    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
    ArrayList<CommandeClient> liste=new ArrayList<CommandeClient>();
            CommandeClient cc;
     
            String requeteSQL="select  * "
                              +"from Client c join CommandeClient cc "
                              +"on c.Numéro=cc.NumClient "
                              +"join ligneCommande l " 
                              +"on cc.\"NUMÉRO\"=l.COMMANDECLIENTNUM " 
                              +"join marchandise m " 
                              +"on l.MARCHANDISE=m.\"RÉFÉRENCE\" " 
                              +"join adresse a "
                              +"on(a.rue=cc.LivraisonRue and a.numéro=cc.LivraisonNuméro and a.codepostal=cc.LivraisonCodepostal and a.localité=cc.LivraisonLocalité) "
                              +"where cc.NUMCLIENT=?";
            try{
                PreparedStatement prepStat = connexion.prepareStatement(requeteSQL);
                prepStat.setInt(1, numCli);
     
                ResultSet donnees = prepStat.executeQuery();
                ResultSetMetaData meta = donnees.getMetaData();            
                donnees.next();
     
                while(donnees.isLast()==false){
                    int numCom=donnees.getInt("Numéro");
                    cc=constructionCommande(donnees,meta);
                    cc.addLigneCommande(constructionLigneCommande(donnees));
     
                    while(donnees.next()&&numCom==donnees.getInt("Numéro")){
                        /*
                        On ajoute les lignes de commandes
                        */
     
                        cc.addLigneCommande(constructionLigneCommande(donnees));                    
                    }               
                    liste.add(cc);
                }
            }

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 776
    Par défaut
    C'est subtil mais tu ne gère pas le dernier élément dans 2 cas :
    • Si ton résultat ne contient qu'un seul élément
    • Ton dernier élément à un numéro différent de l'avant dernier


    Au vu de ces 2 cas, c'est très difficile de te répondre

    Es-tu obligé de faire des insertions à la fin?

    J'aurais plutôt fait un code comme cela ... mais non testé et améliorable selon tes données :
    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
        ResultSet donnees = prepStat.executeQuery();
        ResultSetMetaData meta = donnees.getMetaData();
     
        if ( donnees.next() ) {
            int numCom = donnees.getInt("Numéro");
            int current_numCom = ((numCom == 0)? 1: 0);
            bool is_first = true;
     
            do {
                numCom = donnees.getInt("Numéro");
     
                if (current_numCom != numCom) {
    //              Ou alors tester si cc n'est pas vide au lieu de créer un booléen
                    if (!is_first) { liste.add(cc); }
     
                    current_numCom = numCom;
                    cc = constructionCommande(donnees,meta);
                    is_first = false;
                }
     
                cc.addLigneCommande( constructionLigneCommande(donnees) );
            } while( donnees.next() );
     
            liste.add(cc);
        }
    Édit sauvage 1: Avec des insertions à la fin, il faut toujours ajouter en dernier (si je ne dis pas de bêtises ) .... sans test donc
    Édit sauvage 2: C'est vrai que l'algo de thelvin est plus propre avec ces insertions non pas à la fin, le premier next() qui permet de positionner sur le premier élément ... si on n'est pas obligé de le faire et son test OU pour gérer le premier numéro

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Bien que d'habitude je n'aime pas initialiser de variables à une valeur bidon, une structure en if/while me semble un peu rude. Je ferais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int currentNum = 0;
    CommandeClient cc = null;
     
    while(donnees.next()) {
      int num = donnees.getInt("Numéro");
      LigneCommande ligneCommande = constructionLigneCommande(donnees);
     
      if(cc == null || currentNum != num) {
        cc = constructionCommande(donnees,meta);
        list.add(cc);
        currentNum = num;
      }
      cc.addLigneCommande(ligneCommande);
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 41
    Par défaut
    Merci pour vos réponse,
    finalement j'ai réussi en ajoutant une variable boolean qui prenait la sortie

    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
    Boolean suivant;
    suivant=donnees.next());
    while(suivant){
                    int numCom=donnees.getInt("Numéro");
                    cc=constructionCommande(donnees,meta);
                    cc.addLigneCommande(constructionLigneCommande(donnees));
     
                    while(suivant&&numCom==donnees.getInt("Numéro")){
                        /*
                        On ajoute les lignes de commandes
                        */
     
                        cc.addLigneCommande(constructionLigneCommande(donnees));          
                        suivant=donnees.next();
                    }               
                    liste.add(cc);
                }

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Ma foi ça marche, mais je ne trouve pas ça très clair, comme construction.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 41
    Par défaut
    Oui, c'est vrai que ta solution est peut-être plus clair, je vais faire comme ça alors

    Merci

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/06/2015, 19h13
  2. Boucle : pour chaque élément d'un ensemble ?
    Par monstroplante dans le forum Langage
    Réponses: 7
    Dernier message: 07/11/2005, 15h45
  3. [MySQL] Boucle pour récuperer les images de la base
    Par tchoukapi dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/11/2005, 16h04
  4. boucle pour insérer des enregistrements
    Par roots_man dans le forum ASP
    Réponses: 7
    Dernier message: 05/10/2004, 09h28
  5. Réponses: 2
    Dernier message: 29/05/2002, 20h43

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