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

PHP & Base de données Discussion :

Gestion numéro de facture [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Par défaut Gestion numéro de facture
    Bonjour,

    Je cherche une solution à un problème qui est sans doute simple mais je n'y trouve pas de solution
    Je veux générer des numéros de facture (donc unique) tel que F09030001
    F pour Facture
    09 pour l'année 2009
    03 pour le mois de mars
    0001 un numéro unique indiquant le numéro de facture dans le mois, ici présent c'est la première du mois de mars
    J'aimerais sachant celà générer un numéro de facture de ce type lors d'un paiement en ligne
    Si quelqu'un aurait une idée je suis preneur
    Merci d'avance

  2. #2
    Membre très actif Avatar de myz-rix
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 143
    Par défaut
    bonjour,

    Je te propose ceci, tu commence par génerer ton entete
    FYYMM exemple F0902 ou F0903... à partir donc du mois et de l'année.

    Ensuite tu fait une boucle de 1000 à 9000 (je te conseil de commencer à 1000 au lieu de 0001 c'est plus simple)
    donc $i ton chiffre qui s'incrémente à partir de 1000.
    Cette boucle va tester dans ta base si il existe une facture du nom de:
    FYYMM + $i exemple
    F09031000 => test si existe => non
    F09031001 => test si existe => non
    F09031002 => test si existe => oui
    hop tu coupe la boucle et tu as ton numéro de facture

    c'est expliqué simplement, à toi de le programmer maintenant
    entre nous, une facture avec un simple numéro de 1000000 à 9000000 attribué aléatoirement et hop personne sait combien tu fais de facture par an

    Ensuite dans ton cas, je sais pas le commerce en question mais tu te limites à 9000 facture par mois, faut le savoir

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Par défaut
    Il y a beaucoup plus simple que çà je pense c'est clair parce que la boucle de 1000 à 9000
    mysql gère les valeurs incrémentales uniques (champ autoincrément) déjà c'est une piste je pense

  4. #4
    Membre chevronné Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Par défaut
    Ben oui en effet! il y a plus simple!
    Mysql gère cela très bien...

    Voici un modèle de table
    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
     
    CREATE TABLE IF NOT EXISTS `facture` (
      `id` int(4) unsigned zerofill NOT NULL AUTO_INCREMENT,
      `numero` varchar(10) COLLATE utf8_unicode_ci NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ;
     
    --
    -- Contenu de la table `facture`
    --
     
    INSERT INTO `facture` (`id`, `numero`) VALUES
    (0001, 'F09030001'),
    (0002, 'F09030001'),
    (0003, 'F09030001'),
    (0004, 'F09030001');
    Le champ id est entier auto_increment de 4 avec comme attribut unsigned zerofill. Ce qui créera automatiquement un numéro incrémenté au format 0001,0002,0003,...

    voilà voilà
    ++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Par défaut
    Heuu bravo pour les reponses mais c'est plus complique que ca, son numero doit revenir a 1 chaque mois (du moins je suppose, sinon au moins par an), donc avec l'auto_increment il va jouir.


    La solution est tout autre, il faut une table dans laquelle se trouve le dernier numero de facture sur la periode demandee. (donc avec comme cle par exemple '200903')

    Et la tu dois faire une routine qui va te chercher le dernier numero, et ensuite fait l'update dans la table.

    Maintenant comme ca, ca a l'air simple mais c'est pas encore fini, il faut tenir compte des acces concurentiels sur la table, donc que se passe t'il si 2 personnes font une demande en meme temps ???

    Pour ca il y a une solution, tu dois locker la table

    Voici un exemple pour faire ce genre de procedure :

    mysql_query("lock table cntnum write");
    mysql_query("update cntnum set number=number+1 where type='$type'");
    $q = mysql_query("select * from cntnum where type='$type'");
    $r = mysql_fetch_array($q);
    mysql_query("unlock tables");
    return sprintf("%s%05d",$r["seq"],$r["number"]);

  6. #6
    Membre chevronné Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Par défaut
    Ah bien vu chromo!!!

    Es tu d'accord avec ce gnre de structure de table pour éviter le problème de l'auto_increment?
    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
     
    CREATE TABLE IF NOT EXISTS `facture` (
      `an` year(4) NOT NULL,
      `mois` int(2) unsigned zerofill NOT NULL,
      `numero` int(4) unsigned zerofill NOT NULL,
      `montant` decimal(6,2) NOT NULL,
      PRIMARY KEY (`an`,`mois`,`numero`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
     
    --
    -- Contenu de la table `facture`
    --
     
    INSERT INTO `facture` (`an`, `mois`, `numero`, `montant`) VALUES
    (2009, 03, 0001, '30.85'),
    (2009, 03, 0002, '65.23');
    ++

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

Discussions similaires

  1. Numéro de facture
    Par edophie dans le forum SharePoint
    Réponses: 8
    Dernier message: 10/07/2008, 22h58
  2. Incrémentation du numéro de facture
    Par Toison dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 23/05/2008, 15h09
  3. Création d'un numéro de Facture
    Par chelmi95 dans le forum IHM
    Réponses: 2
    Dernier message: 23/04/2008, 11h23
  4. Création d'un numéro de Facture
    Par chelmi95 dans le forum VBA Access
    Réponses: 6
    Dernier message: 18/06/2007, 17h49
  5. numéro de facture
    Par Polux95 dans le forum Excel
    Réponses: 4
    Dernier message: 04/04/2007, 11h39

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