Error en Formulario ML

Buenas tardes, estoy haciendo un formulario ml y al querer ingresar, modificar o eliminar alguno de los registros, me sale el cartel como que la transacción se realiza correctamente, pero no me transacciona con la base de datos. Cual puede ser e error??
La consulta que utilizo es la siguiente:

<?php class ci_gestion_de_generos extends biblioteca_ci { //----------------------------------------------------------------------------------- //---- Eventos ---------------------------------------------------------------------- //----------------------------------------------------------------------------------- protected $s__datos; protected $s__datos_iniciales_ids; function evt__procesar() { $datos_ids=array(); try{ toba::db()->abrir_transaccion(); foreach($this->s__datos as $clave=>$fila){ $sql=""; if($fila['apex_ei_analisis_fila']=='A'){ $sql="INSERT INTO biblioteca.generos (genero) VALUES ('".quote($fila['genero'])."');"; } if($fila['apex_ei_analisis_fila']=='M'){ $sql="UPDATE biblioteca.generos SET genero = ".quote($fila['genero'])." WHERE id_genero =".quote($fila['id_genero']).";"; } if($fila['apex_ei_analisis_fila']=='B'){ $datos_ids[]=$fila['id_genero']; toba::db()->ejecutar($sql); } } if(count($datos_ids)>0){ $ids_baja=array_diff($this->s__datos_iniciales_ids); }else{ $ids_baja=$this->s__datos_iniciales_ids; } if(count($ids_baja)>0){ foreach($ids_baja as $id){ $sql="UPDATE bilblioteca.generos SET estado = 0 WHERE id_genero=".quote($id).";"; toba::db()->ejecutar($sql); } } toba::db()->cerrar_transaccion(); ei_arbol($this->s__datos_iniciales_ids); ei_arbol($datos_ids); ei_arbol($ids_baja); toba::notificacion()->agregar('Datos Grabados Correctamente', 'info'); }catch(toba_error_db $e){ toba::db()->abortar_transaccion(); ei_arbol($e); toba::notificacion()->agregar('Problemas en la Transaccion', 'error'); } } //----------------------------------------------------------------------------------- //---- formulario_ml ---------------------------------------------------------------- //----------------------------------------------------------------------------------- function conf__formulario_ml(biblioteca_ei_formulario_ml $form_ml) { unset($this->s__datos_iniciales_ids); $sql="SELECT id_genero, genero FROM generos WHERE estado=1 ORDER BY id_genero"; $datos=toba::db()->consultar($sql); $form_ml->set_datos($datos); foreach($datos as $fila){ $this->s__datos_iniciales_ids=$fila['id_genero']; } } function evt__formulario_ml__modificacion($datos) { print_r($datos); $this->s__datos; } } ?>

Gracias!

Hola Walter,

te fui marcando con negrita algunos detalles en el codigo, que pueden ser la causa del problema y te enumero en orden ahora:

1.- Solo ejecutas la SQL cuando hay una baja, sino no se ejecuta nada.
2.- El diff no tiene segundo parametro, asi que cuando entre por ahi es probable que tire un notice o falle, si tira el notice te devuelve exactamente el mismo arreglo, con lo cual “borrarias” todo.
3.- La variable de clase que usas para iterar el foreach, nunca recibe los datos… por lo que no entraria al ciclo nunca.

Como no hay error estricto de SQL, nunca se lanza la excepcion y no entra por el catch… asi que transacciona normalmente, solo que no hace nada.
Este tipo de CRUDs te conviene manejarlos con objetos de persistencia, te hacen mucho mas liviano el trabajo con los ML, incluso para la carga del mismo.

Podes usar el tag [c ode] para agregar codigo en los msg.
Saludos

Hola buenas tardes, primero gracias por contestar, con la ayuda que me diste pude solucionar para hacer las ALTAS y las MODIFICACIONES pero las BAJAS no me funcionan, lo revise al código y no se que puede ser, podrías ayudarme con eso por favor??

Una vez que logre que me funcione bien todo, voy a intentar hacerlo utilizando objetos de persistencia …Muchas Gracias por el consejo!

Ahí va e código para que lo vea y me ayude por favor!

<?php
class ci_gestion_de_generos extends biblioteca_ci
{
    //-----------------------------------------------------------------------------------
    //---- Eventos ----------------------------------------------------------------------
    //-----------------------------------------------------------------------------------
    protected $s__datos;
    protected $s__datos_iniciales_ids;
    
    function evt__procesar()
    {
        $datos_ids=array();
        try{
            toba::db()->abrir_transaccion();
            foreach($this->s__datos as $clave=>$fila){
                $sql="";
                if($fila['apex_ei_analisis_fila']=='A'){
                    $sql="INSERT INTO biblioteca.generos (genero)
                        VALUES (".quote($fila['genero']).");";
                    toba::db()->ejecutar($sql);
                }
                if($fila['apex_ei_analisis_fila']=='M'){
                    $sql="UPDATE biblioteca.generos
                        SET genero = ".quote($fila['genero'])."
                        WHERE id_genero =".quote($fila['id_genero']).";";
                    toba::db()->ejecutar($sql);
                }
                if($fila['apex_ei_analisis_fila']=='B'){
                    $datos_ids[]=$fila['id_genero'];
                    //toba::db()->ejecutar($sql);
                }
            }
            if(count($datos_ids)>0){
                $ids_baja=array_diff($this->s__datos_iniciales_ids, $datos_ids);
            }else{
                $ids_baja=$this->s__datos_iniciales_ids;
            }
            if(count($ids_baja)>0){
                foreach($ids_baja as $id){
                    $sql="UPDATE bilblioteca.generos
                        SET estado=0
                        WHERE id_genero =".quote($id).";";
                    toba::db()->ejecutar($sql);
                }
            }
            toba::db()->cerrar_transaccion();
            ei_arbol($this->s__datos_iniciales_ids);
            ei_arbol($datos_ids);
            ei_arbol($ids_baja);
            toba::notificacion()->agregar('Datos Grabados Correctamente', 'info');
        }catch(toba_error_db $e){
            toba::db()->abortar_transaccion();
            ei_arbol($e);
            toba::notificacion()->agregar('Problemas en la Transaccion', 'error');
        }
    }

    //-----------------------------------------------------------------------------------
    //---- formulario_ml ----------------------------------------------------------------
    //-----------------------------------------------------------------------------------

    function conf__formulario_ml(biblioteca_ei_formulario_ml $form_ml)
    {
        unset($this->s__datos_iniciales_ids);
        $sql="SELECT id_genero, genero FROM generos WHERE estado=1 ORDER BY id_genero";
        $datos=toba::db()->consultar($sql);
        $form_ml->set_datos($datos);
        foreach($datos as $fila){
            $this->s__datos_iniciales_ids=$fila['id_genero'];
        }
    }

    function evt__formulario_ml__modificacion($datos)
    {
        print_r($datos);
        $this->s__datos=$datos;
    }

}
?>

error_baja.jpg

error_baja.png

Hola Walter,
fijate que en el metodo conf del formulario, no estas acumulando los ids, sino que unicamente te quedas con el ultimo.
Es probable que eso te siga haciendo fallar el array_diff.

Una forma facil de visualizar esto, es configurando php.ini de la siguiente manera:


display_errors=On
error_reporting = E_ALL

Con eso te deberian salir los notices por pantalla, para que puedas ver en caso que la funcion no reciba lo que esta esperando.
Saludos

Hola Ricardo,
Gracias por ayudarme, te cuento, le agregue los corchetes a la variable s__datos_iniciales_ids para acumular los ids y no solo quedarme con el ultimo, y ahora me funciona borrar, PERO me esta borrando todo, seguro algo falla con el array_diff, pero nose que es…

Con respecto al archivo php.ini en que path se encuentra el mismo, yo modifique el único que encontré en “…/php/vendor/doctrine/cache/tests/travis” agregándole las lineas que me dijist,e pero no me aparecen los notices por pantalla. Gracias.

Saludos.

<?php
class ci_gestion_de_generos extends biblioteca_ci
{
    //-----------------------------------------------------------------------------------
    //---- Eventos ----------------------------------------------------------------------
    //-----------------------------------------------------------------------------------
    protected $s__datos;
    protected $s__datos_iniciales_ids;
    
    function evt__procesar()
    {
        $datos_ids=array();
        try{
            toba::db()->abrir_transaccion();
            foreach($this->s__datos as $clave=>$fila){
                $sql="";
                if($fila['apex_ei_analisis_fila']=='A'){
                    $sql="INSERT INTO biblioteca.generos (genero)
                        VALUES (".quote($fila['genero']).");";
                    toba::db()->ejecutar($sql);
                }
                if($fila['apex_ei_analisis_fila']=='M'){
                    $sql="UPDATE biblioteca.generos
                        SET genero = ".quote($fila['genero'])."
                        WHERE id_genero =".quote($fila['id_genero']).";";
                    toba::db()->ejecutar($sql);
                }
                if($fila['apex_ei_analisis_fila']=='B'){
                    $datos_ids[]=$fila['id_genero'];
                    //toba::db()->ejecutar($sql);
                }
            }
            if(count($datos_ids) > 0){
                $ids_baja=array_diff($this->s__datos_iniciales_ids, $datos_ids);
            }else{
                $ids_baja=$this->s__datos_iniciales_ids;
            }
            if(count($ids_baja) > 0){
                foreach($ids_baja as $id){
                    $sql="UPDATE biblioteca.generos
                        SET estado=0
                        WHERE id_genero =".quote($id).";";
                    toba::db()->ejecutar($sql);
                }
            }
            toba::db()->cerrar_transaccion();
            ei_arbol($this->s__datos_iniciales_ids);
            ei_arbol($datos_ids);
            ei_arbol($ids_baja);
            toba::notificacion()->agregar('Datos Grabados Correctamente', 'info');
        }catch(toba_error_db $e){
            toba::db()->abortar_transaccion();
            ei_arbol($e);
            toba::notificacion()->agregar('Problemas en la Transaccion', 'error');
        }
    }

    //-----------------------------------------------------------------------------------
    //---- formulario_ml ----------------------------------------------------------------
    //-----------------------------------------------------------------------------------

    function conf__formulario_ml(biblioteca_ei_formulario_ml $form_ml)
    {
        unset($this->s__datos_iniciales_ids);
        $sql="SELECT id_genero, genero FROM generos WHERE estado=1 ORDER BY id_genero";
        $datos=toba::db()->consultar($sql);
        $form_ml->set_datos($datos);
        foreach($datos as $fila){
            $this->s__datos_iniciales_ids[]=$fila['id_genero'];
        }
    }

    function evt__formulario_ml__modificacion($datos)
    {
        print_r($datos);
        $this->s__datos=$datos;
    }

}
?>

Hola Ricardo,
Lo del archivo php.ini ya lo solucione. Gracias!

Hola Walter,

tendrias que fijarte dos cosas en ppio:

1.- Si la variable $datos_ids tiene valores y en que formato, te recomiendo uses la llamada ei_arbol($datos_ids) para eso.
2.- Si la estructura que viene del cliente, para las bajas tiene efectivamente el ID de genero.

Saludos