• Publicidad

rowspan dinámico

Discute todo acerca de JavaScript así como DHTML o la tecnología AJAX.

rowspan dinámico

Notapor seafree » 2013-07-23 11:43 @530

Hola.

Traigo los registros de una query y lleno una tabla con ellos.

La query trae una serie de componentes (primera columna de la query) y asociado a ellos una lista de eventos, cada componente posee eventos varios, y estoy llenando una tabla con el resultado de la query, por cada registro que arroja dibujo un <TR> conteniendo varios <TD> de acuerdo a los números de columnas que estoy consultando.

Sin embargo hay varios eventos asociados a un $descrip_comp. Ya controlo el no repetir $descrip_comp cuando existen varios eventos de él, pero necesito aplicar el ROWSPAN de acuerdo a los eventos existentes de un $descrip_comp.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ( $reg = $sth->fetchrow_hashref() ) {
  2.     print "<tr>";
  3.     $descrip_comp = $reg->{'descrip_comp'};
  4.     $fecha_sale   = $reg->{'fecha_sale'};
  5.     $medidas      = $reg->{'medidas'};
  6.     $causa        = $reg->{'causa'};
  7.     $id_causa     = $reg->{'id_causa'};
  8.     print "<td>$count</td>";
  9.     if ( $descrip_aux ne $descrip_comp ) {
  10.         $descrip_aux = $descrip_comp;
  11.         print "<td>$descrip_comp</td>";
  12.     }
  13.     else {
  14.         print "<td></td>";
  15.     }
  16.     print "<td>$fecha_sale</td>";
  17.     print "<td>$medidas</td>";
  18.     print "<td>$id_causa</td>";
  19.     print "</tr>";
  20.     $count++;
  21. } #END WHILE ($reg_dcev = $sth->fetchrow_hashref)
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿Alguna idea para aplicar un ROWSPAN a la columna componente ($descrip_comp) de acuerdo al total de eventos existentes en cada uno de ellos?

Gracias.
Última edición por explorer el 2013-07-23 13:38 @610, editado 4 veces en total
Razón: Formateado de código con Perltidy y poner marcas Perl
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Publicidad

Re: rowspan dinámico

Notapor explorer » 2013-07-23 15:55 @705

Vale, la idea es que la segunda columna de la tabla debe reducir los casos iguales, por medio de un 'rowspan'.

La solución no es obvia (o es que yo me he liado al buscarla, seguro).

Lo primero que haría sería cambiar el bucle while() con el fetchrow_hashref(), por una sola llamada fetchall_arrayref() (o si es posible, selectall_arrayref()). Eso lo que hace es devolver toda la tabla de resultados, en forma de una referencia a un array, en que cada elemento es una referencia a una fila de los resultados.

Teniendo esa estructura bidimensional, podemos recorrerla verticalmente, para ver por dónde tenemos que recortar.

Llegados a una fila, en que tengamos algo en la columna 'descrip_comp', iniciamos una búsqueda hacia abajo, hasta ver dónde llega el 'rowspan'. En las filas intermedias, que coincidan con la primera, vamos "borrando" las celdas, para que así sepamos en las siguientes vueltas, que esas celdas no deben representarse.

