no lanza las notificaciones de error a la pantalla ocasionalmente

Hola a todos.

En un componente semejante al ABM personas del proyecto referencia, se me presenta el siguiente problema:

En el ci de edición hay un TAB con un formulario otro con una lista y un formulario y otros más con formularios ml, para cada uno tengo definido un número mínimo de registros. Cuando cambio del TAB o pantalla que tiene el cuadro con formulario sin agregar ni un registro me lanza la notificación de error, eso esta bién. Pero cuando lanzo el evento procesar no despliega la notificación de error, no obstante en el logger si se muestra. Tampoco despliega otras notificaciones.

Al hacer la validación del número de registros que deben ir en una tabla. Cuando cambio de “TAB” lo despliega sin problema, pero cuando lanzo el evento procesar solo lo manda al logger.

<?php
function evt__procesar()
{
  $this->dependencia('editor')->disparar_limpieza_memoria();
  $this->dependencia('editor')->disparar_limpieza_memoria();
  $this->get_relacion()->sincronizar();
  $this->get_relacion()->resetear();
  $this->set_pantalla('seleccion');
?>

no lanza la notificación con el error al cliente, obviamente el usuario asume que diligenció completos los formularios, cuando realmente no se completó el proceso.

En el logger sale asi:
Iniciando componentes... componente(2453): Pantalla de eventos: 'edicion' Procesando eventos... componente(2453): [ inicializar_dependencias ] array ( 0 => 'editor', ) componente(2456): Pantalla de eventos: 'solicitud' componente(2456): [ inicializar_dependencias ] array ( 0 => 'form_solicitud', ) componente(2453): [ evento ] 'ejecutado' -> [ evt__ejecutado ] componente(2456): [callback][ disparar_limpieza_memoria ] componente(2456): [callback][ limpiar_memoria ] componente(2456): [callback][ ini__operacion ] TABLA: [datos_equipo] No se cumplio con el tope minimo de registros necesarios [b]toba_error_validacion: La tabla <em>equipo</em> requiere ingresar al menos 1 registro/s (se encontraron sólo 0)[/b]. [trAZA] exception 'toba_error_validacion' with message 'La tabla equipo requiere ingresar al menos 1 registro/s (se encontraron sólo 0).' in /home/sglmain/toba_1.4.9/php/nucleo/componentes/persistencia/toba_datos_tabla.php:1359 Stack trace: #0 /home/sglmain/toba_1.4.9/php/nucleo/componentes/persistencia/toba_datos_tabla.php(1312): toba_datos_tabla->control_tope_minimo_filas() #1 /home/sglmain/toba_1.4.9/php/nucleo/componentes/persistencia/toba_datos_relacion.php(393): toba_datos_tabla->validar() #2 /home/sglmain/toba_1.4.9/php/nucleo/componentes/persistencia/toba_datos_relacion.php(504): toba_datos_relacion->disparar_validacion_tablas() #3 /home/sglmain/toba_1.4.9/proyectos/x/php/equipos/ci_navegacion.php(60): toba_datos_relacion->sincronizar() #4 /home/sglmain/toba_1.4.9/php/nucleo/componentes/interface/toba_ci.php(282): ci_navegacion->evt__procesar('undefined') #5 /home/sglmain/toba_1.4.9/php/nucleo/componentes/interface/toba_ci.php(204): toba_ci->disparar_evento_propio() #6 /home/sglmain/toba_1.4.9/php/nucleo/toba_solicitud_web.php(127): toba_ci->disparar_eventos() #7 /home/sglmain/toba_1.4.9/php/nucleo/toba_solicitud_web.php(45): toba_solicitud_web->procesar_eventos() #8 /home/sglmain/toba_1.4.9/php/nucleo/toba_nucleo.php(54): toba_solicitud_web->procesar() #9 /home/sglmain/toba_1.4.9/proyectos/x/www/aplicacion.php(25): toba_nucleo->acceso_web() #10 {main} [b]Mensaje a usuario: La tabla equipo requiere ingresar al menos 1 registro/s (se encontraron sólo 0).[/b] Configurando dependencias para responder al servicio... componente(2453): Pantalla de servicio: 'edicion' componente(2453): [ callback ] 'conf__edicion' componente(2456): Pantalla de servicio: 'solicitud' componente(2456): [ callback ] 'conf__solicitud' no fue atrapado componente(2456): [ callback ] 'conf__form_solicitud' Se filtro el evento: alta componente(2453): [ callback ] 'conf__editor' no fue atrapado Respondiendo al servicio__html_parcial...

ó en otro caso donde es una notificación informativa

<?php
toba::notificacion()->agregar('Prueba de notificación','inf');
?>

Iniciando componentes... componente(2453): Pantalla de eventos: 'edicion' Procesando eventos... componente(2453): [ inicializar_dependencias ] array ( 0 => 'editor', ) componente(2456): Pantalla de eventos: 'solicitud' componente(2456): [ inicializar_dependencias ] array ( 0 => 'form_solicitud', ) componente(2453): [ evento ] 'ejecutado' -> [ evt__ejecutado ] [b]Mensaje a usuario: Prueba de notificación[/b] Mensaje a usuario: Solicitud: . El proceso ha sido actualizado Configurando dependencias para responder al servicio... componente(2453): Pantalla de servicio: 'edicion' componente(2453): [ callback ] 'conf__edicion' componente(2456): Pantalla de servicio: 'solicitud' componente(2456): [ callback ] 'conf__solicitud' no fue atrapado componente(2456): [ callback ] 'conf__form_solicitud' Se filtro el evento: alta componente(2453): [ callback ] 'conf__editor' no fue atrapado Respondiendo al servicio__html_parcial...

De antemano les agradezco su orientación y colaboración.

Saludos,

Jaime

Hola Jaime,

te voy a pedir que me pegues una captura de la definicion del metodo “ejecutado” en el editor. Tambien el codigo del Ci ‘editor’ que supongo es donde se le envian los datos al objeto de persistencia.

Saludos

Hola Richard, agradezco tu ayuda.
El método ejecutado en el ci_navegacion.php

<?php
62   
63      function evt__ejecutado()
64      {
65          
66          $this->dependencia('editor')->disparar_limpieza_memoria();
67          $this->get_relacion()->sincronizar();
68      
69          $id = $this->get_relacion()->tabla('solicitudes')->get_columna('id');
70          $sql = "
71              UPDATE solicitudes SET fecha_ejecucion = now()::date, estado = 4, certificado_num = s.max+1, firma_asesor=c.firma 
72              FROM (SELECT MAX(u.certificado_num),u.asesor FROM solicitudes u  GROUP BY u.asesor) AS s LEFT JOIN contactos c ON c.id=s.asesor
73              WHERE solicitudes.id = " . $id . " AND s.asesor = solicitudes.asesor"
74              ;
75          if(consultar_fuente($sql)){
76              toba::notificacion()->agregar('Solicitud: '.$id_solicitud.'. El proceso ha sido actualizado', 'inf');
77          }
78          $sql = "UPDATE solicitudes SET firma_lider=c.firma FROM contactos c WHERE solicitudes.id = " . $id . " AND solicitudes.lider = c.id";
79          consultar_fuente($sql);
80          
81      }

?>

el codigo del CI

<?
      1 <?php
      2 php_referencia::instancia()->agregar(__FILE__);
      3 require_once('consultas.php'); ^M
      4
      5 class ci_edicion extends toba_ci
      6 {
      7   protected $s__equipo_d;
      8   protected $s__id_solicitud;
      9 /*
     10   function ini()
     11   {
     12   }
     13   */
     14   function get_relacion()
     15   {
     16     return $this->controlador->get_relacion();
     17   }
     18
     19   //-------------------------------------------------------------------
     20   //--- Pantalla 'solicitud'
     21   //-------------------------------------------------------------------
     22
     23
     24   function conf__form_solicitud()
     25   {
     26     $datos = $this->get_relacion()->tabla('solicitudes')->get();
     27     $id_solicitud = $this->get_relacion()->tabla('solicitudes')->get_columna('id');
     28     $this->s__id_solicitud = $this->get_relacion()->tabla('solicitudes')->get_columna('id');
     29     $certificado = $this->get_relacion()->tabla('solicitudes')->get_columna('certificado_num');
     30     $sql='SELECT b.d,c.prefijo FROM datos_equipo b LEFT JOIN solicitudes s ON s.id=b.solicitud LEFT JOIN contactos c ON c.id=s.asesor WHERE s.id='        .$id_solicitud;
     31     $asesor = consultar_fuente($sql);
     32     foreach($asesor AS $key => $fila){
     33       foreach($fila AS $key => $val){
     34         $att[$key]=$val;
     35       }
     36     }
     37     $this->s__equipo_d = $att['d']; // Esto es necesario para el cálculo de error.
     38     $documento = str_replace(' ','',$att['prefijo'].'-'.$certificado);
     39     $solicitud = array('id' => $id_solicitud);
     40     $fp_imagen_asesor = $this->get_relacion()->tabla('solicitudes')->get_blob('firma_asesor');
     41     if (isset($fp_imagen_asesor)) {
     42         $temp_nombre = md5(uniqid(time()));
     43         $temp_nombre = $documento.'.jpg';
     44         $temp_archivo = toba::proyecto()->get_www_temp($temp_nombre);
     45         $temp_fp = fopen($temp_archivo['path'], 'w');
     46         stream_copy_to_stream($fp_imagen_asesor, $temp_fp);
     47         fclose($temp_fp);
     48         $tamaño = round(filesize($temp_archivo['path']) / 1024);
     49         $datos['firma_asesor_imagen'] = "<img src='{$temp_archivo['url']}' alt=''>";
     50         $datos['firma_asesor'] = 'Tamaño: '.$tamaño. ' KB';
     51         $solicitud['fa'] = 1;
     52     } else {
     53       toba::notificacion()->agregar('Falta firma del metrólogo');
     54     }
     55
     56     $fp_imagen_lider = $this->get_relacion()->tabla('solicitudes')->get_blob('firma_lider');
     57     if (isset($fp_imagen_lider)) {
     58         $temp_nombre = md5(uniqid(time()));
     59         $temp_nombre = $documento.'_c.jpg';
     60         $temp_archivo = toba::proyecto()->get_www_temp($temp_nombre);
     61         $temp_fp = fopen($temp_archivo['path'], 'w');
     62         stream_copy_to_stream($fp_imagen_lider, $temp_fp);
     63         fclose($temp_fp);
     64         $tamaño = round(filesize($temp_archivo['path']) / 1024);
     65         $datos['firma_lider_imagen'] = "<img src='{$temp_archivo['url']}' alt=''>";
     66         $datos['firma_lider'] = 'Tamaño: '.$tamaño. ' KB';
     67         $solicitud['fc'] = 1;
     68     } else {
     69       toba::notificacion()->agregar('Falta firma del coordinador');
     70     }
     71
     72     $url_inf = toba::vinculador()->get_url(null, 3612, $solicitud);
     73     $html = "<a href='".$url_inf."'>Generar protocolo</a>";
     74     $datos['vinculo_protocolo'] = $html;
     75
     76     $url_cert = toba::vinculador()->get_url(null, 3572, $solicitud);
     77     $html = "<a href='".$url_cert."'>Generar certificado</a>";
     78     $solicitud['enviar'] = 1;
     79     $url_cert_enviar = toba::vinculador()->get_url(null, 3572, $solicitud);
     80     $html .= " <a href='".$url_cert_enviar."'>Enviar certificado</a>";
     81     $datos['vinculo_certificado'] = $html;
     82 /*
     83     toba::notificacion()->agregar($documento);
     84 */
     85     return $datos;
     86   }
      87
     88   function evt__form_solicitud__modificacion($registro)
     89   {
     90     $this->get_relacion()->tabla('solicitudes')->set($registro);
     91   }
     92
     93   //-------------------------------------------------------------------
     94   //--- Pantalla 'equipo'
     95   //-------------------------------------------------------------------
     96
     97   //-- Cuadro --
     98
     99   function conf__cuadro_equipo($cuadro)
    100   {
    101     return $this->get_relacion()->tabla('equipo')->get_filas();
    102   }
    103
    104   function evt__cuadro_equipo__seleccion($seleccion)
    105   {
    106     $this->get_relacion()->tabla('equipo')->set_cursor($seleccion);
    107
    108   }
    109
    110   //-- Formulario --
    111
    112   function conf__form_equipo()
    113   {
    114     if ($this->get_relacion()->tabla('equipo')->hay_cursor())
    115     {
    116       $datos = $this->get_relacion()->tabla('equipo')->get();
    117       return $datos;
    118     }
    119   }
    120
    121   function evt__form_equipo__alta($registro)
    122   {
    123     $this->get_relacion()->tabla('equipo')->nueva_fila($registro);
    124     //generar_formularios($id_solicitud);
    125     $id_solicitud = $this->get_relacion()->tabla('solicitudes')->get_columna('id');
    126     $sql = 'SELECT * FROM condiciones_ambiente WHERE solicitud = ' . $id_solicitud;
    127     $results = consultar_fuente($sql);
    128     if(empty($results))
    129     {
    130       $form = array('variable' => 'TEMPERATURA °C'); $this->get_relacion()->tabla('ambiente')->nueva_fila($form);
     131       $form = array('variable' => 'HUMEDAD RELATIVA %HR'); $this->get_relacion()->tabla('ambiente')->nueva_fila($form);
    132
    133       $form = array('hora_inicio' => '00:00:00','carga' => 0);
    134       $this->get_relacion()->tabla('constancia_cero')->nueva_fila($form);
    135       $form = array('hora_inicio' => '00:00:00','carga' => 0);
    136       $this->get_relacion()->tabla('constancia_cero')->nueva_fila($form);
    137       $form = array('hora_inicio' => '00:30:00','carga' => $registro['maxima']);
    138       $this->get_relacion()->tabla('constancia_cero')->nueva_fila($form);
    139       $form = array('hora_inicio' => '00:30:00','carga' => $registro['maxima']);
    140       $this->get_relacion()->tabla('constancia_cero')->nueva_fila($form);
    141
    142       for($i=1;$i<=8;$i++)
    143       {
    144         $form = array('nombre' => 'U pesa '.$i); $this->get_relacion()->tabla('u_pesa')->nueva_fila($form);
    145       }
    146
    147       for($i=1;$i<6;$i++)
    148       {
    149         $form = array('lado' => $i,'carga' => $registro['carga_excentricidad']); $this->get_relacion()->tabla('excentricidad')->nueva_fila($form);
    150       }
    151       $form = array('lado' => 1,'carga' => $registro['carga_excentricidad']); $this->get_relacion()->tabla('excentricidad')->nueva_fila($form);
    152
    153       $form = array('nombre_registro' => 'Carga', 'bajo' => $registro['carga_baja'], 'medio' => $registro['carga_media'], 'alto' => $registro['carga_        alta']);
    154       $this->get_relacion()->tabla('movilidad')->nueva_fila($form);
    155       $form = array('nombre_registro' => 'Indicación');
    156       $this->get_relacion()->tabla('movilidad')->nueva_fila($form);
    157       $form = array('nombre_registro' => 'Aumento 1.4d', 'bajo' => 1.4*$registro['d'], 'medio' => 1.4*$registro['d'], 'alto' => 1.4*$registro['d']);
    158       $this->get_relacion()->tabla('movilidad')->nueva_fila($form);
    159       $form = array('nombre_registro' => 'Indicación 2');
    160       $this->get_relacion()->tabla('movilidad')->nueva_fila($form);
    161
    162       for($i=0;$i<10;$i++)
    163       {
    164         $form = array('carga_baja' => $registro['carga_baja'], 'carga_media' => $registro['carga_media'], 'carga_alta' => $registro['carga_alta']);
    165         $this->get_relacion()->tabla('invariabilidad')->nueva_fila($form);
    166       }
    167
    168       for($i=0;$i<18;$i++)
    169       {
    170 //        $form = array('carga_baja' => $registro['carga_baja'], 'carga_media' => $registro['carga_media'], 'carga_alta' => $registro['carga_alta']);
    171         $this->get_relacion()->tabla('exactitud')->nueva_fila($form);
    172       }
     173       toba::notificacion()->agregar('Se han generado los formularios correctamente');
    174     }
    175     foreach($registro AS $key => $val){
    176       if($key == "d"){
    177         $this->s__equipo_d = $val;
    178       }
    179     }
    180   }
    181
    182   function evt__form_equipo__modificacion($registro)
    183   {
    184     $this->get_relacion()->tabla('equipo')->set($registro);
    185     foreach($registro AS $key => $val){
    186       if($key == "d"){
    187         $this->s__equipo_d = $val;
    188       }
    189     }
    190     $this->evt__form_equipo__cancelar();
    191   }
    192
    193   function evt__form_equipo__baja()
    194   {
    195     $this->get_relacion()->tabla('equipo')->set(null);
    196   }
    197
    198
    199   function evt__form_equipo__cancelar()
    200   {
    201     $this->get_relacion()->tabla('equipo')->resetear_cursor();
    202   }
    203
    204
    205   //-------------------------------------------------------------------
    206   //--- Pantallas 'formulario multilinea'
    207   //-------------------------------------------------------------------
    208
    209   function conf__form_ambiente()
    210   {
    211     return $this->get_relacion()->tabla('ambiente')->get_filas(null, true);
    212   }
    213
    214   function evt__form_ambiente__modificacion($datos)
    215   {
     216     $this->get_relacion()->tabla('ambiente')->procesar_filas($datos);
    217   }
    218   //----------------------------------
    219   function conf__form_pesas()
    220   {
    221     return $this->get_relacion()->tabla('u_pesa')->get_filas(null, true);
    222   }
    223
    224   function evt__form_pesas__modificacion($datos)
    225   {
    226     $this->get_relacion()->tabla('u_pesa')->procesar_filas($datos);
    227   }
    228   //----------------------------------
    229   function conf__form_err_max()
    230   {
    231     return $this->get_relacion()->tabla('err_max')->get_filas(null, true);
    232   }
    233
    234   function evt__form_err_max__modificacion($datos)
    235   {
    236     $this->get_relacion()->tabla('err_max')->procesar_filas($datos);
    237   }
    238   //----------------------------------
    239   function conf__form_excentricidad()
    240   {
    241     return $this->get_relacion()->tabla('excentricidad')->get_filas(null, true);
    242   }
    243
    244   function evt__form_excentricidad__modificacion($datos)
    245   {
    246     $this->get_relacion()->tabla('excentricidad')->procesar_filas($datos);
    247   }
    248   //----------------------------------
    249   function conf__form_movilidad()
    250   {
    251     return $this->get_relacion()->tabla('movilidad')->get_filas(null, true);
    252   }
    253
    254   function evt__form_movilidad__modificacion($datos)
    255   {
    256     $this->get_relacion()->tabla('movilidad')->procesar_filas($datos);
    257   }
    258   //----------------------------------
     259   function conf__form_const_cero()
    260   {
    261     return $this->get_relacion()->tabla('constancia_cero')->get_filas(null, true);
    262   }
    263
    264   function evt__form_const_cero__modificacion($datos)
    265   {
    266     $this->get_relacion()->tabla('constancia_cero')->procesar_filas($datos);
    267   }
    268   //----------------------------------
    269   function conf__form_exactitud()
    270   {
    271     return $this->get_relacion()->tabla('exactitud')->get_filas(null, true);
    272   }
    273
    274   function evt__form_exactitud__modificacion($datos)
    275   {
    276     if($this->s__equipo_d == '')
    277       toba::notificacion()->agregar('No esta cargada la variable \'(d)\. Por favor vaya a datos equipo y actualice la información (Click en Aceptar)        .','error');
    278     $this->get_relacion()->tabla('exactitud')->procesar_filas($datos);    $d = $this->s__equipo_d/2;
    279     $sql = 'UPDATE exactitud SET  error_creciente=(creciente-carga)+'.$d.'-delta_creciente WHERE solicitud='.$this->s__id_solicitud;
    280     consultar_fuente($sql);
    281     $sql = 'UPDATE exactitud SET  error_decreciente=(decreciente-carga)+'.$d.'-delta_decreciente WHERE solicitud='.$this->s__id_solicitud;
    282     consultar_fuente($sql);
    283   }
    284   //----------------------------------
    285   function conf__form_invariabilidad()
    286   {
    287     return $this->get_relacion()->tabla('invariabilidad')->get_filas(null, true);
    288   }
    289
    290   function evt__form_invariabilidad__modificacion($datos)
    291   {
    292     $this->get_relacion()->tabla('invariabilidad')->procesar_filas($datos);
    293   }
    294
    295   function generar_formularios($id)
    296   {
    297     $sql = "SELECT * FROM condiciones_ambiente WHERE solicitud = $id";
    298     if($results = toba::db('vx')->consultar($sql))
    299     {
    300       toba::notificacion()->agregar($results);
     301     }
    302   }
    303
    304 }
 
 
?>

Hola Jaime perdon por la tardanza,

Los mensajes que se agregan del lado del servidor se muestran en el cliente mediante la libreria de notificacion de toba. Lo que creo que lo que puede estar pasando es que se produzca un error en javascript y por ende no se esten mostrando las notificaciones. Te pediria que te fijes en el browser si no te presenta algun error de js en el momento en que supuestamente deberia mostrar la notificacion.

Otro comentario aparte y que no esta relacionado, veo que en el “evt__ejecutado” estas realizando consultas SQL directamente contra la bd, ten en cuenta lo siguiente:

  • El metodo consultar_fuente fue hecho para devolver datos, por tanto para realizar un update, insert u alguna otra sentencia que no implique recuperar datos deberias usar toba::db()->ejecutar($sql);
  • El componente de persistencia (en este caso la relacion) maneja transacciones automaticamente, pero la transaccion solo abarca lo que se ejecuta dentro del metodo sincronizar(), en el caso del metodo que me enviaste ambos UPDATE te quedan fuera de la transaccion por tanto te podria quedar un estado inconsistente.

Para ejecutar todo dentro de una misma transaccion lo que puedes hacer es desactivar el manejo automatico en el componente de persistencia y explicitamente manejarlo tu, seria algo asi:


function evt__nombre_evento()
{
      //Primeramente desactivo las transacciones automaticas del componente    
      $this->get_relacion()->get_persistidor()->desactivar_transaccion();

       //Luego abro explicitamente la transaccion
      toba::db()->abrir_transaccion();
      try {
                $this->get_relacion()->sincronizar();
                $id = $this->get_relacion()->tabla('solicitudes')->get_columna('id');
                $sql = "
                     UPDATE solicitudes SET fecha_ejecucion = now()::date, estado = 4, certificado_num = s.max+1, firma_asesor=c.firma 
                    FROM (SELECT MAX(u.certificado_num),u.asesor FROM solicitudes u  GROUP BY u.asesor) AS s LEFT JOIN contactos c ON c.id=s.asesor
                    WHERE solicitudes.id = " . $id . " AND s.asesor = solicitudes.asesor";

                if(toba::db()->sentencia($sql)){                  //Uso este metodo porque devuelve consistentemente la cantidad de filas modificadas tanto en Windows como Linux.
                     toba::notificacion()->agregar('Solicitud: '.$id_solicitud.'. El proceso ha sido actualizado', 'inf');
                }

               $sql = "UPDATE solicitudes SET firma_lider=c.firma FROM contactos c WHERE solicitudes.id = " . $id . " AND solicitudes.lider = c.id";
               toba::db()->ejecutar($sql);

               toba::db()->cerrar_transaccion();  //Aqui se hace el commit
    }catch($e toba_error_db) {
           toba::db()->abortar_transaccion();
           throw $e;
    }
}

Mas alla de esto, seguimos en contacto por el tema de las notificaciones.

Saludos

Gracias Richard. Tenia un poco abandonado este proyecto. Ahora lo estoy retomando. revisaré tus observaciones y te cuento como me va.

Saludos,

Jaime

Buenisimo… dale… seguimos en contacto

Saludos