Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-08-2010
razor7 razor7 is offline
Miembro
 
Registrado: abr 2007
Posts: 30
Poder: 0
razor7 Va por buen camino
LazReport: Calcular Subtotales por página

Hola, estoy trabajando con LazReport y no encuento la manera de colocar el subtotal de una columna en cada página.

Lo que necesito es que si el reporte tiene, por ejemplo, 3 páginas, que se calcule el subtotal de cada una de ellas, sumandole el anterior.

Ej: Si el subtotal de cada página es $100, necesitaria mostrar el subtotal de la página 1 ($100) el de la página 2 ($200) y el de la 3 ($300).

Alguien sabe como sonseguir eso?

Gracias!
Responder Con Cita
  #2  
Antiguo 18-08-2010
razor7 razor7 is offline
Miembro
 
Registrado: abr 2007
Posts: 30
Poder: 0
razor7 Va por buen camino
Hola, disculpas por el Bump, pero necesito ayuda con esto.

Gracias!
Responder Con Cita
  #3  
Antiguo 18-08-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Si no trae un componente específico para hacerlo entonces tendrás que usar una variable donde vayas almacenando la suma e ir imprimiéndola por página.
Responder Con Cita
  #4  
Antiguo 19-08-2010
Avatar de rretamar
[rretamar] rretamar is offline
Miembro Premium
 
Registrado: ago 2006
Ubicación: San Francisco, Córdoba, Argentina
Posts: 1.168
Poder: 20
rretamar Va camino a la famarretamar Va camino a la fama
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Si no trae un componente específico para hacerlo entonces tendrás que usar una variable donde vayas almacenando la suma e ir imprimiéndola por página.
Es así como dice Casimiro. Los reporteadores suelen tener un evento que se dispara cada vez que se llega al fin de página. Ahí se puede escribir el código que muestre ese subtotal.

(recuerdo los malabarismos que hice con código para en el QuicReports 4 poder imprimir un listado a dos columnas por página)
__________________
Lazarus Codetyphon : Desarrollo de aplicaciones Object Pascal, libre y multiplataforma.
Responder Con Cita
  #5  
Antiguo 20-08-2010
razor7 razor7 is offline
Miembro
 
Registrado: abr 2007
Posts: 30
Poder: 0
razor7 Va por buen camino
[Solucionado] LazReport: Calcular Subtotales por página

Hola, lamentablemente ese método no soluciona el problema. Si tengo un informe de 3 páginas, en la primera me muestra $100, en la segunda $100 y en la tercera $100 como subtotales!!!.

De todas maneras ya encontre una solución que paso a explicar por si alguien necesita hacer algo similar.

Creo una variable global entera llamada totalPages (increible pero no encontre esta propiedad en el componente TfrReport)
Código:
totalPages:Integer;
En el evento OnBeginDoc inicializo la variable totalPages:=0; (es importante hacer esto puesto que si en una ejecucion del programa se muestra varias veces un reporte cualquiera, la variable puede seguir contando páginas de otros reportes)
Código:
procedure TForm1.frReport1BeginDoc;
begin
  totalPages:=0;
end;
En el evento OnEndPage incremento la variable totalPages, ademas agregue unas condiciones para que no incremente constantemente la variable en un reporte de dos pasadas como es el caso de mis reportes.
Código:
procedure TForm1.frReport1EndPage(pgNo: Integer);
begin
  if frReport1.DoublePass and not frReport1.FinalPass then
      Inc(totalPages);
end;
Luego acumulo el valor de la columna que quiero sumar en una variable, usando los eventos, OnFirst y OnNext de un componente TfrDBDataSet. En mi caso use un TSqlite3Dataset como fuente de datos del TfrDBDataSet.
Código:
procedure TForm1.frReport1First(Sender: TObject);
begin
  total_acum:=0;
  total_acum:=total_acum+Sqlite3Dataset1.FieldByName('nombre_del_campo').Value;
end;

procedure TForm1.frReport1Next(Sender: TObject);
begin
  if not frPackinglist_det.Eof then
    total_acum:=total_acum+Sqlite3Dataset1.FieldByName('nombre_del_campo').Value;
end;
Hasta aqui obtengo los valores acumulados, ahora solo basta pasarselos al reporte. Por alguna extraña razon, siempre acumula un elemento mas del que se muestra en el reporte, por ejemplo, si en la primera hoja del reporte hay 25 elementos, suma 26...por eso, es necesario saber cuantas paginas tiene el reporte...de ahi la condicion, si estas en la ultima pagina, mostra la sumatoria, si no, mostra la sumatoria menos el elemento actual (que seria el 26), de paso, como en mi caso se trata de un Float, lo paso formateado.
Código:
procedure TForm1.frReport1GetValue(const ParName: String;
  var ParValue: Variant);
begin
    if ParName='TOTAL_ACUM' then
      begin
        if frReport1.EMFPages.Count = totalPages then
          ParValue:=FormatFloat('0.#0',total_acum)
        else
          ParValue:=FormatFloat('0.#0',total_acum - Sqlite3Dataset1.FieldByName('nombre_del_campo').Value);
      end;
end;
Por ultimo, solo basta crear un memo en el reporte con el texto Dummy (para poder identificarlo) con el siguiente código en su script
Código:
begin
  Text:=TOTAL_ACUM;
end;
Para evitar errores al previsualizar el reporte, conviene crear la variable "TOTAL_ACUM" en el editor de variables del reporte, y luego asignerle el valor [Nada]

Con esto logro tener subtotales acumulativos por página

Espero que les sirva, adjunto un PDF para que se vean los resultados, tener en cuenta que el total esta tomado de la base de datos y el sub total es el valor calculado, con eso se confirma que el metodo funciona bien.

http://www.mgscreativa.com/Invoice_DB-10-0548.pdf

Última edición por razor7 fecha: 20-08-2010 a las 02:34:31.
Responder Con Cita
  #6  
Antiguo 20-08-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Precisamente esa era la solución que te dimos, usando una variable

Por cierto, si usas la variable integer no funcionará correctamente cuando tengas importes con decimales.
Responder Con Cita
  #7  
Antiguo 20-08-2010
razor7 razor7 is offline
Miembro
 
Registrado: abr 2007
Posts: 30
Poder: 0
razor7 Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Precisamente esa era la solución que te dimos, usando una variable

Por cierto, si usas la variable integer no funcionará correctamente cuando tengas importes con decimales.
Hola, me parece que hay una pequeña diferencia entre tu solucion "Si no trae un componente específico para hacerlo entonces tendrás que usar una variable donde vayas almacenando la suma e ir imprimiéndola por página." y el post que escribi.

Por otro lado, la variable "total_acum" debe ser Double, pero en ningun momento lo ongo en el post por que seguro que el que quiera implementarlo lo sabra.

Por ultimo, por favor, lean el post completo, creo que esta bastante detallado.

Saludos!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Consulta con Subtotales. manueljgomezc Firebird e Interbase 6 29-07-2010 17:14:39
lazreport problemas lazarus anubis Lazarus, FreePascal, Kylix, etc. 1 30-11-2009 20:44:39
Subtotales al comienzo yusnerqui Varios 6 08-06-2006 16:02:20
En los subtotales por pagina alcides Impresión 0 07-06-2005 20:20:06
Subtotales en QuickReport raugadel Impresión 3 12-05-2004 16:13:49


La franja horaria es GMT +2. Ahora son las 22:06:52.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi