Autor Tema: Transacciones con PDO  (Leído 3081 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pippin

  • Sv Member
  • ***
  • Mensajes: 301
Transacciones con PDO
« : noviembre 17, 2011, 06:03:03 pm »
Holo expertos de la web, veran en este momento tengo la necesidad de registrar una factura de venta y como sabran para esto hay que actualizar inventario, registrar venta, etc, este es el codigo PHP que tengo:

Código: [Seleccionar]
//Funcion que registra una VENTA y luego envia al PDF que tiene el formato de la FACTURA
    public function registrarVenta()
    {   
        //Estado de la factura cancelada o pendiente
        $_POST['fpago']     == 0 ? $estado = 0 : $estado = 1;
        $estado             == 0 ? $formaPago = 'Credito' : $formaPago = 'Contado';

        //Consulto tipo de regimen de la empresa para calcular IVA
        $consultaEmpresa    = $this->db->query("SELECT tipoempr FROM tb_empresa WHERE codiempr = 1");
        $tipoEmpresa        = $consultaEmpresa->fetchColumn();
       
        //Consulto codigo de la factura
        $consultaFactura    = $this->db->query("SELECT MAX(codivent) FROM tb_ventas");
        $codigoVenta        = $consultaFactura->fetchColumn() + 1;
       
        //Consulto cantidad de productos para facturar
        $consultaTemporales = $this->db->query("SELECT * FROM tb_temporales_vendidos");
       
        foreach($consultaTemporales as $temporal):

            //Comprubo que las variables no esten vacios de ser asi inserto en la tabla tb_det_ventas
            $registrarDetalle           = $this->db->prepare("INSERT INTO tb_det_ventas (codivent, codiprod, cantprod, valoprod) VALUES (?,?,?,?)");
            $registrarDetalle->execute(array($codigoVenta, $temporal['codiprod'], $temporal['cantprod'], $temporal['valoprod']));

            $consultaCantidadProductos  = $this->db->prepare("SELECT cantprod FROM tb_productos WHERE cobaprod = ?");
            $consultaCantidadProductos->execute(array($temporal['codiprod']));
            $cantidadActual             = $consultaCantidadProductos->fetchColumn();

            //Actualizo la cantidad de producto del inventario
            $nuevaCantidadProductos = $this->db->prepare("UPDATE tb_productos SET cantprod = ? WHERE cobaprod = ?");
            $nuevaCantidadProductos->execute(array(($cantidadActual - $temporal['cantprod']), $temporal['codiprod']));
           
            $subtotal += ($temporal['cantprod'] * $temporal['valoprod']);
           
        endforeach;//Finaliza for
       
        $_POST['descuento_fijo'] == '' ? $descuento = (($_POST['descuento_porcentaje']/100) * $subtotal) : $descuento = $_POST['descuento_fijo'];

        //Calculo total parcial que es el resultado del subtotal - el descuento
        $totalParcial = ($subtotal - $descuento);
       
        //Calculo el IVA del total bruto que es el 16%
        $tipoEmpresa == 1 ? $iva = ($totalParcial * (16/100)) : $iva = 0;
       
        //Calculo TOTAL FINAL
        $totalFinal = ($totalParcial + $iva);

        //Calculo pendiente
        $estado == 0 ? $pendiente = $totalFinal : $pendiente = 0;

        //Inserto en la tabla el registro de facturas
        $registrarVenta = $this->db->prepare("INSERT INTO tb_ventas (codiclie, codivend, subtvent, ivavent, descvent, totavent, saldvent, fopavent, estavent, fechvent, vencvent) VALUES (?,?,?,?,?,?,?,?,?,?,?)");
        $registrarVenta->bindParam(1, $_POST['cliente'], PDO::PARAM_INT);
        $registrarVenta->bindParam(2, $_POST['vendedor'], PDO::PARAM_INT);
        $registrarVenta->bindParam(3, ceil($subtotal), PDO::PARAM_INT);
        $registrarVenta->bindParam(4, ceil($iva), PDO::PARAM_INT);
        $registrarVenta->bindParam(5, ceil($descuento), PDO::PARAM_INT);
        $registrarVenta->bindParam(6, ceil($totalFinal), PDO::PARAM_INT);
        $registrarVenta->bindParam(7, ceil($pendiente), PDO::PARAM_INT);
        $registrarVenta->bindParam(8, $estado, PDO::PARAM_INT);
        $registrarVenta->bindParam(9, $estado, PDO::PARAM_INT);
        $registrarVenta->bindParam(10, date("Y-m-d", time()), PDO::PARAM_STR);
        $registrarVenta->bindParam(11, $_POST['vencimiento'], PDO::PARAM_STR);
        $registrarVenta->execute();

Me ha pasado en algun momento que al llegar al paso de registrar la venta (despues de haber actualizado el inventario) me vota error...

Lo que quiero es que si todo sale bien que se haga todo el trabajo con la BD de lo contrario que deje todo como estaba, he leido sobre transaccion con PDO pero no termino de entender como adaptarlo a mi necesidad, espero puedan orientarme donde debo iniciar la transaccion y donde evaluar si todo salio correcto para hacer el commit() o el rollback()

Espero me puedan ayudar, gracias.

Desconectado el_quick

  • Sv Jr.
  • **
  • Mensajes: 50
    • Cafeína Digital Studio
Re: Transacciones con PDO
« Respuesta #1 : diciembre 12, 2011, 12:35:00 pm »
Hola, creo que sé cual es la clase que estás usando aunque en este momento no recuerdo el nombre, pero busca un parámetro con un nombre com autocommit o algo asi, que por defecto trae true y ponele false, luego con tus validaciones decidí si hacer commit() o rollback();

Espero te sea de ayuda.

Desconectado pippin

  • Sv Member
  • ***
  • Mensajes: 301
Re: Transacciones con PDO
« Respuesta #2 : diciembre 14, 2011, 10:43:53 am »
Gracias el_quick por tu respuesta efectivamente con PDO, es facil hacre transacciones que al final es: si todo sale bien ejecute las tareas de la base de datos sino deje todo como estaba, estuve probando algunos ejemplo con MySQL y Postgres, y la verdad cada uno de estos motores tuvo respuestas diferentes.

Gracias nuevamente.