Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2013-08

Sumar grupos a partir de una variable en un reporte

13 messages · 6 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Ismael L. Donis Garcia

Estoy tratando de realizar un reporte con multiple grupos anidados, donde cada grupo debe tener una sumatoria de una variable, pero no logro ni obtener la sumatoria del primer grupo:

Los grupos ser�an: Cuenta, subcta, cap�tulo, subcap, elemento, empresa.

A las variables les paso el valor de la sigiente forma:

procedure Tflbal.rptGetValue(const ParName: String; var ParValue: Variant);
begin
  if (ParName = 'SALDEBE') then
    begin
      if (UpperCase(dm.rssc3.FieldByName('nat').AsString)  'A') then
       ParValue := dm.rssc3.FieldByName('saldo').AsFloat;
    end
  else if (ParName = 'SALHABER') then
    begin
      if (UpperCase(dm.rssc3.FieldByName('nat').AsString) = 'A') then
       ParValue := dm.rssc3.FieldByName('saldo').AsFloat;
    end;
end;

El reporte deberia ser por ejemplo:

Cuenta Nombre Debito Credito xxx xxxx suma(saldebe) suma(salhaber) subcta Nombre
xxx xxxx suma(saldebe) suma(salhaber) capitulo Nombre
xxx xxxx suma(saldebe) suma(salhaber)

Y as� hasta la empresa.

Pero no puedo obtener ni la sumatoria de la cuenta. Y probado de cuanta forma se me ha ocurrido. Y no encuentro como hacerlo.

Alguien me podr�a decir como?
========
| ISMAEL |
========
Only for the small landowners and Cubans companies Website: www.sisconge.byethost15.com
www.sisconge.hol.es
------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20130821/009edf24/attachment.html>

Reply by email

Maxi
to Ismael L. Donis Garcia

en el evento beforeprint creo deberia llevar alli la cuenta, o usar un control con la funcion Sum y que reinicie a cero al final de cada grupo.
No tengo a mano el reporteador.

El d�a 21 de agosto de 2013 17:04, Ismael L. Donis Garcia <ismael en citricos.co.cu> escribi�:

Show quoted text 50 lines
Estoy tratando de realizar un reporte con multiple grupos anidados, donde cada grupo debe tener una sumatoria de una variable, pero no logro ni obtener la sumatoria del primer grupo: Los grupos ser�an: Cuenta, subcta, cap�tulo, subcap, elemento, empresa. A las variables les paso el valor de la sigiente forma: procedure Tflbal.rptGetValue(const ParName: String; var ParValue: Variant); begin if (ParName = 'SALDEBE') then begin if (UpperCase(dm.rssc3.FieldByName('nat').AsString) 'A') then ParValue := dm.rssc3.FieldByName('saldo').AsFloat; end else if (ParName = 'SALHABER') then begin if (UpperCase(dm.rssc3.FieldByName('nat').AsString) = 'A') then ParValue := dm.rssc3.FieldByName('saldo').AsFloat; end; end; El reporte deberia ser por ejemplo: Cuenta Nombre Debito Credito xxx xxxx suma(saldebe) suma(salhaber) subcta Nombre xxx xxxx suma(saldebe) suma(salhaber) capitulo Nombre xxx xxxx suma(saldebe) suma(salhaber) Y as� hasta la empresa. Pero no puedo obtener ni la sumatoria de la cuenta. Y probado de cuanta forma se me ha ocurrido. Y no encuentro como hacerlo. Alguien me podr�a decir como? ======== | ISMAEL | ======== Only for the small landowners and Cubans companies Website: www.sisconge.byethost15.com www.sisconge.hol.es _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
El que pregunta aprende, y el que contesta aprende a responder. No a la obsolecencia programada: http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml Linux User #495070 http://domonetic.com/blog

Reply by email

Ismael L. Donis Garcia

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. Pero yo necesito la sumatoria en el encabezado del grupo, �sea en la parte superior, no en la parte inferior.

