• Publicidad

Generador de estadísticas

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Generador de estadísticas

Notapor reLlene » 2012-10-05 11:48 @533

Tengo el propósito de levantar un script donde un usuario pueda consultar vía web un gráfico estadístico respecto de la cantidad de reclamos que se hicieron entre un periodo (en base a una fecha inicio y otra fin)
Imagen

y obtener algo como esto:
Imagen

Y lo que tengo es lo siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -wT
  2. #estadisticas.pl
  3.  
  4. use strict;
  5. use CGI qw/:standard/;
  6. # en caso de errores
  7. use CGI::Carp qw/fatalsToBrowser/;
  8. # hacemos uso de plantillas
  9. use HTML::Template;
  10.  
  11.         # nuevo obj de tipo cgi
  12.         my $cgi = CGI->new;
  13.         #variable para el uso de un template u otro...
  14.         my $template;
  15.  
  16.         # imprimo encabezado
  17.         print $cgi->header;
  18.         print $cgi->start_html('Estadisticas de Reclamos');
  19.  
  20.         if($cgi->param('Dia0') && $cgi->param('Mes0') && $cgi->param('Anio0') &&
  21.                 $cgi->param('Dia1') && $cgi->param('Mes1') && $cgi->param('Anio1'))
  22.         {
  23.                 $template = 'estadisticas_porcentuales2';
  24.         }else
  25.         {
  26.                 $template = 'estadisticas_porcentuales';
  27.         }      
  28.         my $t = HTML::Template->new(filename => "/home/reLlene/tmpls/$template.tmpl", associate =>      + $cgi);
  29.         print $t->output;
  30.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Si no tengo parámetros, muestro la siguiente plantilla estadisticas_porcentuales.tmpl:
