Incremento o decremento

Hola!!!! Necesito ayuda, por favor!!! Quisiera saber cómo calcular la cantidad final en stock. Es decir, saber qué materiales están disponibles en stock. Se trata de hacer la cantidad de entradas menos la cantidad de salidas, lo que debe darme la cantidad final. Y no sé cómo escribir el código en PHP. En mi base de datos tengo una tabla MOVIMIENTOS (CODIGO_MAT, CANTIDAD_ENTRADA, CANTIDAD_SALIDA, FECHA), la clave foránea es CODIGO_MAT. Es en esta tabla MOVIMIENTOS donde se registran las entradas y salidas. También tengo una tabla STOCK (CODIGO_MAT, CANTIDAD) en la que se encuentra todo el material disponible en stock.

2 respuestas

  1. 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)
    1. $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;";