Como podr�a totalizar el valor del grupo en la parte superior en LazReport con el uso de uan variable?

Debo usar una variable ya que el saldo puede ir indistintamente al debe o al haber

Saludos Cordiales
========
| ISMAEL |
========

Earlier message 51 lines
----- Original Message ----- From: Ismael L. Donis Garcia To: Spanish Lazarus Sent: Wednesday, August 21, 2013 4:04 PM Subject: Sumar grupos a partir de una variable en un reporte Estoy tratando de realizar un reporte con multiple grupos anidados, donde cada grupo debe tener una sumatoria de una variable, pero no logro ni obtener la sumatoria del primer grupo: Los grupos ser�an: Cuenta, subcta, cap�tulo, subcap, elemento, empresa. A las variables les paso el valor de la sigiente forma: procedure Tflbal.rptGetValue(const ParName: String; var ParValue: Variant); begin if (ParName = 'SALDEBE') then begin if (UpperCase(dm.rssc3.FieldByName('nat').AsString) 'A') then ParValue := dm.rssc3.FieldByName('saldo').AsFloat; end else if (ParName = 'SALHABER') then begin if (UpperCase(dm.rssc3.FieldByName('nat').AsString) = 'A') then ParValue := dm.rssc3.FieldByName('saldo').AsFloat; end; end; El reporte deberia ser por ejemplo: Cuenta Nombre Debito Credito xxx xxxx suma(saldebe) suma(salhaber) subcta Nombre xxx xxxx suma(saldebe) suma(salhaber) capitulo Nombre xxx xxxx suma(saldebe) suma(salhaber) Y as� hasta la empresa. Pero no puedo obtener ni la sumatoria de la cuenta. Y probado de cuanta forma se me ha ocurrido. Y no encuentro como hacerlo. Alguien me podr�a decir como? ======== | ISMAEL | ======== Only for the small landowners and Cubans companies Website: www.sisconge.byethost15.com www.sisconge.hol.es ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20130823/4ee74b00/attachment.html>

Reply by email

Maxi
to Ismael L. Donis Garcia

El d�a 23 de agosto de 2013 13:09, Ismael L. Donis Garcia <ismael en citricos.co.cu> escribi�:

Show quoted text 80 lines
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. Pero yo necesito la sumatoria en el encabezado del grupo, �sea en la parte superior, no en la parte inferior. Como podr�a totalizar el valor del grupo en la parte superior en LazReport con el uso de uan variable? Debo usar una variable ya que el saldo puede ir indistintamente al debe o al haber Saludos Cordiales ======== | ISMAEL | ======== ----- Original Message ----- From: Ismael L. Donis Garcia To: Spanish Lazarus Sent: Wednesday, August 21, 2013 4:04 PM Subject: Sumar grupos a partir de una variable en un reporte Estoy tratando de realizar un reporte con multiple grupos anidados, donde cada grupo debe tener una sumatoria de una variable, pero no logro ni obtener la sumatoria del primer grupo: Los grupos ser�an: Cuenta, subcta, cap�tulo, subcap, elemento, empresa. A las variables les paso el valor de la sigiente forma: procedure Tflbal.rptGetValue(const ParName: String; var ParValue: Variant); begin if (ParName = 'SALDEBE') then begin if (UpperCase(dm.rssc3.FieldByName('nat').AsString) 'A') then ParValue := dm.rssc3.FieldByName('saldo').AsFloat; end else if (ParName = 'SALHABER') then begin if (UpperCase(dm.rssc3.FieldByName('nat').AsString) = 'A') then ParValue := dm.rssc3.FieldByName('saldo').AsFloat; end; end; El reporte deberia ser por ejemplo: Cuenta Nombre Debito Credito xxx xxxx suma(saldebe) suma(salhaber) subcta Nombre xxx xxxx suma(saldebe) suma(salhaber) capitulo Nombre xxx xxxx suma(saldebe) suma(salhaber) Y as� hasta la empresa. Pero no puedo obtener ni la sumatoria de la cuenta. Y probado de cuanta forma se me ha ocurrido. Y no encuentro como hacerlo. Alguien me podr�a decir como? ======== | ISMAEL | ======== Only for the small landowners and Cubans companies Website: www.sisconge.byethost15.com www.sisconge.hol.es _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

