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

 
 
Herramientas Buscar en Tema Desplegado
  #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
 



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 05:16:21.


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