Réinitialiser un id d'un compteur 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 janv. 2020 à 11:12
KX Messages postés 16755 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 - 24 févr. 2020 à 11:47
KX Messages postés 16755 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 - 24 févr. 2020 à 11:47
A voir également:
- Réinitialiser un id d'un compteur chaque année
- Compteur électrique - Guide
- Réinitialiser un pc - Guide
- Comment ralentir un compteur linky forum - Accueil - Objets connectés
- Comment réinitialiser un ordinateur verrouillé - Guide
- Réinitialiser manette ps4 - Guide
4 réponses
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
20 janv. 2020 à 15:13
20 janv. 2020 à 15:13
Bonjour,
En base de données il vaut mieux avoir un identifiant technique (autogénéré) en plus de ton identifiant fonctionnel (année+incrément), le premier étant géré en SQL, le second en Java.
Question : ton "compteur" pour l'année peut-il avoir des "trous" ? C'est à dire que si 2019-42 existe et que 2019-44 existe aussi, la valeur 2019-43 doit elle obligatoirement exister ?
Après, il y a plusieurs manières de faire, plus ou moins complexes, plus ou moins fiables, cela dépend aussi de l'architecture de ton application (en particulier pour la gestion de la concurrence)
En base de données il vaut mieux avoir un identifiant technique (autogénéré) en plus de ton identifiant fonctionnel (année+incrément), le premier étant géré en SQL, le second en Java.
Question : ton "compteur" pour l'année peut-il avoir des "trous" ? C'est à dire que si 2019-42 existe et que 2019-44 existe aussi, la valeur 2019-43 doit elle obligatoirement exister ?
Après, il y a plusieurs manières de faire, plus ou moins complexes, plus ou moins fiables, cela dépend aussi de l'architecture de ton application (en particulier pour la gestion de la concurrence)
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 23 janv. 2020 à 15:50
Modifié le 23 janv. 2020 à 15:50
Bonjour ,
je vais vous expliquer ce que je pense
enfaîte je voulais incrémenter mon compteur chaque année
mais lorsque l'année change le compteur doit être réinitialiser a 1
pour la proposition de mettre un trigger c'est vraiment solide mais je voulais que ce dernier se déclenchera à l'insertion de la donnée et dont le travail sera de calculer l'identifiant à partir de la date demande et ne pas la date courante .
le problème je n arrive pas a exprimer mon idée
je vais vous expliquer ce que je pense
enfaîte je voulais incrémenter mon compteur chaque année
mais lorsque l'année change le compteur doit être réinitialiser a 1
pour la proposition de mettre un trigger c'est vraiment solide mais je voulais que ce dernier se déclenchera à l'insertion de la donnée et dont le travail sera de calculer l'identifiant à partir de la date demande et ne pas la date courante .
le problème je n arrive pas a exprimer mon idée
CREATE TRIGGER RESETCOUNTER BEFORE INSERT ON compteur_demande BEGIN [/contents/1068-sql-commande-select select] max(id) as lastid ,YEAR(dt_demande) as lastdate from compteur_demande IF( old.lastdate <> new.dt_demande ) UPDATE compteur_demande set id = 1 END IF END
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
Modifié le 24 janv. 2020 à 14:08
Modifié le 24 janv. 2020 à 14:08
Bonjour,
Voici un exemple (testé avec MySql, mais MariaDB est assez proche)
Résultat :
Voici un exemple (testé avec MySql, mais MariaDB est assez proche)
DROP TABLE IF EXISTS demande; CREATE TABLE demande ( id_demande BIGINT NOT NULL AUTO_INCREMENT, annee_demande SMALLINT NOT NULL DEFAULT 0, numero_demande INT NOT NULL DEFAULT 0, text_demande VARCHAR(255) NOT NULL, PRIMARY KEY (id_demande), UNIQUE unique_numero_par_annee (annee_demande, numero_demande) ); DELIMITER $ CREATE TRIGGER numero_demande_trigger BEFORE INSERT ON demande FOR EACH ROW BEGIN DECLARE annee_actuelle SMALLINT; DECLARE max_numero INT; SET @annee_actuelle = YEAR(CURRENT_DATE); SET @max_numero = (SELECT COALESCE(MAX(numero_demande), 0) FROM demande WHERE annee_demande=@annee_actuelle); SET NEW.annee_demande = @annee_actuelle; SET NEW.numero_demande = @max_numero + 1; END$ DELIMITER ; INSERT INTO demande (text_demande) VALUES ('un'), ('deux'), ('trois'); SELECT * FROM demande;
Résultat :
id_demande annee_demande numero_demande text_demande
1 2020 1 un
2 2020 2 deux
3 2020 3 trois
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 5 févr. 2020 à 12:04
Modifié le 5 févr. 2020 à 12:04
Bonjour
c'est il possible de m'aider dans cette fonction , enfaîte je veux comparer l'année de lademande saisie a travers l'instance dem avec le résultat de la requête :
ci après ma logique
si ils sont égaux alors je retourne le max de id
si l'année de la demande saisie != de l'année retourné par la requête alors 1(réinitialiser le compteur a 1)
Le problème même l'année change ( ne sont pas égaux) le compteur incrémente a chaque fois
voici ma fonction :
c'est il possible de m'aider dans cette fonction , enfaîte je veux comparer l'année de lademande saisie a travers l'instance dem avec le résultat de la requête :
ci après ma logique
si ils sont égaux alors je retourne le max de id
si l'année de la demande saisie != de l'année retourné par la requête alors 1(réinitialiser le compteur a 1)
Le problème même l'année change ( ne sont pas égaux) le compteur incrémente a chaque fois
voici ma fonction :
public Integer maxIde(){ try { CompteurDemande dem= new CompteurDemande (); TypedQuery<Integer> max_date = em.createQuery("[/contents/1068-sql-commande-select SELECT] year_demande FROM CompteurDemande c ORDER BY year_demande DESC LIMIT 1", Integer.class); System.out.println(max_date); TypedQuery<Integer> query = em.createQuery("SELECT MAX(c.id) FROM CompteurDemande c ORDER BY year_demande DESC LIMIT 1", Integer.class); System.out.println(query); if(query.getSingleResult() != null && max_date.getSingleResult() != null) { System.out.println("OK"); if ( max_date.getSingleResult().equals(dem.getyeardemande())) { return query.getSingleResult(); } else { return 1; } } else return null;
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
24 févr. 2020 à 11:47
24 févr. 2020 à 11:47
Suite de la discussion ici :
https://forums.commentcamarche.net/forum/affich-36472223-reinitialiser-id-chaque-annee
https://forums.commentcamarche.net/forum/affich-36472223-reinitialiser-id-chaque-annee
22 janv. 2020 à 09:11
c'est un ordre par année c a d
40 2019
41 2019
42 2019
43 2019
pour moi c'est une application web basé sur le modele MVC
22 janv. 2020 à 16:27
Ma question concernant les "trous" est très importante pour t'orienter au mieux car ce serait une contrainte très forte.
Typiquement un auto-incrément géré par la base de données peut avoir des trous et faire mieux est bien plus complexe.
Une première solution, plutôt solide, est de mettre en place un trigger qui se déclenchera à l'insertion de la donnée et dont le travail sera de calculer l'identifiant à partir de la date courante.
Voir : https://mariadb.com/kb/en/trigger-overview/