He hecho un programa de prueba:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.10;
  3. use CGI qw':standard *table';
  4.  
  5. my $fetchall_arrayref = [
  6.     {
  7.         'descrip_comp'  => "Feature 1",
  8.         'fecha_sale'    => "20130723",
  9.         'medidas'       => "1.50x2.10x1.78",
  10.         'causa'         => "venta",
  11.         'id_causa'      => "id1",
  12.     },
  13.     {
  14.         'descrip_comp'  => "Feature 1",
  15.         'fecha_sale'    => "20130723",
  16.         'medidas'       => "1.50x2.10x1.78",
  17.         'causa'         => "venta",
  18.         'id_causa'      => "id2",
  19.     },
  20.     {
  21.         'descrip_comp'  => "Feature 1",
  22.         'fecha_sale'    => "20130723",
  23.         'medidas'       => "1.50x2.10x1.78",
  24.         'causa'         => "venta",
  25.         'id_causa'      => "id3",
  26.     },
  27.     {
  28.         'descrip_comp'  => "Feature 2",
  29.         'fecha_sale'    => "20130723",
  30.         'medidas'       => "1.50x2.10x1.78",
  31.         'causa'         => "venta",
  32.         'id_causa'      => "id4",
  33.     },
  34.     {
  35.         'descrip_comp'  => "Feature 3",
  36.         'fecha_sale'    => "20130723",
  37.         'medidas'       => "1.50x2.10x1.78",
  38.         'causa'         => "venta",
  39.         'id_causa'      => "id5",
  40.     },
  41.     {
  42.         'descrip_comp'  => "Feature 3",
  43.         'fecha_sale'    => "20130723",
  44.         'medidas'       => "1.50x2.10x1.78",
  45.         'causa'         => "venta",
  46.         'id_causa'      => "id6",
  47.     },
  48. ];
  49.  
  50. my $anterior_descrip = '';
  51. my $indice_primer_descrip;
  52.  
  53. say start_html;
  54. say start_table({-border => 3});
  55.  
  56. for my $i (0 .. $#$fetchall_arrayref) {
  57.  
  58.     my $rowspan = 1;
  59.  
  60.     my $reg = $fetchall_arrayref->[$i];
  61.  
  62.     my $descrip_comp = $reg->{'descrip_comp'};
  63.     my $fecha_sale   = $reg->{'fecha_sale'};
  64.     my $medidas      = $reg->{'medidas'};
  65.     my $causa        = $reg->{'causa'};
  66.     my $id_causa     = $reg->{'id_causa'};
  67.  
  68.     if ($descrip_comp) {                                # buscar campo diferente en el resto de líneas
  69.         my $j;
  70.         for($j = $i+1; $j <= $#$fetchall_arrayref; $j++) {                         # recorremos desde la siguiente línea, hasta el final
  71.             last if $fetchall_arrayref->[$j]->{'descrip_comp'} ne $descrip_comp;   # salimos si hemos encontrado una celda distinta
  72.             $fetchall_arrayref->[$j]->{'descrip_comp'} = '';                       # la celda es igual, así que la limpiamos
  73.         }
  74.         $rowspan = $j - $i;                                                        # tamaño del rowspan
  75.     }
  76.  
  77.     my $celda_descrip;
  78.     if ($rowspan == 1) {                                # puede que sea celda normal, o abreviada
  79.         if ($descrip_comp) {
  80.             $celda_descrip = td($descrip_comp);         # celda normal
  81.         }
  82.         else {
  83.             $celda_descrip = '';                        # abreviada: no hay celda
  84.         }
  85.     }
  86.     else {
  87.         $celda_descrip = td({-rowspan => $rowspan}, $descrip_comp);     # demás casos: rowspan
  88.     }
  89.  
  90.     ### creación de la línea de tabla
  91.     say Tr(td($i), $celda_descrip, td([ $fecha_sale, $medidas, $causa, $id_causa ]));
  92. }
  93.  
  94. say end_table;
  95. say end_html;
  96.  
  97. __END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
y da como resultado:
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>Untitled Document</title>
  7. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  8. </head>
  9. <body>
  10.  
  11. <table border="3">
  12. <tr><td>0</td> <td rowspan="3">Feature 1</td> <td>20130723</td> <td>1.50x2.10x1.78</td> <td>venta</td> <td>id1</td></tr>
  13. <tr><td>1</td>  <td>20130723</td> <td>1.50x2.10x1.78</td> <td>venta</td> <td>id2</td></tr>
  14. <tr><td>2</td>  <td>20130723</td> <td>1.50x2.10x1.78</td> <td>venta</td> <td>id3</td></tr>
  15. <tr><td>3</td> <td>Feature 2</td> <td>20130723</td> <td>1.50x2.10x1.78</td> <td>venta</td> <td>id4</td></tr>
  16. <tr><td>4</td> <td rowspan="2">Feature 3</td> <td>20130723</td> <td>1.50x2.10x1.78</td> <td>venta</td> <td>id5</td></tr>
  17. <tr><td>5</td>  <td>20130723</td> <td>1.50x2.10x1.78</td> <td>venta</td> <td>id6</td></tr>
  18. </table>
  19.  
  20. </body>
  21. </html>
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Y sale una bonita tabla, con los rowspan correctos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: rowspan dinámico

Notapor seafree » 2013-07-24 11:53 @537

Ok, explorer, gracias, pero teniendo presente que el fetchall_arrayref({}) lo debo de llenar de una consulta a la base de datos, entonces el ciclo de fetchall_arrayref({}) irá entonces en el ciclo while para asignar todos los registros asociados a la query al fetchall_arrayref({}).

