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 :

champ id incrementation automatique + texte


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 11
    Points
    11
    Par défaut champ id incrementation automatique + texte
    Bonjour,

    Je suis en train de mettre en place une application de gestion de bon de commande. Je voudrais que le numero du bon de commande soit un truc BC-0512-1 où BC est une partie fixe et "0512" le mois actuel et la dernière partie une incrémentation. Chaque mois la partie mois est réinitialisé cad BC-0612-1.

    Assistez moi à me guider dans ce processus.

    Merci beaucoup.

    A vous

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Sur quel point porte ta difficulté ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 11
    Points
    11
    Par défaut
    juste je voudrais des idées. Comment dois-je procéder?? Par où commencer?? des petites exemples.

    C'est juste pour démarrer.

    A vous.

  4. #4
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Ben, c'est vraiment simple ton truc : Commence par regarder la fonction date();

    http://www.php.net/manual/fr/function.date.php

    Si j'ai bien compris, tu as juste besoin d'une fonction qui te passe ton $i en paramètre.
    A toi de jouer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function retourneBC($i){
       return ('BC-'.date(cherche un peu).'-'.$i);
    }
    Petit conseil, si tu veux que tes bons de commande se positionnent bien quand tu feras un order by, tu as intérêt à faire de $i un varchar plutôt qu'un integer.
    Exemple : si tu attends pas plus de 10 000 BC par mois, tu as intérêt à faire ça : '0001', '0002' etc...
    Sinon, immanquablement, tu auras la grouille...
    Si ton bon de commande entre dans une table, comme je le suppose, tu iras chercher dynamiquement ton $i à partir de cette table.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //syntaxe à vérifier
    //si l'on a déjà un format BC-201406-
    $sql='select substr(libelle,-4) from bc 
    where id=(
       select max(id) from bc
       where substr(libelle,1,10) like (concat('BC-',date_format(CURDATE(),'%Y,%m'),'-%'))
    );';
    //si aucune réponse $i vaut 0001
    //sinon tu repasses en integer et tu incrémentes et tu repasses en varchar...
    Pour les mêmes raisons, ton format mois sera plus intéressant si tu mets l'année d'abord 201406...

    A la réflexion, tu peux même tout gérer directement en SQL, au moment de ton insertion, tu formates ton nom de BC en deux requêtes : une en lecture, une en écriture.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup dendrite. Tu m'as donnée des astuces. Si je pourrais le faire le tout en SQL, ce serait agreable. Je vais tenter de le faire et je vous tiens au courant. Si vous avez d'autres idée, welcome.

    A vous

  6. #6
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 11
    Points
    11
    Par défaut
    Dendrite, apres comment je pourrais réinitialiser à la fin du mois?? Car il faut que ça recommence de 1 pour le mois suivant. EX: BC-201406-005; BC-201407-001

    A vous

  7. #7
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Ouf, j'ai eu du mal, mais ça fait exactement ce que tu veux en SQL.
    Peut-être d'autres ont des techniques moins laborieuses.
    On imagine que ta table bc possède un id autoincrement, un libelle en varchar, et un champ creation en timedate qui prend l'heure courante.
    Bien sûr, ici on imagine que l'on peut faire des saisies à posteriori (du genre le mois et l'année du champ creation ne correspondent pas au mois et à l'année du champ libelle)... Mon code prévoit ça.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    set @maxid=(
    	SELECT max(id) 
    	from bc 
    	where libelle like concat('bc-',date_format(CURRENT_DATE(),'%Y%m'),'-%' )
    );
    set @num=(select
    	SUBSTRING_INDEX(libelle,'-',-1)
    	from bc
    	where id=@maxid
    );
    set @num=ifnull(@num+1,1);
     
    insert into bc values (NULL, concat('bc-',date_format(CURRENT_DATE(),'%Y%m'),'-',@num),now());
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  8. #8
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 11
    Points
    11
    Par défaut
    Congratulation Dendrite. It is working. You are very smart.

    Nikel. Merci beaucoup. Et je l'ai testé à chaque début de mois, ça reprend de 1.

    Congratulation again dear.

  9. #9
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 11
    Points
    11
    Par défaut
    Dendrite small problem.

    Quand je l'avais testé directement dans phpmyadmin, ca marchait.

    Mais now dans le fichier php, l'incrementaion de @num ne fonctionne pas. le champ code_commande prend que BC-201406-1. Ca bouge pas de là.

    voici le code de la page:
    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
    require_once('includes/fonctions.php');
     
     
    $login = $_SESSION['login'];
    $code_code=$_POST['code_cde'];
    $date_code=$_POST['date_cde'];
    $nomemploye=$_POST['nomemploye'];
    $nomFRS=$_POST['nom_FRS'];
    $objetcde=$_POST['objet_cde'];
     
    $r=$bdd->prepare("SET @maxid=(SELECT max(Num_commande) FROM bondecommande WHERE code_commande LIKE concat(`BC-',date_format(CURRENT_DATE(),'%Y%m'),'-%') )");
    $re=$bdd->prepare("SET @num=(SELECT SUBSTRING_INDEX(code_commande,'-',-1) FROM bondecommande WHERE Num_commande=@maxid");
    //var_dump($re);
    $qer=$bdd->prepare("SET @num=ifnull(@num+1,1)");
    $r->execute();
    $re->execute();
    $qer->execute();
    var_dump($qer);
    $req = $bdd->prepare("INSERT INTO bondecommande (code_commande, date_commande, num_employe, num_fournisseur, objet_commande, soumis, valide, rejete, soumis_par) VALUES(concat('BC-',date_format(CURRENT_DATE(),'%Y%m'),'-',@num), :date_cde, (select num_employe FROM employe WHERE nom_employe= :nom_employe), (SELECT num_fournisseur FROM fournisseur WHERE nom_fournisseur= :nom_FRS), :objet_cde, 1, 0, 0, :soumis_par)");
    //$req->bindParam(":code_cde",$code_code);
    $req->bindParam(":date_cde",$date_code);
    $req->bindParam(":nom_employe",$nomemploye);
    $req->bindParam(":nom_FRS",$nomFRS);
    $req->bindParam(":objet_cde",$objetcde);
    $req->bindParam(":soumis_par",$login);
    $req->execute();

  10. #10
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 11
    Points
    11
    Par défaut
    Merci Dendrite.
    j'ai trouvé le probleme. C'etait une question de parenthése autour de SELECT.

    voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $r=$bdd->prepare("SET @maxid = (SELECT max(Num_commande) FROM bondecommande WHERE code_commande LIKE concat('BC-',date_format(CURRENT_DATE(),'%Y%m'),'-%'))");
    $r->execute();
    $re=$bdd->prepare("SET @num = (SELECT SUBSTRING_INDEX(code_commande,'-',-1) FROM bondecommande WHERE Num_commande=@maxid)");
    $re->execute();
    //var_dump($re);
    $qer=$bdd->prepare("SET @num = ifnull(@num+1,1)");
    $qer->execute();

  11. #11
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 40
    Points : 11
    Points
    11
    Par défaut
    J'ai eu soudain now une question. Comment dois-je faire quand 2 ou plus sont connecté et font simultanement de bon de commande??? Il y aura pas 2 bon de commande voire plus qui ont le meme code??

    J'ai vu sur d'autres forums qu'on peut locker la table mais cette idée ralentira les transactions.

    Comment dois je faire pour que plusieurs utilisateurs arrivent à avoir differents code de commande quand ils sumettent simultanement un bon de commande??

    A vous.

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

Discussions similaires

  1. [WD-2007] Incrementation automatique d'un champ
    Par langenoir11 dans le forum Word
    Réponses: 3
    Dernier message: 01/03/2010, 10h54
  2. incrementation automatique d'un champ
    Par atifo dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 02/12/2009, 17h17
  3. Incrementation automatique dechamp text
    Par atifo dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 12/02/2009, 13h25
  4. automationn excel, Champ nombre reste en text ???
    Par mat_lefebvre dans le forum Access
    Réponses: 16
    Dernier message: 09/12/2003, 11h37
  5. Nom du champs auto-incrementé
    Par norroy dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/06/2003, 18h30

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