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 d'un numéro chronologique


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Juin 2018
    Messages : 30
    Par défaut Gestion d'un numéro chronologique
    Bonjour,

    Je cherche une solution à un problème mais je n'y trouve pas de solution
    Je veux générer des numéros de devis (donc unique) tel que GT2005001
    GT utilisateur
    20 pour l'année 2020
    05 pour le mois de mai
    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 mai
    J'aimerais sachant cela générer un numéro de devis

    pour cela j'ai repris l'exemple des factures de https://www.developpez.net/forums/d7...umero-facture/

    1) insérer une nouvelle ligne
    2) récupération du dernier ID
    3) connaitre le nombre de facture du mois
    4) dernier ID-nb facture mois
    5) modifier les valeurs insérer

    voici ma table
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE `test`.`factures` (
      `id` INT NOT NULL AUTO_INCREMENT,
      `num_facture` VARCHAR(45) NULL,
      `date_enreg` TIMESTAMP NULL,
      PRIMARY KEY (`id`));


    pour le moment je bloque sur l'insert

    j'ai essayé différent façon de faire avec insert into factures (num_facture, date_enreg) values('GT2005','2020-05-10'); mais cela ne fonctionne pas meme s'est deux là.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $numfacture = "INSERT INTO factures VALUES (null,$numaudit,$datejour);";
    $resultat1 = mysqli_query($conn,$numfacture);
    et
    $conn->query("INSERT INTO factures VALUES ('', $numaudit,$datejour)");
    en SQL la requete fonctionne mais pas en PHP (sans erreur)

    pour info ma connexion a la base se fait par un include("db_connect.php") avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     	$server = "localhost";
    	$username = "root";
    	$password = "root";
    	$db = "test";
    	$conn = mysqli_connect($server, $username, $password, $db);
     
    if ($conn->connect_error) {
      die("Connection failed: " . $conn->connect_error);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $date = new DateTime();
    $datejour = date_format($date, 'Y-m-d');
    echo 'date du jour :'.$datejour;
    echo "<br/>";
    $dateimm = date_format($date, 'ym');
    $numaudit = 'GT'.$dateimm;

    pouvez vous m'aider pour réussir à intégrer une nouvelle valeur dans ma table en php ?

    merci

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Vous êtes en autoincrément, donc il ne faut pas le signaler et l'idéale étant de nommé les champs nécéssaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $numfacture = "INSERT INTO factures (num_facture, date_enreg) VALUES ($numaudit,$datejour);";
    Ceci est le plus simple et le moins sécure, une fois que cela fonctionne, je vous enjoins à voir du côté de PDO....

  3. #3
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Juin 2018
    Messages : 30
    Par défaut
    j'ai bien essayé mais ne fonctionne pas.

    par contre quand j'écris 'GT2005' et '2020-05-11' a la place de mes variables, la requete fonctionne.

    je dois avoir un problème avec mes variables ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    3 solutions.

    1- la MAUVAISE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $numfacture = "INSERT INTO factures (num_facture, date_enreg) VALUES ('$numaudit','$datejour');";
    2- la BONNE, avec requête préparée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /* on crée une requête préparée */
    $stmt = $mysqli->prepare("INSERT INTO factures (num_facture, date_enreg) VALUES (?,?)")) {
     
    /* Lecture des marqueurs */
    $stmt->bind_param("ss", $numaudit, $datejour);
     
    /* Exécution de la requête */
    $stmt->execute();
    3- La MEILLEURE : utiliser PDO.

  5. #5
    Invité
    Invité(e)
    Par défaut
    J'avais indiqué une méthodologie dans cette discussion.

    Ici, il faut :
    • créer une colonne "num" en INT (numérique), car ce sera plus simple
    • effectuer la requête pour le mois en cours "SELECT MAX(num) AS num_max .....".
    Dernière modification par Invité ; 11/05/2020 à 16h33.

  6. #6
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Juin 2018
    Messages : 30
    Par défaut
    bon finalement la mauvaise méthode fonctionne.
    je comprend pas pourtant j'avais déja essayé avec .
    c'est pas grave cela fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $numfacture = "INSERT INTO factures (num_facture, date_enreg) VALUES ('$numaudit','$datejour');";
    je continue...

    pour le max ID c'est bon avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $last_id = mysqli_insert_id($conn);
    echo "Le dernier enregistrement a l'id". $last_id;
    echo "<br/>";
    pour la date du début de mois je prend le timestamp que je convertit en date

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $debut_mois = date(DATE_ATOM,mktime(0,0,0,date("n"),1,date("Y")));
    maintenant je bloque sur ce bout de code avec une erreur "Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, bool given in c:..."

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $requet = "SELECT COUNT(*) as nb FROM factures WHERE date_enreg <$debut_mois";//ce truc la va compter le nombre de factures éditées AVANT le mois en cours
    $resultat = mysqli_query($conn,$requet);
    while($data=mysqli_fetch_array($resultat)){
        echo $data['nb'].'<br/>';
    je regarde sur le net des solutions. avez vous des pistes ?

    merci

  7. #7
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Juin 2018
    Messages : 30
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    J'avais indiqué une méthodologie dans cette discussion.

    Ici, il faut :
    • créer une colonne "num" en INT (numérique), car ce sera plus simple
    • effectuer la requête pour le mois en cours "SELECT MAX(num) AS num_max .....".
    j'avais pas vu cette solution.
    je peux l'adapter a mon problème avec une remise à zéro au mois au lieu du jour.


    une question à Jreaux62, suis je obliger de créer une nouvelle table "commande" et la colonne "num_colonne"

    merci toi

  8. #8
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Juin 2018
    Messages : 30
    Par défaut
    bon j'ai repris tes explication sur les commandes.

    j'ai crée une table commande avec les champs ci dessous
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE commande (
      id_commande int NOT NULL AUTO_INCREMENT,
      num_commande int DEFAULT NULL,
      date_commande date DEFAULT NULL,
      ref_command` varchar(45) DEFAULT NULL,
      PRIMARY KEY (id_commande)

    mais le code ci dessous me renvoie toujours la valeur 1. si je rentre la valeur $debut_mois en dur avec '2020-05-01', j'ai une erreur
    Notice: Object of class mysqli_result could not be converted to int in...
    avec
    Notice: Undefined variable ($num): row in ...
    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
    <?php include("db_connect.php"); ?>
     <?php
     
    $debut_mois = date(DATE_ATOM,mktime(0,0,0,date("n"),1,date("Y")));
    echo "date de début de mois : ".$debut_mois;
    echo "<br/>";
     
    $requete = "SELECT MAX(num_commande) AS max_num FROM commande WHERE date_commande >=".$debut_mois;
    $resultat1 = mysqli_query($conn,$requete);
    if ($resultat1== 0 or null){
    	$num=1;
    }
    else
    {
    	$num = $row['max_num']+1;
    }
     
    echo "valeur de num : ".$num;
    echo "<br/>";
    j'ai essayé nbRows = $resultat1>rowCount(); mais j'ai une erreur

    pouvez vous me dire ou se situe mon erreur ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par tiago77 Voir le message
    ...Je veux générer des numéros de devis...

    CREATE TABLE `test`.`factures` (
    ...

    CREATE TABLE commande
    ...
    Il faudrait savoir...
    C'est pour des devis, des factures ou des commandes ??

    Il faudrait aussi réfléchir un minimum, et ne pas recopier n'importe quoi n'importe comment.

    Concernant les factures, il existe des règles strictes à respecter.
    Notamment, les numéros doivent se suivre, sans trou, sur tout l'exercice (année comptable).
    Dernière modification par Invité ; 12/05/2020 à 13h21.

  10. #10
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Juin 2018
    Messages : 30
    Par défaut
    bonjour,

    ce que je veux c'est des numéros de devis.
    j'ai d'abord pris l'exemple des factures de cette discussion https://www.developpez.net/forums/d7...umero-facture/
    après j'ai l'exemple des commandes de la discussion https://www.developpez.net/forums/d1.../#post11524844

    ce que je veux c'est de réussir à reproduire un de ces deux exemples pour ensuite l'adapter a mes numéro de devis.

    Ok je vais continuer à réfléchir

  11. #11
    Membre Expert
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    946
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 946
    Par défaut
    Bonjour

    Bonne idée de se servir d'exemple trouvé ailleurs.

    Mais s'il faut comprendre le fonctionnement "technique", il faut aussi se pencher sur le contenu.

    J'ai été surpris de lire
    Je veux générer des numéros de devis (donc unique) tel que GT2005001
    GT utilisateur
    20 pour l'année 2020
    05 pour le mois de mai
    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 mai
    Que vient faire le numéro d'une facture sur un devis?
    À lire lire la discussion indiquée, on constate donc que vous avez fait du copier coller... sans relecture.

    Ce peut être une erreur d'étourderie, mais on constate souvent que c'est le signe aussi d'une attitude très attentiste : j'ai un problème, je ne cherche pas à le résoudre mais j'appelle à l'aide.
    Ce n'est sans doute pas le cas, mais pour les habitués du forum depuis de longues années, c'est lassant.

    Bref.
    Beaucoup sont là pour aider.
    Exposer clairement les problèmes, montrer que vous avez cherché, que vous avez fait des essais...

    Et bonne continuation

    Pierre

  12. #12
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Juin 2018
    Messages : 30
    Par défaut
    merci pierre
    effectivement cette discussion ne ressemble plus à rien avec tous ces bouts de code venant de plusieurs site.
    avant de venir poster une discussion je regarde sur le net les solutions des autres. je viens sur ce site pour avoir de l'aide (pas pour me faire le code). je suis complètement novice. j'ai commencé par lire un tuto sur MYSQL puis sur PHP/MYSQL. donc effectivement parfois je manque de logique et j'essaye n'importe quoi, mais j'essaye. je remercie les habituées pour leur aide.

    je recadre le sujet en travaillant sur l'exemple des commandes qui est plus simple.

    • j'en suis à ma requête select pour récupérer le dernier numéro du mois en cours qui me revoie toujours 1.
    • j'ai vérifié que dans ma table commande que le champ date_commande est en Ymd
    • si je rentre en dur une valeur date dans mysql la requête fonctionne
    • le problème doit venir de ma variable $debut_mois ou de ma requete $resultat1 = mysqli_query($conn,$requete1);
    • j'ai pourtant vérifié la variable $debut_mois avec echo
    • j'ai aussi vérifié la connexion à la base

    je sais plus quoi faire.
    je n'ai pas erreur. pouvez vous 'aider. Y a t -il d'autres tests a faire ?

    j'ai une table commande avec
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      id_commande int NOT NULL AUTO_INCREMENT,
      num_commande int DEFAULT NULL,
      date_commande date DEFAULT NULL,
      ref_command` varchar(45) DEFAULT NULL,
      PRIMARY KEY (id_commande)

    et avec les données suivantes :

    ID num_commande date_commande ref_command
    1 1 2020-04-25 GT2004001
    2 2 2020-04-26 GT2004002
    3 3 2020-04-30 GT2004003
    4 1 2020-05-01 GT2004001
    5 2 2020-05-02 GT2004002
    6 3 2020-05-04 GT2004003

    je veux récupérer le dernier numéro (le plus grand) du mois en cours (donc 3)

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    <?php
    	$server = "localhost";
    	$username = "root";
    	$password = "root";
    	$db = "test";
    	$conn = mysqli_connect($server, $username, $password, $db);
     
    if ($conn->connect_error) {
      die("Connection failed: " . $conn->connect_error);
    }
     
     <?php
    /* date du début de mois au format aaaa-mm-dd*/
    $debut_mois = date('Y-m-d',mktime(0,0,0,date("n"),1,date("Y")));
    echo "date de début de mois : ".$debut_mois;
    echo "<br/>";
     
    /* je vérifie le format de date_commande*/
    $requete1 = "SELECT id_commande,date_commande as datecom FROM commande WHERE date_commande='2020-04-25';";
    $resultat1 = mysqli_query($conn,$requete1);
    while($ligne=mysqli_fetch_array($resultat1)){
        echo $ligne['datecom'].'<br/>';
    }
     
    /* je teste la requete --> num=1 */
    $requete2 = "SELECT MAX(num_commande) AS max_num FROM commande WHERE date_commande >='$debut_mois';";
    $resultat2 = mysqli_query($conn,$requete2);
    if ($resultat2 == null){
    	$num=1;
    }
    else
    {
    	$num = $ligne['max_num']+1;
    }
    echo "valeur de num : ".$num;
    echo "<br/>";
     
     
    /* je teste la requete --> num=1 */
    $requete3 = "SELECT MAX(num_commande) AS max_num FROM commande WHERE date_commande >=".$debut_mois;
    $resultat3 = mysqli_query($conn,$requete3);
    if ($resultat3 == null){
    	$num=1;
    }
    else
    {
    	$num = $ligne['max_num']+1;
    }
    echo "valeur de num : ".$num;
    echo "<br/>";

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    OK. Pour les "DEVIS" ou les "COMMANDES", le principe sera le même.

    Pour le mois en cours :
    • en SQL : MONTH(date)(Si la date d’entrée est par exemple ‘2014-02-03’, la valeur de retour sera ‘3’)[/I]
    • en PHP : date('n') ('n' : Mois sans les zéros initiaux -> 1 à 12)

    Pour l'année en cours :
    • en SQL : YEAR(date)
    • en PHP : date('Y') ('Y' : Année sur 4 chiffres -> 2020)


    La requête préparée est donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $requete2 = "SELECT MAX(num_commande) AS max_num 
       FROM commande 
       WHERE YEAR(date_commande) = ? 
       AND MONTH(date_commande) = ? ";
     
    $stmt = $mysqli->prepare($requete2);
     
    /* Lecture des marqueurs */
    $stmt->bind_param("ss", date('Y'), date('n'));
     
    /* Exécution de la requête */
    $stmt->execute();
    N.B. On doit aussi pouvoir faire, plus simplement (à tester) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $requete2 = "SELECT MAX(num_commande) AS max_num 
       FROM commande 
       WHERE date_commande >= ? ";
     
    $stmt = $mysqli->prepare($requete2);
     
    /* Lecture des marqueurs */
    $stmt->bind_param("s", date('Y-m').'-01');
     
    /* Exécution de la requête */
    $stmt->execute();
    Dernière modification par Invité ; 12/05/2020 à 16h45.

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

Discussions similaires

  1. [WD12E] gestion des numéros des série d'un graphe
    Par biloux911 dans le forum WinDev
    Réponses: 6
    Dernier message: 09/11/2010, 15h26
  2. Gestion des numéros de key dans les SQLException
    Par izioto dans le forum MySQL
    Réponses: 0
    Dernier message: 18/09/2009, 17h43
  3. [MySQL] Gestion numéro de facture
    Par pas30 dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 30/03/2009, 00h04
  4. Gestion de l'évolution de ma base par numéro de version
    Par jackfirst72 dans le forum Outils
    Réponses: 4
    Dernier message: 16/03/2005, 13h38
  5. Gestion du numéro de version d'un projet
    Par Chris B dans le forum EDI
    Réponses: 5
    Dernier message: 22/11/2004, 15h08

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