Hola,
Por principio, nunca se registra *
nunca* un dato que se puede calcular. Me parece (voy con precaución ya que no conozco el problema y no he visto el MCD), así que creo que la tabla Stock es superflua porque solo registra un dato que se puede calcular. Hacer esto complica las cosas ya que durante los reabastecimientos de materiales, habría que actualizar TANTO la tabla Movimientos COMO la tabla Stock, lo mismo durante las salidas de materiales. La tabla Movimientos es suficiente por sí sola.
Sea esta tabla:
Movimientos(idmvt, code_mat, qte_entree, qte_sortie, date) // *idmvt* = clave primaria
+-------+----------+------------+------------+------------+
| 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 = vínculo de conexión a la BDD $requete = "SELECT SUM(qte_entree) AS in, SUM(qte_sortie) AS out" . "FROM Movimientos " . "WHERE code_mat='$idmat';"; $resultat = ExecRequete($request, $connexion); // Ver más abajo // +-------+-------+ // | in | out | // +-------+-------+ // | 150 | 38 | // +-------+-------+ // Ir a buscar la fila en el resultado devuelto $r = mysql_fetch_object($resultat); return ($r->in - $r->out); // return 150-38 = 112 } En el código, para escribir el nivel de stock de todos los materiales:
$requete = "SELECT code_mat, libelle FROM Materiels ORDER BY libelle;"; $resultat = ExecRequete($requete, $connexion); echo "Estado del stock :"; echo "<ul>\n"; while($r = mysql_fetch_object($resultat)) { echo "<li> $r->libelle : " . inStock($r->code_mat) . "</li>\n"; } echo "</ul>\n"; ExecRequete() :
---------------
Por mi parte, siempre utilizo un archivo init.php que inserto de manera sistemática al comienzo de cada página PHP
<?php require('/lib/init.php'); ?><html> <head> etc... Este archivo init.php contiene:
- todas las variables generales a inicializar,
- la lectura de la tabla de configuración del sitio (si existe)
- las funciones que se pueden utilizar con frecuencia en las páginas
- la conexión a la base de datos
- ejecución de consultas
- etc...
En cuanto a la base de datos:
- definiciones (USER, SERVER, ... )
- funciones de conexión, ejecución de consultas con retorno del resultado o error
<?php // Archivo: init.php // Fecha: AAA-MM-DD // Información de conexión a la base de datos define (NOM, "user_mysql"); // Usuario MySQL define (PASS, "password"); // Contraseña define (SERVER, "000.111.222.333"); // Nombre del servidor o su IP define (BASE, "base"); // Base de datos a usar /* mysql> show tables; +--------------------+ | Tables_in_base | +--------------------+ | gia_Categories | | gia_Clients | | ic_ConfigSite | | etc... | +--------------------+ 38 filas en el conjunto (0.00 seg) */ // Nombres de las tablas // Los scripts utilizan TB_CAT, TB_CLI, etc... y no los nombres de la tabla // Si los nombres de las tablas deben cambiar, no es necesario reescribir todos los // scripts. Solo es necesario modificar aquí. define (TB_CAT, "gia_Categories"); // Tabla de categorías de prestación define (TB_CLI, "gia_Clients"); // Tabla de clientes // etc ... // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Variables diversas $cfg = "ic_ConfigSite"; // Tabla MySQL que contiene la configuración del sitio, de lo contrario, comentar $_debug = 0; // ¿Se debe estar en modo depuración (1) o no (0)? $_dmail = "mail@fai.com"; // Dirección de envío de correos electrónicos de depuración $lastsave = 0; // Fecha del último guardado (timestamp) // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Muestra el mensaje de error y la consulta que lo generó. function showSQLError($cnx,$sql) { $msg = "<b>¡Error en la consulta!</b><br>".mysql_error($cnx)."<br>"; $msg .= "<b>Consulta:</b><br>$sql<hr>"; return $msg; } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Muestra un posible mensaje de error y sale function showError($error,$sql="") { $cnx = $GLOBALS["connexion"]; if($error == 1) { echo "¡Servidor inaccesible!"; } if($error == 2) { echo "¡Base inaccesible!"; } if($error == 3) { echo showSQLError($cnx,$sql); } exit; } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Ejecuta una consulta y devuelve su resultado o un mensaje de error function ExecRequete($requete,$connexion) { $resultat = mysql_query($requete,$connexion); if($resultat) { return $resultat; } else { showError(3,$requete); } } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Realizar la conexión al servidor y luego seleccionar la base de datos if(!@$connexion = mysql_pconnect(SERVER,NOM,PASS)) { showError(1); } if(!@$ok = mysql_select_db(BASE,$connexion)) { showError(2); } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Recuperar la configuración del sitio // tabla 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; } // En las páginas usar : $mail, $tel, $url, $img, $lib, etc... } ?> En las páginas:
$requete = "SELECT ... FROM ... WHERE ...;";
$resultat = ExecRequete($requete, $connexion);
Ejemplo:
$requete = "SELECT " . TB_CLI.".nom, ".TB_CLI.".prenom, ". etc... . "FROM " . TB_CLI.", ".TB_CAT." " . "WHERE " . "condición 1 "; . "AND " . "condición 2;" . "ORDER BY " . TB_CLI.".nom, ".TB_CLI.".prenom;"; $resultat = ExecRequete($requete, $connexion); while($r = mysql_fetch_object($resultat)) { tratar los $r->columnas_de_la_consulta... } Un problema sin solución es un problema mal planteado. (Albert Einstein)