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

Langage SQL Discussion :

Générer un numéro de facture unique et sans trou en SQL


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Par défaut Générer un numéro de facture unique et sans trou en SQL
    Bonjour,

    Comment générer le prochain numéro de facture ?

    Cette question simple vient de m'être posée et j'avoue ne pas être certain de la réponse optimale à apporter, car derrière, il se cache un peu plus de complexité. Une application génère une facture à chaque paiement en ligne. Le numéro de facture doit être unique. J'utilise une contrainte d’unicité pour la garantir. Pour que la numérotation se suive, cad que je ne puisse jamais passer de facture0001 à facture0003 sans avoir généré la facture0002, j'avais donc pensé à une séquence. Mais les numéros doivent se suivre. Si une erreur survient entre la génération du prochain numéro de la séquence et la validation de la transaction, j'obtiens un trou dans ma numérotation et le comptable va rapidement s'énerver.

    La solution du max+1 est la meilleure solution pour avoir des verrous autobloquants.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into facture (numeroFacture, ...) select max(numeroFacture)+1, ... FROM ma_table_facture
    Alors comment faites-vous ?
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    De la même façon que vous le feriez si vous n'étiez pas informatisé.
    L'informatique n'étant que l'automatisation de certaines tâche la méthode de travail ne doit pas changer pas lorsque l'on traduit les process sous forme de code….

    En particulier lorsqu'une facture est erronée on la conserve et on indique qu'elle est annulée.

    Il n'y a donc jamais de trou dans la numérotation lorsque l'on utilise la version manuelle (une facture annulée ça existe sous forme papier). Il ne doit donc jamais y avoir de trou avec un auto incrément. En cas d'erreur, le code ne doit pas supprimer la facture incriminée, mais la marquer comme annulée.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Dissociez le numéro de facture qui a une signification fonctionnelle de l'identifiant technique de la facture qui n'a qu'un but technique.

    Créer vos factures avec des identifiants techniques via une séquence, une fois que vous êtes satisfait du résultat i.e. vous avez dépassé toutes les étapes qui peuvent occasionner des erreurs, alors numérotez vos factures.

  4. #4
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Par défaut
    Bonjour Waldar, bonjour Frédéric,

    Oui, Waldar, nous avions déjà dissocié le numéro fonctionnel de la facture de l'identifiant primaire de la table.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    te_bill(bill_id, number, amount, vat, bill_createdAt...)
    Nous avons dû néanmoins avoir d'âpres négociations choisi ton conseil Frédéric. Nous allons compléter avec une procédure interne qui identifie les trous, les présente fonctionnellement au comptable pour qu'il créée via une interface très simple les factures manquantes à zéro € et en mode annulé.

    Merci.

    Alexandre
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Il suffit de passer par une table qui stocke l'ID en cours et qui est mise à jour en incrémentant la valeur, par trigger par exemple.

    Ça permet de garantir qu'il n'y a pas de trou, si la transaction est annulée l'incrément est également annulé, évidemment la contrepartie c'est que la création d'une facture est sérialisée, impossible de créer 2 factures en parallèle.

  6. #6
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    961
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 961
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Il suffit de passer par une table qui stocke l'ID en cours
    Perso j'opte pour l'utilisation une séquence dont la valeur n'est "tirée" que lors de l'enregistrement/validation de la facture.
    Ainsi pas de "trous" en cas d'abandon de la facture pendant la création de celle-ci.


    Une facture non validée peut s'imprimer en tant que DEVIS.

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Une séquence ne peut garantir l'absence de trou même en l'absence de rollback.
    Elle est conçue pour la performance en concurrence d'accès, pas pour l'incrémentation sans trou.
    Pour l'incrémentation sans trou, il ne faut pas de concurrence lors de la l'incrémentation...

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

Discussions similaires

  1. [XL-2013] Générer automatiquement les numéros de facture
    Par Dr Noname dans le forum Excel
    Réponses: 1
    Dernier message: 25/01/2018, 17h57
  2. Numéro de facture qui s'incrémente sans être numéroAuto
    Par joseedaccess dans le forum VBA Access
    Réponses: 15
    Dernier message: 05/09/2017, 11h26
  3. Réponses: 3
    Dernier message: 06/02/2009, 13h44
  4. générer un numéro de version
    Par krolineeee dans le forum C++
    Réponses: 5
    Dernier message: 29/07/2006, 00h57
  5. Réponses: 12
    Dernier message: 10/06/2006, 23h16

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