Es que suena poco logico, para sumarlos primero debes recorrer todo el grupo. Lo que se me ocurre es que lanzes una query antes de imprimir para ese grupo y ahi tendrias los valores antes de imprimirlos.

El que pregunta aprende, y el que contesta aprende a responder. No a la obsolecencia programada: http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml Linux User #495070 http://domonetic.com/blog

Reply by email

Martin Gomez
to Maxi

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

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?

2013/8/25 Maxi <maximiliano.duarte en gmail.com>

Show quoted text 106 lines
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. > Pero yo necesito la sumatoria en el encabezado del grupo, �sea en la parte > superior, no en la parte inferior. > > Como podr�a totalizar el valor del grupo en la parte superior en LazReport > con el uso de uan variable? > > Debo usar una variable ya que el saldo puede ir indistintamente al debe o al > haber > > Saludos Cordiales > ======== > | ISMAEL | > ======== > ----- Original Message ----- > From: Ismael L. Donis Garcia > To: Spanish Lazarus > Sent: Wednesday, August 21, 2013 4:04 PM > Subject: Sumar grupos a partir de una variable en un reporte > > Estoy tratando de realizar un reporte con multiple grupos anidados, donde > cada grupo debe tener una sumatoria de una variable, pero no logro ni > obtener la sumatoria del primer grupo: > > Los grupos ser�an: Cuenta, subcta, cap�tulo, subcap, elemento, empresa. > > A las variables les paso el valor de la sigiente forma: > > procedure Tflbal.rptGetValue(const ParName: String; var ParValue: Variant); > begin > if (ParName = 'SALDEBE') then > begin > if (UpperCase(dm.rssc3.FieldByName('nat').AsString) 'A') then > ParValue := dm.rssc3.FieldByName('saldo').AsFloat; > end > else if (ParName = 'SALHABER') then > begin > if (UpperCase(dm.rssc3.FieldByName('nat').AsString) = 'A') then > ParValue := dm.rssc3.FieldByName('saldo').AsFloat; > end; > end; > > El reporte deberia ser por ejemplo: > > Cuenta Nombre Debito Credito > xxx xxxx suma(saldebe) suma(salhaber) > subcta Nombre > xxx xxxx suma(saldebe) suma(salhaber) > capitulo Nombre > xxx xxxx suma(saldebe) suma(salhaber) > > > Y as� hasta la empresa. > > Pero no puedo obtener ni la sumatoria de la cuenta. Y probado de cuanta > forma se me ha ocurrido. Y no encuentro como hacerlo. > > Alguien me podr�a decir como? > ======== > | ISMAEL | > ======== > Only for the small landowners and Cubans companies > Website: www.sisconge.byethost15.com > www.sisconge.hol.es > > _______________________________________________ > Lazarus-es mailing list > Lazarus-es en lists.lazarus.freepascal.org > http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es > Es que suena poco logico, para sumarlos primero debes recorrer todo el grupo. Lo que se me ocurre es que lanzes una query antes de imprimir para ese grupo y ahi tendrias los valores antes de imprimirlos. -- El que pregunta aprende, y el que contesta aprende a responder. No a la obsolecencia programada: http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml Linux User #495070 http://domonetic.com/blog _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
Try not to become a man of success but rather to become a man of value. *Albert Einstein* ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20130825/7c402b1b/attachment.html>

Reply by email

Martin Gomez
to Martin Gomez

2013/8/25 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?

?Era mi GMAIL que me los estaba enviando a Spam, ya est� resuelto.?

