Réinitialiser id chaque année

deep_sea Messages postés 215 Statut Membre -  
deep_sea Messages postés 215 Statut Membre -
Bonjour ,
a chaque validation d'une demande , un id est attribué automatiquement , ce id est incrémenter durant l'année et sera réinitialiser a 1 la nouvelle année
Table compteur_demande
id int key
year_demande key

exemple :
Durant l'année
1 2019
2 2019
3 2019
4 2019
....
n 2019

Nouvelle année
1 2020
2 2020

mon problème malgré l'arrivé de la nouvelle année , le compteur ne se réinitialise pas

voici ma fonction
  public Integer maxIdCompte(){
       try {
           int id = 0;
          int anne = Calendar.getInstance().get(Calendar.YEAR);
 TypedQuery<Integer> max_date= em.createQuery("SELECT max(year_demande) from compteur_demande ORDER BY  year_demande DESC LIMIT 1", Integer.class);  
           if(max_date.getSingleResult() != null)
           {      
               if(max_date.getSingleResult()== anne)    
               {     
                   TypedQuery<Integer> max_id= em.createQuery("SELECT COALESCE(max(id),0) FROM compteur_demande ORDER BY year_demande", Integer.class);  
                   id = max_id.getSingleResult() +1 ;
                        return id;
               }
               else
               {
                   id = 1;
                         return id;
               }
           }
          else return null;
       }
      catch (Exception e)
              {
                  return null;
              }

    }

8 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Bonjour,

    Voir aussi ton ancienne discussion (que je ferme, ça sert à rien d'en avoir deux...)
    https://forums.commentcamarche.net/forum/affich-36421418-reinitialiser-un-id-d-un-compteur-chaque-annee
    1
    1. deep_sea Messages postés 215 Statut Membre 1
       
      le probléme n'a pas été encore validé
      0
      1. KX Messages postés 19031 Statut Modérateur 3 020 > deep_sea Messages postés 215 Statut Membre
         
        Non, mais cela évitera d'explorer ici la piste du trigger qui a déjà été évoqué dans l'autre discussion...
        0
  2. jee pee Messages postés 31910 Date d'inscription   Statut Modérateur Dernière intervention   9 985
     
    Bonjour,

    Je ne sais pas comment le coder en java, mais pourquoi ne pas tout simplifier, une fois
    anne 
    récupérée avec la date courante, un seul select :

    SELECT COALESCE(max(id),0) FROM compteur_demande WHERE year_demande = anne 


    0
  3. deep_sea Messages postés 215 Statut Membre 1
     
    mais je dois tester d'abord ,
    si la date courante = = max(date_demande)
    alors retourner max(id)
    sinon retourner 1
    0
    1. jee pee Messages postés 31910 Date d'inscription   Statut Modérateur Dernière intervention   9 985
       
      je ne vois pas pourquoi, pour moi on peut tout faire un seul select
      0
    2. jee pee Messages postés 31910 Date d'inscription   Statut Modérateur Dernière intervention   9 985
       
      dans ta table, il y a un seul enregistrement par année

      4 2019

      ou plusieurs ?

      1 2019
      2 2019
      3 2019
      4 2019

      Et après, quand effectues-tu la mise à jour de la table pour incrémenter le compteur dans la table ?
      0
  4. deep_sea Messages postés 215 Statut Membre 1
     
    Il ya plusieurs enregistrement par année .

    avec 1 seul select ça marche pas , toujours le compteur incrémente malgré la nouvelle année
    0
    1. Ornhitoti
       
      Salut,
      si c'est une id dans le sens champ identifiant ce n'est clairement pas une bonne idée d'y toucher!
      En tout cas je vous conseille de changer la structure de vos tables pour utiliser l'identifiant naturel si ce n'es pas le cas (en tout cas d'avoir une id qui sera identifiante donc ne changera pas ).

      Sinon ça semble une question de SQL et je voit pas pourquoi vous ne pouvez pas sélectionner tous les champs concernés pour leur attribuer la valeur voulue.
      Utilisez des sous-requêtes ce qui sera plus simple que de faire un test logique dans java, ou en tout cas plus naturel et évitera d'avoir 2 requêtes pour une seule opération.


      UPDATE (SELECT /*champs concernnés ou seulement leur ID */ WHERE /* clause de sélection*/)champ concernnées, nouvelle valeur à attribuer

      entre parenthèse la sous-requête approximative, tout ça bien sûr à adapter à la structure de vos champs.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. deep_sea Messages postés 215 Statut Membre 1
     
    Bonjour ,
    je ne peux pas charger la structure de la table !
    J'ai fait ces modifications ,mais malgré ça le compteur incrémentera

          public Integer maxIdCompte(){
            try {
     TypedQuery<Integer> query = em.createQuery("SELECT COALESCE(max(id),1) FROM compteur_demande  \n" +
    "where year_demande != ( SELECT max(year_demande) from compteur_demande ORDER BY  year_demande DESC limit 1)\n" +
    " ORDER BY year_demande", Integer.class);
              
                if(query.getSingleResult() != null)
                    return query.getSingleResult();
                else
                    return null;
                
            } catch (Exception e) {
                return null;
            }
        }
    
    0
  7. deep_sea Messages postés 215 Statut Membre 1
     
    oui effectivement , je cherche a incrémenter le compteur durant l'année et a le réinitialise a chaque nouvelle année
    0
  8. deep_sea Messages postés 215 Statut Membre 1
     
    avez vous d'autre méthode a utiliser !
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Bonjour,

      Il y a plein de manières de faire, un certain nombre ont déjà été évoquées dans cette discussion et dans la précédente. Mais globalement ce n'est quand même pas très compliqué à mettre en place, et avec toutes les informations que l'on t'as déjà donné, code à l'appui, je ne vois vraiment pas pourquoi tu bloques encore 3 mois après !

      Pour rappel : CommentCaMarche est un forum d'entraide, c'est à dire que malgré l'aide que l'on peut t'apporter (et il y en eu), c'est à toi qu'il revient au final de faire ce travail. De plus tu es fortement invité à respecter les bénévoles qui te répondent ou t'ont répondu par le passé, a minima par l'usage du Bonjour, du S'il vous plaît, et du Merci.
      0
  9. deep_sea Messages postés 215 Statut Membre 1
     
    Bonjour ,
    D'abords , je vous remercie pour votre aide
    le problème j'ai essaye la procédure des trigger et ça marche parfaitement , mais je voulais garder le même programme que j'ai avec une petite modification sans toucher la base de donnée.

    Mes sincère salutation

    ps: je suis en retard car je travaille sur plusieurs logiciel en mème temps
    0