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)