Try not to become a man of success but rather to become a man of value. *Albert Einstein* ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20130825/e11a2226/attachment.html>

Reply by email

Martin Gomez
to Ismael L. Donis Garcia: Nadie de la lista me podr�a ayudar en el mensaje de abajo. He probado de las siguiente…

2013/8/23 Ismael L. Donis Garcia <ismael en citricos.co.cu>

Show quoted text 20 lines
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. Pero yo necesito la sumatoria en el encabezado del grupo, �sea en la parte superior, no en la parte inferior. Como podr�a totalizar el valor del grupo en la parte superior en LazReport con el uso de uan variable? Debo usar una variable ya que el saldo puede ir indistintamente al debe o al haber

?No he utilizado LazReports, pero en otros reporteadores la l�gica es que si tienes que sumar variables, lo haces a mano y no con SUM?(), ya que el SUM() s�lo funciona con campos de la base de datos.

Lo que yo har�a en tu caso (lo hice alguna vez con el reporteador CrystalReports en ASP.NET) es tener SUM(DEBE) y SUM(HABER), pero marcados como invisibles, y los campos de saldo apuntando a variables SALDEBE y SALHABER, marcados para no imprimirse si valen 0.
Entonces en el evento de impresi�n de esta banda, tomas SUM(DEBE) - SUM(HABER) leyendo de los campos invisibles, y si el resultado es positivo lo pones en una variable, si es negativo en la otra.

Disculpa que no lo pueda hacer m�s puntual a LazReports, es que no lo he utilizado nunca.

Try not to become a man of success but rather to become a man of value. *Albert Einstein* ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20130825/284be0ea/attachment-0001.html>

Reply by email

Héctor F. Fiandor Rosario
to Martin Gomez

Estimado Ismael: para aprender...

parece que tu quieres obtener una suma en el encabezado, antes de que el Reporte vea los sumandos. Es as�?

si fuera asi, no quedar�a mas remedio que hacer la suma y guardarla en una variable antes de lanzar el Reporte. Una vez lanzado el reporte, la debes poner donde tu quieras.

parece que por eso lo hace en el pie de grupo.

saludos,

Ing. H�ctor F. Fiandor Rosario
hfiandor en infomed.sld.cu

Earlier message 46 lines
----- Original Message ----- From: Martin Gomez To: Spanish version of Lazarus List Sent: Sunday, August 25, 2013 3:05 AM Subject: Re: [Lazarus-es] Fw: Sumar grupos a partir de una variable en unreporte 2013/8/23 Ismael L. Donis Garcia <ismael en citricos.co.cu> 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. Pero yo necesito la sumatoria en el encabezado del grupo, �sea en la parte superior, no en la parte inferior. Como podr�a totalizar el valor del grupo en la parte superior en LazReport con el uso de uan variable? Debo usar una variable ya que el saldo puede ir indistintamente al debe o al haber ?No he utilizado LazReports, pero en otros reporteadores la l�gica es que si tienes que sumar variables, lo haces a mano y no con SUM?(), ya que el SUM() s�lo funciona con campos de la base de datos. Lo que yo har�a en tu caso (lo hice alguna vez con el reporteador CrystalReports en ASP.NET) es tener SUM(DEBE) y SUM(HABER), pero marcados como invisibles, y los campos de saldo apuntando a variables SALDEBE y SALHABER, marcados para no imprimirse si valen 0. Entonces en el evento de impresi�n de esta banda, tomas SUM(DEBE) - SUM(HABER) leyendo de los campos invisibles, y si el resultado es positivo lo pones en una variable, si es negativo en la otra. Disculpa que no lo pueda hacer m�s puntual a LazReports, es que no lo he utilizado nunca. -- Try not to become a man of success but rather to become a man of value. Albert Einstein ------------------------------------------------------------------------------

Reply by email