Te agradeceré tu aclaración porque para mi debe de ir después de while($reg = $sth->fetchrow_hashref()) {, así obtengo los campos solicitados y con ello creo el fetchall_arrayref({}), ¿no es así?
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: rowspan dinámico

Notapor explorer » 2013-07-24 13:49 @617

No, no es así.

Tu lo que haces es:

prepare();
exec();
while($reg = $sth->fetchrow_hashref()) { ... }


mientras que con fetchall_arrayref, se hace así:

prepare();
exec();
my $fetchall_arrayref = $sth->fetchall_arrayref();


Como ves, todo el resultado se devuelve en una sola llamada. Obtenemos una estructura bidimensional, en la que podemos movernos, para saber dónde empiezan y acaban los rowspan.

P.D. Incluso, si la consulta (query) es relativamente sencilla, te puedes ahorrar el prepare(), el exec(), y el fetchall_arrayref(), cambiándolos por un simple selectall_arrayref($query). Ejemplo (sacado de la página de manual de DBI):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $array_ref = $dbh->selectall_arrayref(
  2.    "SELECT ename FROM emp ORDER BY ename",
  3.    { Slice => {} }
  4. );
  5. foreach my $emp ( @$array_ref ) {
  6.    print "Employee: $emp->{ename}\n";
  7. }
Coloreado en 0.001 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: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: rowspan dinámico

Notapor seafree » 2013-07-24 15:15 @677

Ok, gracias, explorer, dame unos minutos.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: rowspan dinámico

Notapor seafree » 2014-03-04 16:20 @722

Hola, explorer, después de un gran lapso te vuelvo a contactar respecto al ROWSPAN DINÁMICO. La solución que me proporcionaste es perfecta pero tengo Perl v5.8.8 y no me reconoce la definición de la tabla como tu la manejas. ¿De qué manera la utilizo en Perl v5.8.8?

Gracias.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: rowspan dinámico

Notapor explorer » 2014-03-04 20:56 @914

Si te refieres al programa anterior, donde pone

use v5.10;

lo único que tienes que hacer es quitar esa línea, y sustituir los say() por print(), añadiendo caracteres "\n" al final de cada print().

Y el Perl v5.8.8 que tienes es de hace ¡ocho años!
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: rowspan dinámico

Notapor seafree » 2014-03-06 11:41 @529

Agradezco tu apoyo, explorer y, en efecto, ¡debo actualizar Perl!

Por lo pronto el script que me mandaste ya lo veo.

Gracias.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: rowspan dinámico

Notapor seafree » 2014-03-14 15:07 @671

explorer, ¿cómo logro la creación del my $fetchall_arrayref? En el ejemplo mostrado tu lo creas, pero ¿cómo logro su creación vía SQL? Lo que hago es lo siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use warnings;
  3. use diagnostics;
  4.  
  5. use DBI;
  6. use CGI;
  7. use CGI qw(:standard :netscape :shortcuts);
  8.  
  9. $dbh = DBI->connect( "DBI:Pg:dbname=fallas;host=localhost", "usuario", "", { 'RaiseError' => 1 } );
  10.  
  11. my $sql
  12.     = "SELECT id,descrip_comp,fecha_sale,medidas,causa,id_causa,id_anexo FROM t_eventos te, c_tipo_componentes ctc, c_componentes cc WHERE (fecha_sale BETWEEN '2014-01-01 00:00:00' AND '2014-03-14 23:59:59') AND indice='S' AND te.id_tipo_componente=ctc.id_tipo_componente AND ctc.id_componente=cc.id_componente GROUP BY id,descrip_comp,fecha_sale,medidas,causa,id_causa,id_anexo ORDER BY id,descrip_comp";
  13.  
  14. my $sth = $dbh->prepare($sql) or die $DBI::errstr;
  15. $sth->execute();
  16. my $tuplas = $sth->rows;
  17. print "TUPLAS: $tuplas";               ## muestro el total de registros resultantes y son 22
  18.  
  19. my $fetchall_arrayref = $sth->fetchall_arrayref();  ## Aquí hago la asignación
  20. ###---PERO CUANDO MUESTRO LOS VALORES DE $fetchall_arrayref NO SE MUESTRA NADA Y SOLO ENTRA EN EL CICLO 0
  21.  
  22. for my $i (0 .. $#$fetchall_arrayref) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

NOTA: La asignación $fetchall_arrayref no la estoy haciendo correctamente. ¿Me podrás apoyar, por favor?
Última edición por explorer el 2014-03-14 16:08 @713, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Perl
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: rowspan dinámico

Notapor explorer » 2014-03-14 16:28 @727

El resultado de $sth->fetchall_arrayref() es una referencia a un array, así que debes tratarlo como tal.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $fetchall_arrayref = $sth->fetchall_arrayref();
  2. for my $i (0 .. $#$fetchall_arrayref) {
  3.     print "Registro $i\n";
  4.  
  5.     my $registro_ref = $fetchall_arrayref->[$i];        # El elemento $i apuntado por $fechall_arrayref contiene una referencia a un array
  6.  
  7.     #print $registro_ref->[2], "\n";                    # Acceso a la tercera columna del registro
  8.  
  9.     for my $columna (@$registro_ref) {                  # Mostrar todos los registros
  10.         print "\t$columna\n";
  11.     }
  12. }
Coloreado en 0.001 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: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a JavaScript

¿Quién está conectado?

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