Incrémentation ou décrémentation

bonjour!!!! j'aurais encore besoin d'aide SVP!!! j'aimerai savoir comment calculer la quantité finale en stock. C'est-à-dire de savoir quels matériels sont disponible en stock. Il s'agit de faire la quantité entrée moins la quantité sortie ce qui doit me donner la quantité finale. Et je ne sais pas comment écrire le code en php. Dans ma base de données j'ai une table MOUVEMENTS(CODE_MAT, QUANTITE_ENTREE, QUANTITE_SORTIE, DATE) la clé étrangère est CODE_MAT. C'est dans cette table MOUVEMENTS qu'on enregistre les entrées et les sorties. J'ai également une table STOCK (CODE_MAT , QUANTITE) dans laquelle on retrouve tout le matériel disponible en stock.

2 réponses

  1. Bonjour,

    Par principe, on n'enregistre *jamais* une donnée qui peut être calculée. Il me semble (j'y vais prudemment car je ne connais pas le problème et n'ai pas vu le MCD), il me semble donc, que la table Stock est superflue car elle n'enregistre une donnée et qui peut être calculée. Le faire complique la chose car lors des réapprovisionnements de matériels, il faudrait mettre à jour ET la table Mouvements ET la table Stock, idem lors des sorties de matériels. La table Mouvements suffit à elle seule.

    Soit cette table :
    Mouvements(idmvt, code_mat, qte_entree, qte_sortie, date) // *idmvt* = primary key

    +-------+----------+------------+------------+------------+
    | idmvt | code_mat | qte_entree | qte_sortie | date_mvt |
    +-------+----------+------------+------------+------------+
    | 1 | 167 | 0 | 10 | 2014-10-08 |
    | 2 | 45 | 100 | 0 | 2014-10-23 |
    | 3 | 167 | 100 | 0 | 2014-10-23 |
    | 4 | 1432 | 0 | 50 | 2014-11-02 |
    | 5 | 167 | 50 | 0 | 2014-11-03 |
    | 6 | 167 | 0 | 28 | 2014-11-10 |


    function inStock($idmat) {
         global $connexion; // $connexion = lien de connexion à la BDD
         $requete = "SELECT SUM(qte_entree) AS in, SUM(qte_sortie) AS out"
                  . "FROM Mouvements "
                  . "WHERE code_mat='$idmat';";
         $resultat = ExecRequete($request, $connexion); // Voir plus bas
         // +-------+-------+
         // |    in |   out |
         // +-------+-------+
         // |   150 |    38 |
         // +-------+-------+
    
         // Aller chercher la ligne dans le résultat retourné
         $r = mysql_fetch_object($resultat);
         return ($r->in - $r->out); // return  150-38 = 112
    }


    Dans le code, pour écrire le niveau du stock de tous les matériels :

    $requete  = "SELECT code_mat, libelle FROM Materiels ORDER BY libelle;";
    $resultat = ExecRequete($requete, $connexion);
    echo "Etat du stock :";
    echo "<ul>\n";
    while($r = mysql_fetch_object($resultat)) {
         echo "<li> $r->libelle : " . inStock($r->code_mat) . "</li>\n";
    }
    echo "</ul>\n";

    ExecRequete() :
    ---------------

    Pour ma part, j'utilise *toujours* un fichier init.php que j'insère systématiquement au début de chaque page PHP
    <?php require('/lib/init.php'); ?><html>
    <head>
    etc...


    Ce fichier init.php contient :
    - toutes les variables générales à initialiser,
    - la lecture de la table configuration du site (si elle existe)
    - les fonctions que l'on peut utiliser fréquemment dans les pages
    - la connexion à la base de données
    - exécutions de requêtes
    - etc...

    Vis-à-vis de la base de données :
    - des définitions (USER, SERVER, ... )
    - des fonctions de connexion, d'exécution de requête avec retour du résultat ou d'erreur

    <?php
    // Fichier: init.php
    // Date: AAA-MM-JJ
    
    // Infos de connexion à la base de données
    define (NOM,         "user_mysql"); // Utilisateur MySQL
    define (PASS,          "password"); // Mot de passe
    define (SERVER, "000.111.222.333"); // Nom du serveur ou son IP
    define (BASE,              "base"); // Base de données à utiliser
    
    /* mysql> show tables;
    +--------------------+
    | Tables_in_base     |
    +--------------------+
    | gia_Categories     |
    | gia_Clients        |
    | ic_ConfigSite      |
    | etc...             |
    +--------------------+
    38 rows in set (0.00 sec) */
    
    // Nom des tables
    // Les script utilisent TB_CAT, TB_CLI, etc... et non les noms de table
    // Si les noms de tables doivent changer, inutile de réécrire tous les
    // scripts. Il suffit de modifier ici.
    define (TB_CAT, "gia_Categories");  // Table des catégories de prestation
    define (TB_CLI,    "gia_Clients");  // Table des clients
    // etc ...
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // Variables diverses
    $cfg = "ic_ConfigSite";   // Table MySQL contenant la configuration du site, sinon, commenter
    $_debug = 0;              // Faut-il être en mode débuggage (1) ou non (0) ?
    $_dmail = "mail@fai.com"; // Adresse d'envoi des mails de debuggage
    $lastsave = 0;            // Date de la dernière sauvegarde (timestamp)
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // Affiche le message d'erreur et la requête l'ayant généré.
    function showSQLError($cnx,$sql) {
       $msg  = "<b>Erreur dans la requête!</b><br>".mysql_error($cnx)."<br>";
       $msg .= "<b>Requête:</b><br>$sql<hr>"; return $msg;
    }
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // Affiche un éventuel message d'erreur et quitte
    function showError($error,$sql="") {
       $cnx = $GLOBALS["connexion"];
       if($error == 1) { echo "Serveur inaccessible!"; }
       if($error == 2) { echo "Base inaccessible!";    }
       if($error == 3) { echo showSQLError($cnx,$sql); }
       exit;
    }
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // Exécute une requête et retourne son résultat ou un message d'erreur
    function ExecRequete($requete,$connexion) {
       $resultat = mysql_query($requete,$connexion);
       if($resultat) { return $resultat; } else { showError(3,$requete); }
    }
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // Effectuer la connexion au serveur, puis sélection de la base de données
    if(!@$connexion = mysql_pconnect(SERVER,NOM,PASS)) { showError(1); }
    if(!@$ok = mysql_select_db(BASE,$connexion))       { showError(2); }
    
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // Récupérer la configuration du site
    // table ic_ConfigSite
    // +------+------------------------+
    // | clef |                 valeur |
    // +------+------------------------+
    // | mail |      webmaster@fai.com |
    // |  tel |         01 02 03 04 05 |
    // |  url |  http://www.monsite.fr |
    // |  img |                   /img |
    // |  lib |                   /lib |
    if($cfg) {
       $requete = "SELECT * FROM $cfg;";
       $config  = ExecRequete($requete,$connexion);
       while($c = mysql_fetch_object($config)) { ${$c->clef} = $c->valeur; }
       // Dans les pages utiliser : $mail, $tel, $url, $img, $lib, etc...
    }
    ?>
    

    Dans les pages :
    $requete = "SELECT ... FROM ... WHERE ...;";
    $resultat = ExecRequete($requete, $connexion);

    Exemple :
    $requete = "SELECT "
             .      TB_CLI.".nom, ".TB_CLI.".prenom, ". etc...
             . "FROM "
             .      TB_CLI.", ".TB_CAT." "
             . "WHERE "
             .      "condition 1 ";
             . "AND "
             .      "condition 2;"
             . "ORDER BY "
             .      TB_CLI.".nom, ".TB_CLI.".prenom;";
    $resultat = ExecRequete($requete, $connexion);
    while($r = mysql_fetch_object($resultat)) {
         traiter les $r->colonnes_de_la_requete...
    }


    Un problème sans solution est un problème mal posé. (Albert Einstein)
    1. Après relecture (je n'ai plus le lien Modifier pour changer ce texte), enlever le point virgule derrière condition 1 et remplacer le point virgule par un espace après condition 2.
      $requete = "SELECT "
               .      TB_CLI.".nom, ".TB_CLI.".prenom, ". etc...
               . "FROM "
               .      TB_CLI.", ".TB_CAT." "
               . "WHERE "
               .      "condition 1 "
               . "AND "
               .      "condition 2 "
               . "ORDER BY "
               .      TB_CLI.".nom, ".TB_CLI.".prenom;";