Réinitialiser id chaque année

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. Modérateur
    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. le probléme n'a pas été encore validé
    2. Modérateur
      @deep_seaNon, mais cela évitera d'explorer ici la piste du trigger qui a déjà été évoqué dans l'autre discussion...
  2. Modérateur
    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 


    1. mais je dois tester d'abord ,
      si la date courante = = max(date_demande)
      alors retourner max(id)
      sinon retourner 1
      1. Modérateur
        je ne vois pas pourquoi, pour moi on peut tout faire un seul select
      2. Modérateur
        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 ?
    2. Il ya plusieurs enregistrement par année .

      avec 1 seul select ça marche pas , toujours le compteur incrémente malgré la nouvelle année
      1. 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.
    3. 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;
              }
          }
      
      1. oui effectivement , je cherche a incrémenter le compteur durant l'année et a le réinitialise a chaque nouvelle année
        1. avez vous d'autre méthode a utiliser !
          1. Modérateur
            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.
        2. 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