• Publicidad

Tabla dinámica HTML

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

Re: Tabla dinámica HTML

Notapor explorer » 2016-01-25 16:59 @749

Sí, sí que se entiende.

En realidad te puedes ahorrar la primera consulta para saber el espacio que necesitas reservar.

Perl incrementa de forma automática el tamaño de los array a medida que vamos metiendo elementos (con push() o unshift()).

Entonces, una forma sencilla de hacerlo sería:
  • vamos leyendo registro por registro
  • según el tipo de registro, lo metemos con push() en un array distinto (suponemos que trabajamos con pocas columnas)
  • al final, con scalar(@array) puedes saber el "tamaño" de @array, y de ahí deduces el mayor, y de ahí, lo puedes rellenar con valores nulos.
  • presentación

Hay otras formas... Con módulos como Text::Table se puede trabajar con datos en forma de tablas.

Mis soluciones propuestas intentan hacer la salida de forma inmediata, es decir, sacar la información en cuanto sea posible, sin esperar a leer toda la información a memoria.
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

Publicidad

Re: Tabla dinámica HTML

Notapor gonzalos » 2016-02-15 08:19 @388

Hola a todos.

Vamos con lo que tengo hecho, existe algún error, ya que al intentar usar la función
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. scalar(@arrayI)
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
obtengo una ristra de unos, y no el valor del número de líneas tal como cabría esperar. He estado mirando y no veo cómo puedo solucionar el fallo. El código que tengo hecho hasta ahora es el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. ## Conectarse a la base de datos
  2. $dbh = DBI->connect( "DBI:mysql:$dbname;host=$dbhost", $dbuser, $dbpwd )
  3.     or die "Error de conexion: $DBI::errstr";
  4.  
  5. ## Leer los registros de la tabla
  6.  
  7. $sth = $dbh->prepare("select miembro, nombre, apellido1, apellido2 from miembros");
  8. $sth->execute();
  9.  
  10. while ( my @data = $sth->fetchrow_array() ) {
  11.  
  12.     my $tipo = $data[0] -= 2;
  13.     my $nombre = $data[1] . "" . $data[2] . "" . $data[3];
  14.  
  15.     if ( $tipo == 0 ) {
  16.         push @{ $arrayM[$tipo] }, $nombre;
  17.     }
  18.     elsif ( $tipo == 1 ) {
  19.         push @{ $arrayM[$tipo] }, $nombre;
  20.     }
  21.     else {
  22.     }
  23.  
  24.     @arrayI = shift @{ $arrayM[0] };
  25.     @arrayC = shift @{ $arrayM[1] };
  26.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Alguna idea de cómo hacer que la función scalar() funcione?

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-02-15 18:48 @825

Con
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @arrayI = shift @{ $arrayM[0] };
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

estás extrayendo el primer elemento del array apuntado por $arrayM[0], y lo que contiene $arrayM[0] es una ref. a un array donde se guardan los elementos leídos del tipo 2.

Lo que no entiendo es porqué luego asignas ese elemento al array @arrayI.

¿Qué es lo que quieres hacer? ¿Puedes describir el procedimiento que quieres seguir?
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-02-16 03:30 @188

Hola, explorer.

Eso viene de un mensaje anterior que entendí mal, y en el que me indicabas que guardara los datos del array en uno diferente y luego usara la función scalar(), para determinar cuál era mayor y así de esta manera asignar los espacios vacíos, allí donde se necesitaran.

Lo que quiero es, que una vez leídos y discriminados los datos de acuerdo a su tipo, determinar qué columna tiene mayor número de valores, para rellenar con espacios vacíos aquella que tenga menor número de datos.

Hasta igualar el número de celdas de las dos columnas.

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-02-18 16:37 @734

Si usas

push @{ $arrayM[$tipo] },... ;

para guardar en la columna $tipo, entonces puedes saber el número de elementos con

scalar( @{ $arrayM[$tipo] } );

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$ perl -E 'push @{$array[1]}, 42; say scalar @{$array[1]}; say $array[1][0]'
1
42
 
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 » 2016-02-19 09:51 @452

Hola, explorer.

Ya había probado a hacerlo de esa forma

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  print scalar (@{$arrayM[0]})
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y obtengo una cosa, bastante reducida pero, tal que así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
111111333333666666666666666666777777778888888888888
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


No sé si es debido a que la versión de Perl que uso es la 5.14.2 del 2011. O es que algo estoy haciendo mal y que no alcanzo a comprender.

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-02-19 15:08 @672

Suena a que tienes metida la llamada a scalar() dentro del bucle de lectura de las filas.

¿No deberías llamarlo al final de la lectura? Me temo que no tienes claro los pasos que debes hacer para resolver el problema...

Te aconsejo que uses lápiz y papel hasta que consigas resolverlo de forma teórica (o sea, lápiz, papel y goma de borrar), y luego lo pasas a Perl. A lo mejor solo tienes que mover unas pocas líneas de sitio, pero debes saber qué líneas son.
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-02-23 03:20 @181

Hola, explorer.

Gracias, tenías razón, se me había perdido un paréntesis de la vista y eso hacía que tuviera la llamada a la función dentro del bucle de lectura.

Seguimos hacia delante con el reto.

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

Re: Tabla dinámica HTML

Notapor gonzalos » 2016-02-25 09:35 @441

Hola a todos.

Después de darle algunas vueltas he encontrado una solución temporal:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!"C:\xampp\perl\bin\perl.exe"
  2. use CGI qw<:standard *table>;
  3.  
  4. use strict;
  5. use warnings;
  6. use DBI;
  7. use Data::Dumper;
  8.  
  9.  
  10. my @tipo;
  11. my @arrayM;
  12. my $colaboradores;
  13. my $total;
  14. my $i;  
  15. my $dbname = 'bd_ui_grupos_investigacion_2014';
  16. my $dbhost = '127.0.0.1';
  17. my $dbuser = 'root';
  18. my $dbpwd = 'gonzalo';  
  19. my ($sentencia, $dbh,$sth,$rv, $resultado,$r_row);
  20.    
  21.    
  22. #pintar cabecera tabla
  23.   print header;
  24.   print start_html(
  25.         -title      => 'Miembros',
  26.         -encoding   => 'utf-8',
  27.         -border => '2px',
  28.     );
  29.      
  30.    print start_table({-border=>'1', -align=>'center'});
  31.      
  32.    print Tr(th(['Miembro principal', 'Miembro ayudante']));
  33.      
  34.      
  35.  
  36. ## Conectarse a la base de datos
  37.    $dbh = DBI->connect("DBI:mysql:$dbname;host=$dbhost", $dbuser, $dbpwd)
  38.                      or die "Error de conexion: $DBI::errstr";
  39.                      
  40. # Leemos sus miembros constituyentes
  41.    $sentencia = "SELECT  miembro,nombre,apellido1,apellido2
  42.                 FROM miembros";
  43.  
  44.   $rv = $dbh->prepare($sentencia);
  45.   $resultado=$rv->execute;  # Chequear el resultado
  46.        
  47.  
  48.                
  49.   if ($resultado>0){
  50.      
  51.      $r_row=$rv->fetchall_arrayref();
  52.        
  53.          foreach my $dato (@$r_row){
  54.          
  55.              my $tipo=$dato->[0]-=2;
  56.              my $nombre=$dato->[1]." ".$dato->[2]." ".$dato->[3];  
  57.              
  58.                     if ($tipo==0){
  59.                         push @{$arrayM[$tipo]},$nombre;
  60.                     }elsif ($tipo==1){
  61.                         push @{$arrayM[$tipo]},$nombre;
  62.                     }else{
  63.          
  64.                     }        
  65.         }
  66.   }
  67.  
  68. ## Desconectarse de la base de datos
  69.  
  70.   if (! $dbh->disconnect) {
  71.      warn "Error al desconectarse de la base de datos: $DBI::errstr";
  72.  }    
  73.  
  74.  
  75.  # Asignar miembros y colaboradores
  76.  
  77.   if ($tipo==1){
  78.      
  79.        $colaboradores=@{$arrayM[1]};  
  80.   }else{
  81.       $colaboradores=undef;
  82.   }
  83.     my $miembros=@{$arrayM[0]};
  84.  
  85.  
  86. # Determinar la variable con mayor número de datos
  87.  
  88.   if ($miembros > $colaboradores){
  89.      
  90.       $total=$miembros;
  91.   }else{
  92.       $total=$colaboradores;
  93.   }
  94.   for ($i=0; $i<=$total; $i++){
  95.    
  96.     print "<tr>";
  97.     if ( @{$arrayM[0]} or @{$arrayM[1]}){
  98.      
  99.       my $columna1=shift @{$arrayM[0]};
  100.       my $columna2=shift @{$arrayM[1]
  101.       print "<td>$columna1</td><td>$columna2</td>";
  102.    
  103.     }else{  
  104.     }
  105.    print "</tr>";
  106.  }
  107.    
  108.   print end_table;
  109.   print end_html;
  110.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


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-02-26 15:17 @678

Hay una serie de problemas, o curiosidades...

  • en las líneas 10 a 19 declaras las variables @tipo y $sth, pero luego no las usas (o sea, que sobran)
  • en la línea 27, dudo que exista un atributo 'border' para toda la página HTML, pero, podría ser
  • ¿no te has dado cuenta de que las líneas 58 a 64 se reducen a solo la línea 59? ;)
  • en la línea 77 haces referencia a la variable 77, pero nunca ha sido declarada ni inicializada, así que seguro que strict y warnings te estará sacando unos bonitos mensajes de error
  • en el for de la línea 94, $i está recorriendo los valores entre 0 y $total... con lo que entonces estamos dando $total+1 vueltas... Hummm... a mi me sobra una :D
  • falta una llave de cierre al final de la línea 100
  • si estás importando las funciones de generación de marcas HTML con la ayuda del módulo CGI, es un poco no usarlas en las líneas 96, 101 y 105

Esta es mi versión (no probada, claro). Si ves algo que no entiendas, por favor, pregunta.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!C:\xampp\perl\bin\perl.exe
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. use DBI;
  7. use CGI qw<:standard>;
  8.  
  9. ## Acceso a la base de datos
  10. my $dbname = 'bd_ui_grupos_investigacion_2014';
  11. my $dbhost = '127.0.0.1';
  12. my $dbuser = 'root';
  13. my $dbpwd  = 'gonzalo';
  14.  
  15.  
  16. ## Conectarse a la base de datos
  17. my $dbh
  18.     = DBI->connect("DBI:mysql:$dbname;host=$dbhost", $dbuser, $dbpwd)
  19.     or die "Error de conexion: $DBI::errstr";
  20.  
  21. # Leemos sus miembros constituyentes
  22. my $sentencia
  23.     = "
  24.         SELECT
  25.             miembro,nombre,apellido1,apellido2
  26.         FROM
  27.             miembros
  28.    ";
  29.  
  30. my $rv = $dbh->prepare($sentencia);
  31. my $resultado = $rv->execute();
  32.  
  33. my @personas;
  34.  
  35. if ($resultado > 0) {
  36.     my $rows_ref = $rv->fetchall_arrayref();
  37.  
  38.     for my $row_ref (@$rows_ref) {
  39.         my $tipo   = $row_ref->[0];
  40.         my $nombre = join ' ', @{$row_ref}[1..3];
  41.  
  42.         push @{ $personas[$tipo - 2] }, $nombre;
  43.     }
  44. }
  45.        
  46. ## Desconectarse de la base de datos
  47. if (! $dbh->disconnect) {
  48.     warn "Error al desconectarse de la base de datos: $DBI::errstr";
  49. }
  50.  
  51. ## Cálculo del valor de la columna más alta
  52. my $total = @{$personas[0]} > @{$personas[1]}           # nos quedamos con el mayor resultado
  53.           ? @{$personas[0]} : @{$personas[1]}
  54.           ;
  55.  
  56. ## Líneas de la tabla
  57. my $tabla = Tr(th(['Miembro principal', 'Miembro ayudante'])) . "\n";
  58.  
  59. for my $i (0 .. $total-1) {
  60.  
  61.     my $miembro     = shift @{ $personas[0] };
  62.     my $colaborador = shift @{ $personas[1] };
  63.  
  64.     $miembro     = 'null' if not defined $miembro;      # los shift() devuelven 'undef' si no hay más datos
  65.     $colaborador = 'null' if not defined $colaborador;
  66.  
  67.     $tabla .= Tr(td([ $miembro, $colaborador])) . "\n";
  68. }
  69.  
  70. ## Tabla
  71. $tabla = table({-border => '1', -align => 'center'}, "\n" . $tabla) . "\n";
  72.  
  73. ## Salida
  74. print
  75.     header(),
  76.     start_html(
  77.         -title      => 'Miembros',
  78.         -encoding   => 'utf-8',
  79.     ),
  80.     $tabla,
  81.     end_html()
  82.     ;
Coloreado en 0.002 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

AnteriorSiguiente

Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado