entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

insersion y actualización de tablas sql

saludos amigos, tengo las siguientes tablas:

trasvalores:
id_trasvalores
monto_trasvalores_apertura
monto_trasvalores_actual
monto_trasvalores_cierre
fecha
id_usuarios

transferencias:
id_transferencias
n_transferencia
fecha
hora
monto_trasferido
porcentaje
ganancia
total
id_usuarios
id_bancos_admin
id_cuentas_admin
id_clientes
id_bancos
id_cuentas
portada
status

ahora lo que necesito hacer es lo siguiente:

la tabla trasvalores es para ingresar montos por día, ejemplo: el admin hoy ingreso un monto de 100$. que seria el monto para iniciar el dia de trabajo

Ahora la tabla transferencias: para qué sirve, esta tabla es para realizar transferencias a clientes lo que quiero lograr es que cuando se haga una trasferencia se vaya actualizando en la tabla trasvolares; ejemplo si tengo en trasvolares un monto de 100$ y hice una transferencia de 20$ ya me debe quedar 80$ disponibles en trasvolares, lo que se tendría que actualizar cada vez que se haga una transferencia seria el monto_trasvalores_actual de la tabla trasvalores, pero antes de hacer la insersion debería hacer una consulta a la tabla trasvalores si hay fondo disponibles si hay se ejecuta el código de lo contrario debería mandar a recargar trasvalores para poder seguir realizando transferencias. hasta los momentos tengo esto.


<?php
if(isset($_POST['guardar'])){

  $sql = "SELECT monto_trasvalores_actual FROM trasvalores WHERE monto_trasvalores_actual = :monto_trasvalores_actual LIMIT 1"; //Creamos la select
  $check = $DB_con->prepare($sql); //Preparamos la SELECT, de ésta manera evitamos SQL Injection
  $check->bindParam(':monto_trasvalores_actual', $_POST['monto_trasvalores_actual']);//Substituimos las variables de la SELECT
  $check->execute();//Ejecutamos la consulta
  $contador = $check -> rowCount();//Esta función devuelve el número de resultados que ha devuelto la SELECT
  if ($contador > 2000) {
  $check->closeCursor();

              $errMSG = "¡ Ups Aviso: trasvalores insuficiente Por favor Actualize el monto!";

    }

    else

    {

    $imgFile = $_FILES['portada']['name'];
    $tmp_dir = $_FILES['portada']['tmp_name'];
    $imgSize = $_FILES['portada']['size'];

      $upload_dir = '../galerias_transferencias/'; // upload directory

      $imgExt = strtolower(pathinfo($imgFile,PATHINFO_EXTENSION)); // get image extension

      // valid image extensions
      $valid_extensions = array('jpeg', 'jpg', 'png', 'gif'); // valid extensions

      // rename uploading image
      $portada = rand(1000,1000000).".".$imgExt;

      // allow valid image file formats
      if(in_array($imgExt, $valid_extensions)){     
        // Check file size '5MB'
        if($imgSize < 5000000)        {
          move_uploaded_file($tmp_dir,$upload_dir.$portada);
        }
        else{

        $errMSG = "¡ Lo siento, su archivo es demasiado grande !";
        }
      }
      else{

      $errMSG = "¡ Lo sentimos, sólo se permiten archivos JPG, JPEG, PNG y GIF !";
      }

    // si no hay errores continuo...

  $sql = "SELECT  n_transferencia FROM transferencias WHERE   n_transferencia = :n_transferencia LIMIT 1"; //Creamos la select
  $check = $DB_con->prepare($sql); //Preparamos la SELECT, de ésta manera evitamos SQL Injection
  $check->bindParam(':n_transferencia', $_POST['n_transferencia']);//Substituimos las variables de la SELECT
  $check->execute();//Ejecutamos la consulta
  $contador = $check -> rowCount();//Esta función devuelve el número de resultados que ha devuelto la SELECT
  if ($contador > 0) {
  $check->closeCursor();

              $errMSG = "¡ Ups Aviso: El Registro ya se Encuentra Insertado !";

    }
    else
    {

$sql=$DB_con->prepare("INSERT INTO transferencias (n_transferencia,fecha,hora,monto_trasferido,porcentaje,ganancia,total,
  id_usuarios,id_bancos_admin,id_cuentas_admin,id_clientes,id_bancos,id_cuentas,portada,status) VALUES (
  :n_transferencia,:fecha,:hora,:monto_trasferido,:porcentaje,:ganancia,:total,:id_usuarios,:id_bancos_admin,:id_cuentas_admin,
  :id_clientes,:id_bancos,:id_cuentas,:portada,:status)");
$sql->bindParam(':n_transferencia', $_POST['n_transferencia']);
$sql->bindParam(':fecha', $_POST['fecha']);
$sql->bindParam(':hora', $_POST['hora']);
$sql->bindParam(':monto_trasferido', $_POST['monto_trasferido']);
$sql->bindParam(':porcentaje', $_POST['porcentaje']);
$sql->bindParam(':ganancia', $_POST['ganancia']);
$sql->bindParam(':total', $_POST['total']);
$sql->bindParam(':id_usuarios', $_POST['id_usuarios']);
$sql->bindParam(':id_bancos_admin', $_POST['id_bancos_admin']);
$sql->bindParam(':id_cuentas_admin', $_POST['id_cuentas_admin']);
$sql->bindParam(':id_clientes', $_POST['id_clientes']);
$sql->bindParam(':id_bancos', $_POST['id_bancos']);
$sql->bindParam(':id_cuentas', $_POST['id_cuentas']);
$sql->bindParam(':portada', $portada);
$sql->bindParam(':status', $_POST['status']);
$sql->execute();

$successMSG ="¡ Bien Hecho: Registro Insertado Correctamente !";

$monto_trasferido= 0;

$sql2 = "UPDATE trasvalores SET monto_trasferido=:monto_trasvalores_actual WHERE monto_trasvalores_actual=:monto_trasvalores_actual;";   
$sql2=$DB_con->prepare($sql2);
$sql2->bindValue(":monto_trasvalores_actual",$monto_trasvalores_actual);

    if ($sql2 ->execute())
    {
        //echo "Se actualizaron ".$sql2->rowCount()." registros";
    }
    else 
    {
        //echo "Los registros no se  actualizaron";
    }

               }

       }
  }