Sintáxis: (estadisticas_porcentuales.tmpl) [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <body background="/bg-body.jpg" style="background-repeat:no-repeat">
  2.  
  3.         <form ACTION = "estadisticas_porcentuales.pl" method = "POST">
  4.         <center>
  5.                 <img src="http://172.17.0.220/images/logo-sioncom.png">
  6.         <h1>Estadisticas de Llamadas Entrantes por Sector</h1>
  7.         <p>Seleccione el rango de fechas para calcular las estadisticas:
  8.         <br>
  9.                 <input TYPE=checkbox checked NAME="DesdeFecha"> Desde la fecha :
  10.                 <input SIZE=2 NAME="Dia0" VALUE="5">
  11.         <select NAME="Mes0">
  12.                 <option VALUE="1" > ENE (1)
  13.                 <option VALUE="2" > FEB (2)
  14.                 <option VALUE="3" > MAR (3)
  15.                 <option VALUE="4" > ABR (4)
  16.                 <option VALUE="5" > MAY (5)
  17.                 <option VALUE="6" > JUN (6)
  18.                 <option VALUE="7" > JUL (7)
  19.                 <option VALUE="8" > AGO (8)
  20.                 <option VALUE="9" > SEP (9)
  21.                 <option selected VALUE="10" > OCT (10)
  22.                 <option VALUE="11" > NOV (11)
  23.                 <option VALUE="12" > DIC (12)
  24.         </select>
  25.         <select NAME="Anio0">
  26.                 <option VALUE="2004" > 2004  
  27.                 <option VALUE="2005" > 2005  
  28.                 <option VALUE="2006" > 2006  
  29.                 <option VALUE="2007" > 2007  
  30.                 <option VALUE="2008" > 2008  
  31.                 <option VALUE="2009" > 2009  
  32.                 <option VALUE="2010" > 2010  
  33.                 <option VALUE="2011" > 2011  
  34.                 <option selected VALUE="2012" > 2012  
  35.                 <option VALUE="2013" > 2013  
  36.                 <option VALUE="2014" > 2014  
  37.                 <option VALUE="2015" > 2015  
  38.                 <option VALUE="2016" > 2016  
  39.                 <option VALUE="2017" > 2017  
  40.         </select>
  41.         <br><br>
  42.                 <input TYPE=CHECKBOX CHECKED NAME="HastaFecha"> Hasta la fecha :
  43.                 <input SIZE=2 NAME="Dia1" VALUE="5">
  44.         <select NAME="Mes1">
  45.                 <option VALUE="1" > ENE (1)
  46.                 <option VALUE="2" > FEB (2)
  47.                 <option VALUE="3" > MAR (3)
  48.                 <option VALUE="4" > ABR (4)
  49.                 <option VALUE="5" > MAY (5)
  50.                 <option VALUE="6" > JUN (6)
  51.                 <option VALUE="7" > JUL (7)
  52.                 <option VALUE="8" > AGO (8)
  53.                 <option VALUE="9" > SEP (9)
  54.                 <option selected VALUE="10" > OCT (10)
  55.                 <option VALUE="11" > NOV (11)
  56.                 <option VALUE="12" > DIC (12)
  57.         </select>
  58.         <select NAME="Anio1">
  59.                 <option VALUE="2004" > 2004  
  60.                 <option VALUE="2005" > 2005  
  61.                 <option VALUE="2006" > 2006  
  62.                 <option VALUE="2007" > 2007  
  63.                 <option VALUE="2008" > 2008  
  64.                 <option VALUE="2009" > 2009  
  65.                 <option VALUE="2010" > 2010  
  66.                 <option VALUE="2011" > 2011  
  67.                 <option selected VALUE="2012" > 2012  
  68.                 <option VALUE="2013" > 2013  
  69.                 <option VALUE="2014" > 2014  
  70.                 <option VALUE="2015" > 2015  
  71.                 <option VALUE="2016" > 2016  
  72.                 <option VALUE="2017" > 2017  
  73.         </select>
  74.         <br><br>
  75.         <input TYPE=submit NAME=Action VALUE="Calcular Estadisticas">
  76. </center>
  77.  
  78. </form>
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


estadisticas_porcentuales2.tmpl:
Sintáxis: (estadisticas_porcentuales2.tmpl) [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <body background="/bg-body.jpg" style="background-repeat:no-repeat">
  2.         <form ACTION = "estadisticas_porcentuales2.pl" method = "POST">
  3.                 <center>
  4.                         <img src="http://172.17.0.220/images/logo-sioncom.png">
  5.                         <h1>
  6.                                 Estadisticas
  7.                 <br><p>
  8.                 <img src="http://localhost/cgi-bin/generador_grafico_circular.pl" alt="Estadisticas">
  9.         </form>
  10.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y con éste script (generador_grafico_circular) que es llamado desde estadisticas_porcentuales2.tmpl dónde solicito el gráfico (Content type: image/png).

NOTA: los parámetros los coloqué a mano simplemente a modo de mostrar un gráfico cualquiera donde se vea lo que quiero. La consulta a la DB aún no lo hice porque no sé desde dónde sería la mejor opción. Se me ocurre hacerla en éste pero los parámetros recibirlos de la primera plantilla, es decir, de estadisticas_porcentuales.tmpl, pero ¡¡¡NO SÉ CÓMO HACERLO!!! :?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -wT
  2.  
  3. use strict;
  4. use GD::Graph::pie;
  5.  
  6.         # Eje de abscisas
  7.         my @campos = ('Oct 2003','Nov 2003','Dec 2003','Ene 2004','Feb 2004');
  8.         # Eje de Ordenadas
  9.         my @valores = ('547','2282','2798','2354','4326');
  10.         # Array de array
  11.         my @graf = (\@campos, \@valores);
  12.         # establecemos aca que se trata de un Grafico Circular.
  13.         # new(ancho, alto)
  14.         my $grafico = GD::Graph::pie->new(600, 450);
  15.         # seteo features del grafico
  16.         $grafico->set(
  17.                                                 # rotulo el gráfico
  18.                                                 title => 'Estadisticas',
  19.                                                 ) or warn $grafico->error;
  20.  
  21.  
  22.         my $imagen = $grafico->plot(\@graf) or die $grafico->error;
  23.        
  24.         # hago impresión del contenido imagen
  25.         print "Content-type: image/png\n\n";
  26.         # imprimo el objeto imagen
  27.         print $imagen->png;
  28.         exit(1);
  29.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


He visto que puedo pasar parámetros con HTML::Template de la siguiente forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$t->param(NOMBRE => VALOR);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


pero vamos, parece que no me sirve porque lo que yo deseo es TOMAR parámetros, ¡¡¡no PASARLES un VALOR!!! :(

¡¡¡¡Cualquier sugerencia es bienvenida!!!! :roll:
Sexo : unzip ; strip ; touch ; grep ; finger ;mount ; fsck ; more ; yes ; umount ; sleep.
Avatar de Usuario
reLlene
Perlero nuevo
Perlero nuevo
 
Mensajes: 97
Registrado: 2012-06-04 07:16 @344

Publicidad

Re: Generador de estadísticas

Notapor explorer » 2012-10-05 19:18 @846

Hay varias soluciones...

A ver... partimos de un primer problema: recogida de datos.

Esto lo resolvemos con el primer programa: si no nos dan datos, presentamos la plantilla con todas las opciones, y terminamos.

Pero, ¿y si sí nos dan los datos? Pues que ya podemos hacer la consulta a la base de datos, generar el gráfico, rellenar la plantilla (que pueden ser una sola), y terminamos.

Bueno, ¿y cómo generamos el gráfico? Se trata de un proceso aparte al que le tenemos que dar una serie de parámetros para que lo genere. Esta es la solución que tienes ahora.

Pero... ¿y si metiéramos la generación del gráfico dentro del primer programa? Si acabamos de hacer la consulta a la base de datos, entonces tenemos toda la información para generar el gráfico. Pero... ¿y cómo lo mostramos o enlazamos desde la página web? Aquí hay un par de opciones...

La primera opción: guardamos el gráfico en disco, en un directorio conocido (/img/, por ejemplo), y le damos un nombre temporal. Ese nombre será lo que pongamos en la plantilla, en la parte de la imagen:

programa:
$t->param(IMAGEN => $nombre_imagen);

plantilla:
<img src="/img/<TMPL_VAR NAME=IMAGEN>" width="600" height="450" />

Esto tiene ventajas si sabemos que la información de la base de datos no va a cambiar (o no cambiará de forma frecuente): si creamos el nombre temporal de tal forma que siempre sea el mismo cuando el usuario hace la misma petición, entonces podemos preparar el programa para que no tenga que rehacer el mismo gráfico una y otra vez: se dará cuenta de que ya está generado y se saltará la parte de crearlo y guardarlo.

El inconveniente es que necesitamos un lugar para guardar el archivo, y el proceso de guardarlo a veces tarda mucho (comparado con otras operaciones, desde luego). Y que tenemos que borrar los gráficos, un día, pasado un tiempo o cuando caduque o cambie la información de la base de datos.

La segunda opción: enviar el gráfico en el mismo código HTML de la plantilla, lo que sería un gráfico incrustado.

programa:
use MIME::Base64;
$img = encode_base64($imagen_generada);
$t->param(IMAGEN => "data:img/png;base64,$img");


plantilla
<img src="<TMPL_VAR NAME=IMAGEN>" width="600" height="450" />

En este otro hilo, Cómo insertar imágenes GD con HTTP::Server::Simple está más detallado todo esto.


Si quieres seguir con la idea de los dos programas, entonces sigue el problema de cómo enviar información de uno a otro.

Una manera es usando la propia llamada de la generación del gráfico. En la segunda plantilla:

<img src="http://localhost/cgi-bin/generador_grafico_circular.pl?par=<TMPL_VAR NAME=PARAMETROS_IMAGEN>" alt="Estadísticas">

Y en el primer programa, le pasamos los valores:

$t->param(PARAMETROS_IMAGEN => "Oct 2003,Nov 2003,Dec 2003,Ene 2004,Feb 2004|547,2282,2798,2354,4326");

Con esto queda generada la página HTML. Cuando el navegador solicite la imagen, ejecutará el segundo programa, que habrá que modificar antes para que lea el parámetro par, y extraiga de él los campos y valores para generar el gráfico (fíjate que están separados por '|' y por ',', así que con un par de split(), resuelto).

Es obvio que la primera opción, la de tener un solo programa, es la más rápida.

Hay otra forma: persistencia. Consiste en guardar a disco una estructura con los datos necesarios para generar el gráfico. Y deben estar asociados con una sesión de usuario, para que cuando se ejecute el segundo programa, sepa qué gráfico debe generar según el usuario que está cargando la página.

Para hacer esto, se puede usar alguno de los módulos Cache (Cache::File, o el más moderno, Cache::FileCache).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados