[Lazarus-es] Fw: Sumar grupos a partir de una variable en un reporte
Ismael L. Donis Garcia
ismael en citricos.co.cu
Lun Ago 26 22:34:17 CEST 2013
Esto es una solución parcial ya que me obliga a tener un pie de grupo en el
reporte. Pero bueno es más que nada. Aunque pensándolo bien tengo que probar
si funciona ocultando la banda a la hora de imprimir con:
if Band.Name='GroupFooter1' then
Band.Visible := false;
1 Millón de Gracias por enésima vez a Jesus, aunque me arma un pequeñín
enredo a tener en este reporte 4 grupos y algunas cositas de más que tengo
que validar aun.
Pero bueno ya lo pude totalizar en el encabezamiento, que eso si para mi es
invalidante. Al punto que si no se podía tenía que mirar para otro generador
de reportes.
========
| ISMAEL |
========
----- Original Message -----
From: "Jesus Reyes" <jesusrmx en yahoo.com.mx>
To: "Spanish version of Lazarus List"
<lazarus-es en lists.lazarus.freepascal.org>
Sent: Monday, August 26, 2013 11:27 AM
Subject: Re: [Lazarus-es] Fw: Sumar grupos a partir de una variable enun
reporte
Citado: De: Martin Gomez <mmgomez en gmail.com>
[
En QuickReports (o era en FastReports? no lo recuerdo bien) podías poner los
totales de grupo arriba, pero para hacerlo con una variable deberías sumar
en cada renglón del grupo en esa variable, para que esté disponible y no sea
0.
Aquí hay una explicación en inglés:
http://www.fast-report.com/en/documentation/frx3user/Script/Printing%20the%20groups%20sum%20total%20in%20the%20groups%20header.htm
]
Parece que FastReport tiene un sistema de script mas avanzado que LazReport
el cual no tiene eventos en los scripts, sin embargo algo parecido puede
hacerse. Ver mas abajo.
Citado: De: Martin Gomez <mmgomez en gmail.com>
[Por cierto, los correos de Ismael no me llegan, sólo me llegan comentados
en las respuestas de Maxi, a alguien más le pasa esto?
]
He revisado en la interfaz de administración de la lista y no encontré nada
que pudiera estar filtrándote los mensajes, debe ser algo en tu ISP o en tu
cliente de correo.
2013/8/25 Maxi <maximiliano.duarte en gmail.com>
El día 23 de agosto de 2013 13:09, Ismael L. Donis Garcia
><ismael en citricos.co.cu> escribió:
>> Nadie de la lista me podría ayudar en el mensaje de abajo.
>>
>> He probado de las siguiente formas:
>>
>> [SUM([SALDEBE] ,MasterData1)]
>> [SUM(SALDEBE ,MasterData1)]
>> [SUM([SALDEBE ,MasterData1])]
>>
>> Y de ninguna me suma, siempre el valor devuelto es 0.
>>
>> Sin embargo si la pongo en el pie del grupo si me suma bien el resultado.
Esto es correcto, las funciones "aggregate" no son evaluadas en los las
bandas encabezados.
>> Pero yo necesito la sumatoria en el encabezado del grupo, ósea en la
>> parte
>> superior, no en la parte inferior.
>>
Como ya comenté, LazReport no tiene un interprete tan sofisticado como
FastReport, pero la explicación que dan es igualmente válida en LazReport:
Para obtener las sumatorias es necesario recorrer todos los registros
involucrados y esto solo se puede hacer en un reporte de dos pasos (menu
File->Report options->Two-pass report), en el primer paso se recolectan las
sumas de los pies de grupo que se usan en un segundo paso en los encabezados
de grupo.
Creo que hay algunas variaciones en cuanto a como hacerlo en LazReport, yo
exploré la siguiente en un reporte ficticio de ventas por sucursal por
departamento, así que tengo dos grupos anidados (después incluiré el ejemplo
en LazReport)
Branch1 (TotalBranch1)
Depto1 (TotalDepto1)
Art1 price1
Art2 price2
Total TotalDepto1
Depto2 (TotalDepto2)
Art1 price1
Art2 price2
Total TotalDepto2
ETC.
Total TotalBranch1
Branch2 (TotalBranch2)
ETC.
Sucursal y Departamenteo tienen la suma correspondiente tanto en el
encabezado como en su pie de grupo. La estructura del reporte sería así:
Banda: GroupHeader, nombre:BranchHeader, condición=[branch]
Texto: Branch [branch], texto: [branch_sum]
Banda: GroupHeader, nombre:DeptoHeader, condición=[depto]
memo: Depto [depto], memo: [depto_sum]
Banda: MasterData, nombre:MasterData1
memo: [article] memo: [price]
Banda:GroupFooter, nombre:DeptoFooter
memo:Total [Sum([price], MasterData1)]
Banda:GroupFooter, nombre:BranchFooter
memo:Total [Sum([price], MasterData1)]
En el componente TFrReport asignamos los siguientes eventos:
OnBeginBand():
....
if not frReport1.FinalPass then begin
// PRIMER PASO
if Band.name='BranchHeader' then begin
i := Length(Hdrs);
SetLength(Hdrs, i+1);
end;
if Band.Name='DeptoFooter' then begin
i := Length(Hdrs)-1;
j := Length(Hdrs[i].Deptos);
SetLength(Hdrs[i].Deptos, j+1);
Hdrs[i].Deptos[j] := frParser.Calc('SUM([price], MasterData1)');
end else
if Band.Name='BranchFooter' then begin
i := Length(Hdrs)-1;
Hdrs[i].Sum:= frParser.Calc('SUM([price], MasterData1)');
end;
end else begin
// SEGUNDO PASO
if Band.Name='BranchHeader' then begin
// reset depto index
fDeptoIndex := -1;
inc(fBranchIndex);
end else
if Band.Name='GroupHeader2' then begin
inc(fDeptoIndex);
end;
end;
Para llevar el registro de las sumas por sucursal y departamento utilizo un
array de este tipo:
TBranch=record
Sum: variant;
Deptos: array of variant;
end;
Hdrs: array of TBranch;
En el PRIMER PASO cada vez que aparece el BranchHeader aumento un elemento
en el array Hdrs[]
y cada vez que aparece un DeptoFooter aumentamos un elemento en
Hdrs[x].Deptos[] y almacenamos ahí la suma del Depto actual, esto lo hacemos
mendiante la evaluación de frParser.Calc(SUM[price], MasterData1); cada vez
que aparece un BranchFooter mendiante la misma técnica calculamos la suma
del Branch actual y la almacenamos en Hdrs[x].Sum
Con esto se han colectado todas las sumas, en el SEGUNDO PASO solo es
necesario ir "indexando" cada uno de los encabezados conforme van siendo
solicitados. Para que el índice de la sucursal sea el correcto lo iniciamos
en el OnBeginDoc del TfrReport o en cualquier momento antes de iniciar el
reporte.
OnBeginDoc()
...
FBranchIndex := -1;
Estos indices son utilizados "bajo demanda" en el evento:
OnGetValue()
...
if ParName='branch_sum' then
ParValue := Hdrs[FBranchIndex].Sum;
if parName='depto_sum' then
ParValue := Hdrs[FBranchIndex].Deptos[FDeptoIndex];
Esta técnica requiere al menos LazReport r40866 (o una anterior parchada con
la susodicha revisión) que implementa obtener el nombre de la banda
actualmente procesada en el evento OnBeginBand.
Supongo que para una cantidad mayor de grupos anidados, llevar el registro
de todos las sumas se convierte en un desafio aún mayor. :)
Saludos.
Jesus Reyes A.
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
_______________________________________________
Lazarus-es mailing list
Lazarus-es en lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
More information about the Lazarus-es
mailing list