Ismael L. Donis Garcia
to Maxi: El d�a 23 de agosto de 2013 13:09, Ismael L. Donis Garcia <ismael en citricos.co.cu>…
Show quoted text 44 lines
----- Original Message ----- From: "Maxi" <maximiliano.duarte en gmail.com> To: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org> Sent: Sunday, August 25, 2013 1:42 AM Subject: Re: [Lazarus-es] Fw: Sumar grupos a partir de una variable en unreporte 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. > Pero yo necesito la sumatoria en el encabezado del grupo, �sea en la > parte > superior, no en la parte inferior. > > Como podr�a totalizar el valor del grupo en la parte superior en > LazReport > con el uso de uan variable? > > Debo usar una variable ya que el saldo puede ir indistintamente al debe o > al > haber > > Saludos Cordiales > ======== > | ISMAEL | > ======== > Es que suena poco logico, para sumarlos primero debes recorrer todo el grupo. Lo que se me ocurre es que lanzes una query antes de imprimir para ese grupo y ahi tendrias los valores antes de imprimirlos.

No se porque lo consideras NO L�gico, para mi es lo normal. Es m�s el �nico generador de reporte que no he visto como hacer esto es el LzaReport. Bueno recuerda que yo nunca he trabajado con Lazarus y muchos menos con Delphi que ni tan siquiera lo he instalado en ninguna PC.

Pues lo que tu consideras no l�gico para mi es totalmente imprescindible que cumpla esta condici�n, o que se pueda simular al menos. Y respecto a lo que dices de otra consulta para las sumas del grupo eso si que es absurdo. Entonces este reporte que estoy tratando de realizar que tiene 4 grupos tendr�a que hacer 5 consultas. Consideras eso l�gico, para no decir irracional.

Pero bueno ahora no estoy para valorar esas cuestiones sino para ver de que forma resolver el problema. Por supuesto que no considero para nada hacer 5 consultas porque eso ser�a descabellado. Recuerda que las consultas son calculadas, no son un simple select

Yo he estado pensando ver si es posible calcular una variable y pasarle el valor en el evento OnEndBand a la etiquete que pondr�a en el encabezamiento de la banda.

Ahora mis preguntas:

Es posible en LazReport cuando se ejecute el evento OnEndBand pasarle un valor a una etiqueta que estar�a en el encabezamiento de dicha banda?

En Caso de no ser posible. Ser� posible simular de alguna u otra forma?

Otra Pregunta:

Alguien por casualidad ha intentado usar ReportManager en Lazarus. Tengo entendido que tiene un control para Delphi. As� que pienso (si no estoy equivocado) que debe ser relativamente f�cil convertirlo a Lazarus.

Saludos a Todos
========
| ISMAEL |
========

Reply by email

Jesus Reyes
to Martin Gomez: En QuickReports (o era en FastReports? no lo recuerdo bien) pod�as poner los totales de…

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

Show quoted text 13 lines
<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

Reply by email

Martin Gomez
to Jesus Reyes

Buen�sima informaci�n, muchas gracias!

2013/8/26 Jesus Reyes <jesusrmx en yahoo.com.mx>

Show quoted text 208 lines
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
Try not to become a man of success but rather to become a man of value. *Albert Einstein* ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20130826/ec59600e/attachment-0001.html>

Reply by email

Paola Bruccoleri
to Jesus Reyes: Citado: De: Martin Gomez <mmgomez en gmail.com> [ En QuickReports (o era en FastReports?…

El 26/08/2013 12:27, Jesus Reyes escribi�:

Show quoted text 12 lines
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.

muy interesante; aunque no lo le� con detenimiento... obviamente quedar� guardado para futuras ocasiones.
Muchas gracias por compartirlo!
byeeeeeeeeeeeeee

Reply by email

Ismael L. Donis Garcia
to Jesus Reyes: Citado: De: Martin Gomez <mmgomez en gmail.com> [ En QuickReports (o era en FastReports?…

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 |
========

Earlier message 210 lines
----- 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

Reply by email