• Publicidad

Tabla dinámica HTML

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

Tabla dinámica HTML

Notapor gonzalos » 2015-07-30 06:09 @298

Hola a todos.

Después de algún tiempo vuelvo con Perl, porque tengo que modificar un algoritmo que se hizo en su momento. Os cuento:

Tengo una base de datos con unos nombres y la pertenencia a un tipo, de la siguiente forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. Miembro Nombre     Apellido     Apellido
  2. 2       Pedro      Rodríguez    Rodríguez
  3. 3       Sebastián  Sánchez      Pérez
  4. 3       Juan       Martín       Méndez
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Y como resultado final necesito que me presente una tabla HTML con la siguiente estructura:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. Miembro principal                       Miembro ayudante
  2. Pedro Rodríguez Rodríguez               Sebastián Sánchez Pérez
  3.                                         Juan Martín Méndez
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

en la que vaya capturando los datos de la base de datos y dinámicamente vaya pintando los datos en una celda u otra de la tabla. La conexión a la base está hecha al principio del programa.

Principalmente estoy atascado en ordenar los datos según el tipo de miembro y en pintarlo en HTML.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub lee_miembros_en_la_BBDD() {
  2.  
  3.     my $sentencia, $rv, $resultado, $r_row, @row;
  4.     @miembros_nombre         = ();
  5.     @miembros_apellido1      = ();
  6.     @miembros_apellido2      = ();
  7.     @colaboradores_nombre    = ();
  8.     @colaboradores_apellido1 = ();
  9.     @colaboradores_apellido2 = ();
  10.     $miembros_num            = 0;
  11.  
  12.     # Leemos sus miembros constituyentes
  13.     $sentencia = "SELECT  miembro,nombre,apellido1,apellido2 FROM miembros WHERE grupo='$CodGrupo' ORDER BY orden";
  14.     $rv        = $dbh->prepare($sentencia);
  15.     $resultado = $rv->execute;                # Chequear el resultado
  16.     if ( $resultado > 0 ) {
  17.  
  18.         # Existen miembros en el grupo
  19.         $r_row = $rv->fetchall_arrayref;
  20.         $rv->finish;
  21.         for ( $i = 0 ; $i < $resultado ; $i++ ) {
  22.             $miembros_num += 1;
  23.  
  24.             if ( $r_row->[$i][0] eq '2' ) {
  25.  
  26.                 # pinta datos en tabla de los miembros principales
  27.             }
  28.             if ( @r_row->[$i][1] eq '3' ) {
  29.  
  30.                 # pinta datos en la tabla de los miembros ayudantes
  31.             }
  32.  
  33.         }
  34.     }
  35. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿Alguna sugerencia?

Un saludo.
Gonzalo
gonzalos
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2009-11-27 05:47 @283

Publicidad

Re: Tabla dinámica HTML

Notapor explorer » 2015-07-31 02:43 @155

Podrías usar dos variables escalares que vayan almacenando el código HTML de cada una de las celdas, según el código sea '2' o '3'.

if ( $r_row->[$i][0] eq '2' ) { $celda1 .= $r_row->[$i][1] . "\n"; }

Después del bucle, creas la tabla con el contenido de esas dos variables:

$tabla = "<table>\n<tr><td>$celda1</td><td>$celda2</td></tr></table>";
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

Re: Tabla dinámica HTML

Notapor gonzalos » 2015-08-03 04:17 @220

Hola, explorer.

Muchas gracias, voy a probar a ver si sale.

Un saludo,
Gonzalo
gonzalos
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2009-11-27 05:47 @283

Re: Tabla dinámica HTML

Notapor gonzalos » 2015-08-05 04:17 @220

Hola a todos.

Al final no me funciona, le he dado muchas vueltas, y el problema que tengo es que el código me genera filas sin datos. Es decir, si tengo 15 filas, 8 con el valor 2 para miembro y 7 con el valor 3 para miembro. El algoritmo me genera 15 filas en vez de 8 que sería el número máximo de ítem que tengo para un valor.

Y no se me ocurre cómo modificar el código para que sólo imprima el número máximo de celdas en cada momento, para cada grupo de valores.

No sé si me he explicado.

Un saludo,
Gonzalo
gonzalos
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2009-11-27 05:47 @283

Re: Tabla dinámica HTML

Notapor explorer » 2015-08-05 05:41 @278

Se trata solo de encontrar la prueba lógica.

Yo he hecho la siguiente prueba.

Con este archivo de entrada (como si fuera la base de datos):
Sintáxis: (archivo1.txt) [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
2       Pedro      Rodríguez    Rodríguez
3       Sebastián  Sánchez      Pérez
3       Juan       Martín       Méndez
2       Joaquin    Rulez        Cambió
3       Antonio    Push         Landró
3       Luisa      Nieves       Carro
2       María      Castro       Romero
3       Casiano    López        López
3       Mario      Vaquerizo    Sustre
3       Felipe     Cristo       Segundo
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
y con el siguiente programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use CGI qw<:standard *table>;
  3. use feature 'say';
  4. use autodie;
  5.  
  6. say start_html(
  7.     -title      => 'Miembros',
  8.     -encoding   => 'utf-8',
  9. );
  10.  
  11. say start_table();
  12.  
  13. say Tr(th(['Miembro principal', 'Miembro ayudante']));
  14.  
  15. my @fila;
  16.  
  17. open my $DB, '<', 'archivo1.txt';
  18. while (<$DB>) {
  19.     chomp;
  20.  
  21.     # Miembro Nombre     Apellido     Apellido
  22.     my($miembro, $nombre, $apellido1, $apellido2) = split;
  23.  
  24.     my $posicion = $miembro - 2;                # posición dentro de la fila
  25.    
  26.     if ($miembro == 2 or $fila[ $posicion ]) {  # si es '2' o si '3' ya está ocupada,
  27.  
  28.         say Tr(td(\@fila)) if @fila;            # lo pintamos
  29.            
  30.         @fila = ();                             # puesta a cero
  31.     }
  32.  
  33.     $fila[ $posicion ] = join " ", $nombre, $apellido1, $apellido2;
  34. }
  35.  
  36. close $DB;
  37.  
  38. # pintar la última
  39. say Tr(td(\@fila));
  40.  
  41. say end_table();
  42. say end_html();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
la salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <!DOCTYPE html
  2.         PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  3.          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
  5. <head>
  6. <title>Miembros</title>
  7. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  8. </head>
  9. <body>
  10.  
  11. <table>
  12. <tr><th>Miembro principal</th> <th>Miembro ayudante</th></tr>
  13. <tr><td>Pedro Rodríguez Rodríguez</td> <td>Sebastián Sánchez Pérez</td></tr>
  14. <tr><td></td> <td>Juan Martín Méndez</td></tr>
  15. <tr><td>Joaquin Rulez Cambió</td> <td>Antonio Push Landró</td></tr>
  16. <tr><td></td> <td>Luisa Nieves Carro</td></tr>
  17. <tr><td>María Castro Romero</td> <td>Casiano López López</td></tr>
  18. <tr><td></td> <td>Mario Vaquerizo Sustre</td></tr>
  19. <tr><td></td> <td>Felipe Cristo Segundo</td></tr>
  20. </table>
  21.  
  22. </body>
  23. </html>
  24.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
que, más o menos, sale así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Miembro principal               Miembro ayudante
Pedro Rodríguez Rodríguez     Sebastián Sánchez Pérez
                                Juan Martín Méndez
Joaquin Rulez Cambió           Antonio Push Landró
                                Luisa Nieves Carro
María Castro Romero            Casiano López López
                                Mario Vaquerizo Sustre
                                Felipe Cristo Segundo
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
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

Re: Tabla dinámica HTML

Notapor gonzalos » 2015-12-23 06:58 @332

Hola a todos.

Después de muchos meses vuelvo a la carga.

Perfecto, pero hay una línea del código que no entiendo que hace y es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  my $posicion = $miembro - 2;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

No comprendo cómo "calcula" la posición dentro de la fila, es decir, el
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
-2
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
. ¿A qué hace referencia?

Un saludo,
Gonzalo
gonzalos
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2009-11-27 05:47 @283

Re: Tabla dinámica HTML

Notapor explorer » 2015-12-25 05:09 @256

La primera columna de los datos, según el formato que nos has presentado, puede ser un 2 o un 3, e indica la posición del miembro en la fila (está en la primera columna o la segunda.

Entonces, la línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     my $posicion = $miembro - 2;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
lo que hace es convertir el valor de $miembro (2 o 3) a un valor para $posicion (0 o 1).

Quizás hubiera sido más claro usar la palabra $columna, en lugar de $posicion.

Luego, la línea siguiente se hace la pregunta ¿el $miembro es un 2 o ya existe una persona en la columna donde tenemos que pintar? Es decir: ¿tenemos la certeza de que tenemos que pintar un nombre en la primera columna o, de cualquier forma, la columna donde vamos a pintar el nombre ya está ocupada por otro nombre? Si ese es el caso, es que ese nombre debe ir en una nueva fila.

Para ello creamos una nueva fila de tabla, pintamos los nombres de la @fila -recolectados antes-, y ponemos la @fila a cero. Y luego, en la línea 33 guardamos -en su $posicion- el nuevo nombre.

Es resumen:
- si nos viene un miembro de tipo 2, siempre creamos una nueva fila de tabla y lo ponemos en la primera columna
- si nos viene un miembro de tipo 3, lo ponemos en la segunda columna, salvo que ya lo hayamos hecho antes con un miembro anterior, en cuyo caso, antes creamos una nueva fila de tabla.

Es prácticamente igual a resolverlo con lápiz y papel ;) salvo que aquí usamos @fila para guardar temporalmente los nombres, y luego sacarlos todos a la vez, por filas, cuando sabemos que el siguiente nombre debe aparecer en la siguiente.
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

Re: Tabla dinámica HTML

Notapor gonzalos » 2016-01-22 06:34 @315

Gracias por la respuesta. Ya está solucionado.

Ahora, por mera curiosidad, me gustaría hacerlo de otra manera. Ya tengo diferenciado en la base de datos los distintos tipos de miembros. Y me gustaría determinar para cada grupo de miembros, qué tipo es el que tiene mayor número de ítems y a partir de ese valor generar el número de filas de la tabla, para poder introducirlo. Por ejemplo,
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
2       Pedro      Rodríguez    Rodríguez
3       Sebastián  Sánchez      Pérez
3       Juan       Martín       Méndez
2       Joaquin    Rulez        Cambió
3       Antonio    Push         Landró
3       Luisa      Nieves       Carro
2       María      Castro       Romero
3       Casiano    López        López
3       Mario      Vaquerizo    Sustre
3       Felipe     Cristo       Segundo
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Para obtener lo siguiente
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
2       Pedro      Rodríguez    Rodríguez  3       Sebastián  Sánchez      Pérez
2       Joaquin    Rulez        Cambió     3       Juan       Martín       Méndez
2       María      Castro       Romero     3       Antonio    Push         Landró
         null      null         null       3       Luisa      Nieves       Carro
         null      null         null       3       Casiano    López        López
         null      null         null       3       Mario      Vaquerizo    Sustre
         null      null         null       3       Felipe     Cristo       Segundo
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Lo primero que pensaba hacer era determinar el número de valores de cada tipo que tengo. Eso ya lo he hecho con una consulta SQL. Mi siguiente idea era asignar esa consulta a un hash, para poder comparar los dos valores e imprimir en número de filas (vacías) del que tenga mayor número de ítems y luego pintar el resultado.

Con la consulta SQL obtengo los siguientes datos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Miembro tipo   Número

2               3
3               7
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

pero no logro dar con la solución para asignar el resultado de la consulta a un hash. ¿Alguna idea?

Un saludo,
Gonzalo
gonzalos
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2009-11-27 05:47 @283

Re: Tabla dinámica HTML

Notapor explorer » 2016-01-22 20:19 @888

Con el siguiente programa
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.18.2;
  3. use autodie;
  4. use open IO => qw':utf8 :std';                  # entradas y salidas en utf8
  5.  
  6. # @columnas = (
  7. #       [ <filas de la primera columna> ],
  8. #       [ <filas de la segunda columna> ],
  9. # );
  10. my @columnas = ([],[]);
  11.  
  12. my $formato = ("%-43s" x 2) . "\n";
  13.  
  14. open my $DATOS, '<', 'code_39191.txt';
  15.  
  16. while (my $linea = <$DATOS>) {
  17.  
  18.     # fase de guardado
  19.     chomp $linea;
  20.  
  21.     my($tipo) = $linea =~ /^ (\d+) /x;          # primera columna
  22.  
  23.     push @{$columnas[$tipo-2]}, $linea;         # guardar $linea en la columna correspondiente
  24.    
  25.    
  26.     # fase de presentación
  27.     # si tenemos elementos en ambas columnas...
  28.     if (@{$columnas[0]} and @{$columnas[1]}) {
  29.  
  30.         # sacamos ambos valores
  31.         my $columna1 = shift @{$columnas[0]};
  32.         my $columna2 = shift @{$columnas[1]};
  33.        
  34.         printf $formato, $columna1, $columna2;
  35.     }
  36. }
  37.  
  38. close $DATOS;
  39.  
  40.  
  41. # pintar el resto
  42. my $sindato = '         null      null         null';
  43.  
  44. # mientras quede alguna columna con datos
  45. while (@{$columnas[0]} or @{$columnas[1]}) {
  46.  
  47.     # sacamos dato de cada columna, o la rellenamos con $sindato
  48.     my $columna1 = @{$columnas[0]}
  49.                  ? shift(@{$columnas[0]})
  50.                  : $sindato
  51.                  ;
  52.  
  53.     my $columna2 = @{$columnas[1]}
  54.                  ? shift(@{$columnas[1]})
  55.                  : $sindato
  56.                  ;
  57.  
  58.     printf $formato, $columna1, $columna2;
  59. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
se obtiene la salida deseada. Pero falta información, como por ejemplo el ancho de todas las columnas. Por eso, $sindato está puesta tal cual se pide a la salida, sin calcular cuántos campos y de qué ancho son.

Y para vuestro problema con el hash, habría primero que saber qué información queréis guardar en él y cómo. La consulta SQL da unos valores, que son las dimensiones que necesita vuestra tabla de datos: dos columnas y siete filas (digo siete porque hay que sacar el máximo de la columna Número de esa consulta). A partir de ahí podrías poblar la tabla de datos y luego pintarla.
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

Re: Tabla dinámica HTML

Notapor gonzalos » 2016-01-25 04:32 @230

Hola, explorer.

¡¡¡Muchas gracias!!! Disculpa por la pésima explicación.

Te amplío la información, la consulta SQL, obtiene el número de filas que se le asignaría a cada tipo de dato, con la siguiente solicitud: select miembro, count(*) as num from miembros group by miembro order by count(*) desc;

Con lo que obtengo para cada ocasión cuántos datos hay para el tipo 2 y cuántos para el tipo 3.
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
tipo            numero
2               3
3               7
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

En el caso de arriba serían 3 filas para el tipo 2 y 7 filas para el tipo 3.

La información que querría guardar en el hash serían los valores para cada tipo en cada momento para luego compararlos. Es decir, para un momento, el tipo 2 serían 3 filas y para el tipo 3, 7 filas. Entonces comparo el hash y digo, como 7 es mayor que 5, pinto 7 filas y las lleno los los nombres y apellidos de los individuos, para los dos tipos. Y el que tenga menor número de filas lo completo con celdas vacías.

Un ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
               Nombre                                           Nombre    
      Pedro      Rodríguez  Rodríguez           Sebastián  Sánchez      Pérez
      Joaquin    Rulez        Cambió            Juan       Martín       Méndez
      María      Castro       Romero            Antonio    Push         Landró
       null      null         null              Luisa      Nieves       Carro
       null      null         null              Casiano    López        López
       null      null         null              Mario      Vaquerizo    Sustre
       null      null         null              Felipe     Cristo       Segundo
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

En otra ocasión los datos podrían ser 5 filas para el tipo 2 y 2 filas para el tipo 3. Entonces compararíamos: como 5 es mayor que 2, se pintan 5 filas y se llenan todos los datos del tipo 2 y los tres datos del tipo 3, y los demás hasta completar los 5 datos con valores nulos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
                 nombre                                  nombre
      Manuel     Rodríguez    Pérez             Ofelia     Cabeza       Rubio
      Antonio    Piedrahita   Cambió            María      Santa        Pérez
      Ana        Tejas        Verdes             null      null         null
      Pedro      Medio        Antúnez            null      null         null
      Sancho     Panza        Panza              null      null         null
       
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


No sé si me he liado mucho, y se entiende bien. O existe una forma más simple de hacerlo.

Un saludo y gracias,
Gonzalo
gonzalos
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2009-11-27 05:47 @283

Siguiente

Volver a Web

¿Quién está conectado?

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