• Publicidad

Poner total al terminar cada grupo de filas

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Poner total al terminar cada grupo de filas

Notapor sarriaga » 2014-03-25 11:33 @522

Hola, ¿qué tal? Estoy poniendo un total en una tabla (insertando una fila de total de una suma), y realiza correctamente la suma y me inserta al terminar un grupo de filas que tienen una columna en común, pero no me imprime la último fila con la última suma, tomando en cuenta que si realiza la suma puesto que lo puse en un aviso y sí me da el último valor. ¿Esto a qué se debe? ¿Por qué no me muestra el último total de los grupos de filas? Saludos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $row = 0;
  2. my $total = 0;
  3. my $lastValue;
  4.  
  5. while ($row <= scalar(@{$self->Table})-1) {
  6.     if (defined $lastValue && $lastValue ne $self->Table->[$row]->[$column]) {
  7.         $lastValue = $self->Table->[$row]->[$column];
  8.         splice(@{$self->Table}, $row, 1, (['','','','','','','','TOTAL: '.$total], $self->Table->[$row]));
  9.         $total = $self->Table->[++$row]->[7];
  10.         $row++;
  11.     }
  12.     else {
  13.         $lastValue = $self->Table->[$row]->[$column];
  14.         $total += $self->Table->[$row]->[7] * $self->Table->[$row]->[9];
  15.         $row++;
  16.     }
  17. }
  18.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Publicidad

Re: Poner total al terminar cada grupo de filas

Notapor explorer » 2014-03-25 16:54 @746

Es muy sencillo: el bucle termina porque se acaban las filas recuperadas de la base de datos, por lo tanto, no se entra en el if() para pintar la última línea de totales.

Debes agregar, después del bucle, más código, para poder crear el último total. Será una línea parecida o idéntica a la línea 8.
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: Poner total al terminar cada grupo de filas

Notapor sarriaga » 2014-03-26 16:16 @719

Vale, sí quedó de esa manera, ahora bien... si lo que quiero es que ahora me agrupe los datos de esta tabla, por ejemplo si tengo 3 filas iguales en una columna pero diferente cantidad para sumar quiero que solo me aparezca una sola vez la fila que se repita pero que haga la suma de las 3, tomando en cuenta que los datos de la tabla la estoy obteniendo de un método. Ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
plumas | 80
plumas | 80
plumas | 100
       | 260
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

quiero que quede así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
plumas | 260
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Los datos que tengo son un array listo para poner en la tabla, pero lo que quiero es que no me muestre los datos repetidos; que los ponga una sola vez.
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Re: Poner total al terminar cada grupo de filas

Notapor explorer » 2014-03-28 14:53 @661

Humm... creo que lo más sencillo es que declares un nuevo array, y lo vayas poblando con el contenido que realmente necesitas, y no andar modificando el array original.
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: Poner total al terminar cada grupo de filas

Notapor sarriaga » 2014-03-28 14:55 @663

Bueno, es que otro método busca este array del modo que esta estructurado; es por eso que necesito ese array :(
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Re: Poner total al terminar cada grupo de filas

Notapor sarriaga » 2014-03-28 18:02 @793

Ya quité los duplicados, ahora necesito reemplazar la posición 7 por la suma de todos sus similares en la misma posición.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my %rowDet = ();
  2. $self->Table = grep { !$rowDet{$_->[$column]} ++ } @{$self->Table};
  3.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Re: Poner total al terminar cada grupo de filas

Notapor explorer » 2014-03-29 15:03 @669

Pero... si quitas los duplicados, ¿cómo haces la suma?

Debes hacerlo a la vez. Algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
* Campo7Anterior = 0
* Subtotal = 0
* Para todas las líneas
*       Si el campo 7 es distinto de Campo7Anterior y éste no es cero (caso de la primera línea)
*               # Hemos llegado a un final de duplicados
*               Sacar la línea de totales
*               Campo7Anterior = nuevo campo 7
*               Subtotal = 0
*       Si no
*               Subtotal += campo 7 * campo 9
* Fin de todas las líneas
* Sacamos la última línea de totales
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Fíjate que no solo indicamos que salgan las líneas de totales. Por eso te dije lo de usar un array nuevo.

Lo que puedes hacer es guardar las nuevas líneas en el nuevo @array, y cuando termine el bucle de los totales, haces un

@{self->Table} = @array;

y ya lo tendrás almacenado.
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: Poner total al terminar cada grupo de filas

Notapor sarriaga » 2014-03-31 15:46 @698

No he logrado que me funcione de la manera que me comentas, de hecho cuando trato de sobreescribir el array con solo los campos que necesito no me lo permite :roll:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @$OCSd = grep(!$rowDet{$_->[$column]}++, @{$self->Table});
  2. foreach (@$OCSd){
  3. push(@{$self->Table}, [$_->[$column], $sub_total]);
  4. }
  5.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Re: Poner total al terminar cada grupo de filas

Notapor explorer » 2014-03-31 21:47 @949

Sería algo así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $column = 2;                        # columna a comparar
  2. my $row    = 0;
  3. my $total  = 0;
  4. my $lastValue;
  5.  
  6. my @filas = @{ $self->Table };         # sacamos una copia de todas las filas
  7.  
  8. my @tabla;                             # nueva tabla a construir
  9.  
  10. for my $fila (@filas) {
  11.  
  12.     if ( defined $lastValue and $lastValue ne $fila->[$column] ) {
  13.  
  14.         # Hemos llegado a un final de duplicados
  15.         push @tabla, [ $lastValue, '', '', '', '', '', '', "TOTAL: $total" ];
  16.         $total = 0;
  17.     }
  18.  
  19.     $total += $fila->[7] * $fila->[9];
  20.  
  21.     $lastValue = $fila->[$column];
  22. }
  23.  
  24. # Sacamos la última línea de totales
  25. push @tabla, [ $lastValue, '', '', '', '', '', '', "TOTAL: $total" ];
  26.  
  27. @{ $self->Table } = @tabla;            # no estoy seguro de si esto es legal. Depende de lo que sea 'Table'
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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Poner total al terminar cada grupo de filas

Notapor sarriaga » 2014-04-01 12:34 @565

Sí funciona, solo que hay un detalle... al hacer el push() está quitando el primer elemento del siguiente grupo de datos, por lo tanto no contabiliza para la siguiente suma.
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Siguiente

Volver a Básico

¿Quién está conectado?

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