Réinitialiser id chaque année

Fermé
deep_sea Messages postés 201 Date d'inscription mardi 10 mai 2016 Statut Membre Dernière intervention 10 décembre 2022 - Modifié le 20 févr. 2020 à 15:02
deep_sea Messages postés 201 Date d'inscription mardi 10 mai 2016 Statut Membre Dernière intervention 10 décembre 2022 - 9 mai 2020 à 19:59
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;
              }

    }

A voir également:

8 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
24 févr. 2020 à 11:46
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
deep_sea Messages postés 201 Date d'inscription mardi 10 mai 2016 Statut Membre Dernière intervention 10 décembre 2022 1
24 févr. 2020 à 15:55
le probléme n'a pas été encore validé
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > deep_sea Messages postés 201 Date d'inscription mardi 10 mai 2016 Statut Membre Dernière intervention 10 décembre 2022
24 févr. 2020 à 18:59
Non, mais cela évitera d'explorer ici la piste du trigger qui a déjà été évoqué dans l'autre discussion...
0
jee pee Messages postés 39622 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 23 avril 2024 9 231
Modifié le 20 févr. 2020 à 15:34
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
deep_sea Messages postés 201 Date d'inscription mardi 10 mai 2016 Statut Membre Dernière intervention 10 décembre 2022 1
20 févr. 2020 à 15:40
mais je dois tester d'abord ,
si la date courante = = max(date_demande)
alors retourner max(id)
sinon retourner 1
0
jee pee Messages postés 39622 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 23 avril 2024 9 231
20 févr. 2020 à 15:57
je ne vois pas pourquoi, pour moi on peut tout faire un seul select
0
jee pee Messages postés 39622 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 23 avril 2024 9 231
20 févr. 2020 à 16:11
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
deep_sea Messages postés 201 Date d'inscription mardi 10 mai 2016 Statut Membre Dernière intervention 10 décembre 2022 1
23 févr. 2020 à 09:22
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
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

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

Posez votre question
deep_sea Messages postés 201 Date d'inscription mardi 10 mai 2016 Statut Membre Dernière intervention 10 décembre 2022 1
26 févr. 2020 à 11:50
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
deep_sea Messages postés 201 Date d'inscription mardi 10 mai 2016 Statut Membre Dernière intervention 10 décembre 2022 1
Modifié le 26 févr. 2020 à 16:04
oui effectivement , je cherche a incrémenter le compteur durant l'année et a le réinitialise a chaque nouvelle année
0
deep_sea Messages postés 201 Date d'inscription mardi 10 mai 2016 Statut Membre Dernière intervention 10 décembre 2022 1
3 mai 2020 à 11:43
avez vous d'autre méthode a utiliser !
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
3 mai 2020 à 12:31
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
deep_sea Messages postés 201 Date d'inscription mardi 10 mai 2016 Statut Membre Dernière intervention 10 décembre 2022 1
9 mai 2020 à 19:59
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