?>

2 Respuestas

3votos

yoclens Puntos1770

bueno al final lo pude solucionar y como lo solucione con Disparadores

CREATE 
          TRIGGER nuevotrasvalor AFTER INSERT 
          ON transferencias
          FOR EACH ROW
          UPDATE trasvalores SET monto_trasvalores_actual = (monto_trasvalores_actual-NEW.monto_trasferido)

Peter comentado Jul 17

Gracias por compartir la solución!

2votos

Leonardo-Tadei Puntos216110

Hola @yoclens,

para el problema que describís, las tablas están mal normalizadas, con lo que no podrás garantizar el buen funcionamiento de todo, o el poder hacer querys para obtener informes o estadísticas :-(

Para poder hacer lo que describís, tenés que pensar que el monto actual no debe surgir de estar editando un campo, sino de la suma de los ingresos menos la suma de los egresos. Esto te permite además poder agregar dinero sin perder el valor y momento en que se ingresó.

Por otra parte, no es correcto que tengas solo referencias a otros datos para reconstruir lo que pasó con el dinero, porque de hacer así, al cambiar o borrar un valor referido estarías perdiendo información, y es de esperar que un software así permita editar los datos de los bancos, las cuentas, los clientes, etc.

Perdón por no ayudarte con tu problema de código, pero no me parece sano ayudar a que se haga algo tiene errores de base que además, complican mucho la tarea.

Saludos cordiales

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Otras Preguntas y Respuestas


Actividad Reciente

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta