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

Développement Web en Java Discussion :

Générer un numero automatiquement


Sujet :

Développement Web en Java

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Points : 349
    Points
    349
    Par défaut Générer un numero automatiquement
    Bonjour à tous,
    Je suis sur un projet mais un problème me bloque depuis quelques jours et j'ai cherché sur internet mais en vain.Au fait,j'ai une table procès dans laquelle j'ai un champs de type varchar nommé "LibelleProces" dont la forme est : "CC-15-030-AAAA". Le problème les utilisateurs veulent que ce numéro soit automatique sachant que le "15" s'incrémente en fonction de l'année c'est-à-dire en 2016 ça va passer à "16" et ainsi de suite mais le "031" s'incrémente à chaque procès.Si quelqu'un sait comment je dois m'y prendre merci de me guider.

  2. #2
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Points : 909
    Points
    909
    Par défaut
    La comme ça je pense à plusieurs possibilités :

    Tu récupère la dernière string générée en base
    soit tu split, tu parse en int tu fait un +1 et tu reconstruit la chaine.
    soit avec des regexp ça doit pouvoir se faire aussi.

    Sinon à l'aide de ta base de données : tu crée une séquence en base pour gérer la valeur de la partie incrémentale.
    Informaticienne le jour, créatrice de bijoux la nuit (https://www.facebook.com/La-Fée-Chro...07539656306271) et maman à plein temps !

  3. #3
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Citation Envoyé par Lady Voir le message
    Tu récupère la dernière string générée en base
    Possible si tu as un seul utilisateur, si tu en as deux, tu cours tout droit au doublon !


    Sinon à l'aide de ta base de données : tu crée une séquence en base pour gérer la valeur de la partie incrémentale.
    Ca par contre c'est une très bonne idée.

    Reste à savoir si la séquence doit automatiquement être remise à 0 à chaque changement d'année (et en espérant qu'on n'ai jamais plus de 9999 procès dans une année)
    Je ne suis pas mort, j'ai du travail !

  4. #4
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    Citation Envoyé par Lady Voir le message
    Sinon à l'aide de ta base de données : tu crée une séquence en base pour gérer la valeur de la partie incrémentale.
    C'est la meilleure solution

    Cependant, toutes les bases de données ne supportent pas la séquence (SQL Server par exemple).
    Si c'est le cas alors pour être très strict sur cette clé primaire, il faudra créer le numéro ET l'insertion dans la table "Procès" dans une seule transaction.

    @Kasko : peux-tu nous dire de quelle base de données il s'agit (MySql, Oracle, SQL Server, ...) ?
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Points : 349
    Points
    349
    Par défaut
    Merci pour vos réponse.J'utilise MYSQL.

  6. #6
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    D'après le peu que je sais sur MySQL, cette base n'aurait pas de vrai système de séquence.
    Il semble que chaque programmeur y va de son système de contournement pour faire "comme Oracle".

    Du coup, la solution n°1 de Lady semble être la plus simple
    à condition de fiabiliser l'insertion en la plaçant dans une transaction.
    (Naturellement si un expert MySql a une meilleure solution, surtout qu'il n'hésite pas à poster !)

    Cela donnerait quelque chose du genre :
    1) récupération du dernier numéro avec une instrution SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(LibelleProces) As DernierNumero FROM PROCES
    2) on sépare les données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] tab = dernierNumero.split("-");
    3) on incrémente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int nouveauNumero = Integer.parse(tab[2]) + 1;
    (on met à jour l'année au besoin)
    et on reconstitue le LibelleProces
    4) on ouvre une transaction pour insérer l'ensemble LibelleProces + autres données de la table

    5) on gère le problème de doublon si la transaction échoue (peu probable car on a 999 insertions au maximum par an soit 3 ou 4 par jour !)

    @kasko : le mieux est que tu testes tout cela et tu postes à nouveau dans ce fil de discussion si tu rencontres des difficultés.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  7. #7
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Points : 349
    Points
    349
    Par défaut
    D'accord et surtout merci.

  8. #8
    Membre éprouvé
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Points : 1 256
    Points
    1 256
    Par défaut
    C'est peut-être une suggestion bête, mais pourquoi ne pas faire une classe utilitaire comme 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public class ProcesIdGenerator {
     
        private static final AtomicInteger ID_GENERATOR;
        private static int currentYear;
        static {
            String dernierId = ""; //que tu récupère avec une requête SQL;
            String[] dernierIdArray = dernierId.split("-");
            ID_GENERATOR = new AtomicInteger(Integer.valueOf(dernierIdArray[2]));
            currentYear = Integer.valueOf(dernierIdArray[1]);
        }
     
     
        public static String getId(String prefix,String suffix){
            checkYear();
            return prefix+"-"+currentYear+"-"+stringId()+"-"+suffix;
        }
     
        private static String stringId(){
            String id = String.valueOf(ID_GENERATOR.getAndIncrement());
            while(id.length()<3){
                id=0+id;
            }
        }
     
        private static void checkYear() {
            if(LocalDate.now().getYear() > currentYear){
                ID_GENERATOR.set(1);
                currentYear = LocalDate.now().getYear();
            }
        }
    }
    Ca permet de ne faire qu'une seule requête au démarrage, et ça règle le problème de concurrence, non?
    «Dieu ne joue pas aux dés.» - Albert Einstein. Et pan! 30 ans de retard dans la théorie quantique!
    «Tout n'est pas politique, mais la politique s'intéresse à tout.» - Nicolas Machiavel. Et surtout à ceux qui ne s'y intéressent pas.

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Lady Voir le message
    Sinon à l'aide de ta base de données : tu crée une séquence en base pour gérer la valeur de la partie incrémentale.
    A condition d'accepter les trous. Si l'exigence est que chaque numéro soit unique et qu'il n'y aie pas de trou, il n'y a pas beaucoup de possibilité: il faut crée un service unique de génération de ces numéro et tout le monde doit l'utiliser. Avec le problème de savoir comment gérer le rollback....

  10. #10
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    Mouis ....

    Si c'était une base SQL Server, j'aurai fait un trigger qui crée le numéro au moment de l'insertion.
    Cela a l'avantage d'être transactionnel donc aucun risque de se marcher sur les pieds.

    C'est peut-être possible en MySql.
    Il faudrait que Kasko sache créer un trigger dans MySql ou qu'il fasse appel à quelqu'un ...
    Peut-être sur le forum MySql ?
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    le trigger se déclenchant à l'insertion, pas au commit, ça reste inadapté si le client refuse les "trous". En même temps c'est presque impossible d'avoir un système sans trous, transactionnel et multi users...

  12. #12
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    le trigger se déclenchant à l'insertion, pas au commit, ça reste inadapté si le client refuse les "trous". En même temps c'est presque impossible d'avoir un système sans trous, transactionnel et multi users...
    Ben pas forcément, le trigger peut se déclencher après l'insertion, dans ce cas, il faudra tester si l'attribut est null ou pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TRIGGER numerotation_automatique AFTER INSERT ON laTable ...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Si tu fais un rollback après le insert, le trigger s'est déclenché et et ton item dans la séquence est définitivement perdu. Mais en définitive rien n'a été créé.

  14. #14
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Si tu fais un rollback après le insert, le trigger s'est déclenché et et ton item dans la séquence est définitivement perdu. Mais en définitive rien n'a été créé.
    ça dépend de ce que fait le trigger, si c'est un select max(colonneId), rien n'est perdu en définitive... il faut juste faire une lecture avec verrou et ça devrait être bon.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    select max(colonneId)
    C'était bien comme cela que je l'imaginais.
    A vrai dire, j'ai installé quelque chose du même genre qui fonctionne très bien depuis 10 ans.
    Maintenant, je ne génère qu'une centaine de codes par semaine donc ça va.

    Par ailleurs, quand on regarde la structure du code de kasko, on a : "CC-YY-NNN-AAAA"
    Avec un NNN compris entre 001 et 999 pour un an.

    Ce que je comprend c'est que les utilisateurs ne vont créer que 3 ou 4 numéros par jour ouvrable.
    Très probablement, ils préfèrent que l'ordinateur leur donne le numéro plutôt qu'ils aillent le chercher
    dans un cahier (registre) à pages numérotées qui tient la liste des affaires (procès).

    On est très loin des volumes d'un site de e-commerce donc avec contrôle raisonnable (transaction)
    tout devrait se passer sans problème.

    @Kasko : ce serait sympa de nous dire ce que tu en penses.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  16. #16
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Points : 349
    Points
    349
    Par défaut
    Au fait,le "CC" signifie comité de crédit ensuite "15" signifie l'année,le "030" le numéro du comité de crédit et le "AAAA" c'est la région dans laquelle a eu lieu le procès.
    Donc je dois générer ce numéro en fonction de l'année et incrémenter le numéro du procès à chaque procès.Au début de chaque année le numéro du procès est remis à zéro soit "000" donc le numéro du premier procès dans l'année "2016" doit être ainsi "CC-16-000-Paris".Merci d'avance!!!

  17. #17
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Kasko Voir le message
    Au fait,le "CC" signifie comité de crédit ensuite "15" signifie l'année,le "030" le numéro du comité de crédit et le "AAAA" c'est la région dans laquelle a eu lieu le procès.
    Donc je dois générer ce numéro en fonction de l'année et incrémenter le numéro du procès à chaque procès.Au début de chaque année le numéro du procès est remis à zéro soit "000" donc le numéro du premier procès dans l'année "2016" doit être ainsi "CC-16-000-Paris".Merci d'avance!!!
    si j'ai bien compris, peut-être suffirait-t-il se stocker dans la table les champs en tant que clé primaire composite à moins qu'il n'y ait déjà des clés étrangères :

    • type de comité "CC"
    • numéro de comité de crédit "030"
    • région "AAAA"
    • l'année "15"


    et puis lors des écrans/reports formatter le champ calculé de "référence" de cette manière ou d'une autre, ou avec une stored proc, ou un auto field (champ calculé intégré à la vue de table coté code ou coté db) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string ref = dbrecord.Type + "-" + dbrecord.Year + "-" + dbrecord.Num + "-" + dbrecord.Region;
    en gérant bien la taille des chaines (2, 3 et 4 caractères).

    ou sinon plus simple mais plus gourmand en ressources et moins pratique pour les requetes, on peut enregistrer cette valeur ref dans un champ ID et avoir deux fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string CreateID(type, year, num, region);
     
    string SplitID(out type, out year, out num, out region);
    on peut également encapsuler et faire une classe pour gérer cet ID de la clé primaire composite coté programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class ID
    {
      //
      string Type;
      string Year;
      string Num;
      string Region;
      //
      string Create(string str);
      string Create(type, year, num, region);
      string ToString();
    }
    et poursuivre la conception si cela est adapté.

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

Discussions similaires

  1. [WD14] generer un numero de bon automatiquement
    Par mosaique dans le forum WinDev
    Réponses: 9
    Dernier message: 11/02/2011, 16h11
  2. Agrandissement du Numero automatique
    Par valery17 dans le forum Access
    Réponses: 11
    Dernier message: 11/05/2006, 12h58
  3. [Info] Générer des numéros de licence
    Par nico2280 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 24/08/2005, 15h35
  4. Generer et incrementer automatiquement le clé primaire d'un
    Par ravelo dans le forum Bases de données
    Réponses: 3
    Dernier message: 15/06/2004, 20h12
  5. generer un numero auto a chaque insertion
    Par julio84 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 15/07/2003, 12h22

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