FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Otra pregunta sobre TREPORT (SOLUCIONADO) gracias equipo
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Otra pregunta sobre TREPORT (SOLUCIONADO) gracias equipo
Posted: Wed Jul 24, 2024 04:40 AM

Amigos:

En un reporte, hecho con la clase TREPORT, tengo definidos varios grupos, la pregunta

En el método ON ENDGROUP ¿Cómo puedo identificar a que grupo se refiere?, ¿al primero?,

¿al segundo?, etc.

He intentado con ON ENDGROUP(1) pero me tira error.

Saludos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Otra pregunta sobre TREPORT
Posted: Wed Jul 24, 2024 11:04 AM

Estimado Armando,

La claúsula ON ENDGROUP <uEndGroup> se preprocesa como {|oGrp|<uEndGroup>} por lo que el parámetro oGrp es el objeto group usado

Si indicas aqui el código que quieres usar desde el ON ENDGROUP te indicamos como hacer referencia a oGrp

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Otra pregunta sobre TREPORT
Posted: Wed Jul 24, 2024 05:04 PM
Amigo Maestro Antonio:

Muchas gracias por tu interés en el tema,

En mi reporte tengo definidos dos GROUP:
Code (fw): Select all Collapse
      GROUP gPry ON oRsDet:Fields("HDR_PRO"):Value ;
         FOOTER Space(63) + "Totales por proyecto:" FONT 2

         gPry:bHeader := {|| "* Proyecto: " + oRsDet:Fields("HDR_PRO"):Value + " " + AllTrim(oRsDet:Fields("PRO_DES"):Value)}

      GROUP gCpt ON Str(oRsDet:Fields("DET_NI1"):Value,02,0) +;
                     Str(oRsDet:Fields("DET_NI2"):Value,02,0) +;
                     Str(oRsDet:Fields("DET_NI3"):Value,02,0) +;
                     Str(oRsDet:Fields("DET_NI4"):Value,02,0) +;
                     Str(oRsDet:Fields("DET_NI5"):Value,02,0) ;
         FOOTER Space(62) + "Totales por concepto:" FONT 2

         gCpt:bHeader := {|| "* Concepto: " + AllTrim(Str(oRsDet:Fields("DET_NI1"):Value,02,0)) + "-" +;
                                                AllTrim(Str(oRsDet:Fields("DET_NI2"):Value,02,0)) + "-" +;
                                                AllTrim(Str(oRsDet:Fields("DET_NI3"):Value,02,0)) + "-" +;
                                                AllTrim(Str(oRsDet:Fields("DET_NI4"):Value,02,0)) + "-" +;
                                                AllTrim(Str(oRsDet:Fields("DET_NI5"):Value,02,0)) + " " +;
                                                AllTrim(oRsDet:Fields("CON_DES"):Value)}

Y lo que pretendo es algo así:
Code (fw): Select all Collapse
    ACTIVATE REPORT oReporte ;
      ON STARTPAGE Alinea(oReporte,1,2);
      ON ENDGROUP MiFuncion(oReporte);                <======= Esto
       WHILE nLinea <= nHasta
Y MiFuncion() pretendo algo así:
Code (fw): Select all Collapse
STATIC FUNCTION MiFuncion(oReporte)
    oReporte:SAY(1,"Totales por proyecto:",2,RPT_RIGHT)
   
    oReporte:SAY(1,"Totales por concepto",2,RPT_RIGHT)
RETURN(.T.)
El texto a imprimir va a depender desde que GROUP llego a MiFuncion()

Revisé la clase TREPORT y veo que el método ENDGROUP puede llevar un parámetro ENDGROUP(nGpo)
pero al intentarlo me tira error.

Intento encontrar solución a mi POST anterior del FOOTER

Saludos al foro
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Otra pregunta sobre TREPORT
Posted: Thu Jul 25, 2024 06:41 AM

Modifica el código de esta forma:

ON ENDGROUP MiFuncion( oReporte, oGrp )

y asi recibes el grupo en tu función

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Otra pregunta sobre TREPORT
Posted: Wed Jul 31, 2024 07:14 PM

Armando, lo solucionaste?

Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Otra pregunta sobre TREPORT
Posted: Wed Jul 31, 2024 07:19 PM

Francisco:

No, no pude. por el momento lo dejé como antes.

Saludos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Otra pregunta sobre TREPORT
Posted: Wed Jul 31, 2024 09:28 PM
Armando.
Intenta adaptando el siguiente codigo. Con este puedes poner el footer de grupo en cualquiera de las columnas del oReport.
Es para un grupo nada mas.
Code (fw): Select all Collapse
      GROUP ON FIELD->ESTADO ;
      HEADER if(Empty(oReport:aGroups[1]:cValue),"NO CONECTADOS", "CONECTADOS") ;
      FOOTER GroupFooter(oReport,2) ;
      FONT 2

//-----------------------------------------------//
Function GroupFooter(oReport,nFont)
   local cFooter := if(Empty(oReport:aGroups[1]:cValue), "TOTAL NO CONECTADOS","TOTAL CONECTADOS")   
   oReport:bEndGroup:={|| oReport:Say(5,cFooter,nFont,RPT_LEFT,oReport:nRow +(oReport:nStdLineHeight()/2) ) }
Return nil
Saludos.
Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Otra pregunta sobre TREPORT
Posted: Thu Aug 01, 2024 04:02 PM
Francisco:

Excelente solución, funcionó de 100 cuando es un grupo pero en mi caso tengo dos y hasta tres grupos.

Se repite el texto del primer grupo.

Este es mi código
Code (fw): Select all Collapse
      GROUP gPry ON oRsDet:Fields("HDR_PRO"):Value ;
         FOOTER FootPry(oReporte,2) FONT 2

         gPry:bHeader := {|| "Proyecto: " + oRsDet:Fields("HDR_PRO"):Value + " " + AllTrim(oRsDet:Fields("PRO_DES"):Value)}

      GROUP gCpt ON Str(oRsDet:Fields("DET_NI1"):Value,02,0) +;
                     Str(oRsDet:Fields("DET_NI2"):Value,02,0) +;
                     Str(oRsDet:Fields("DET_NI3"):Value,02,0) +;
                     Str(oRsDet:Fields("DET_NI4"):Value,02,0) +;
                     Str(oRsDet:Fields("DET_NI5"):Value,02,0) ;
         FOOTER FootCpt(oReporte,2) FONT 2

         gCpt:bHeader := {|| "Concepto: " + AllTrim(Str(oRsDet:Fields("DET_NI1"):Value,02,0)) + "-" +;
                                                AllTrim(Str(oRsDet:Fields("DET_NI2"):Value,02,0)) + "-" +;
                                                AllTrim(Str(oRsDet:Fields("DET_NI3"):Value,02,0)) + "-" +;
                                                AllTrim(Str(oRsDet:Fields("DET_NI4"):Value,02,0)) + "-" +;
                                                AllTrim(Str(oRsDet:Fields("DET_NI5"):Value,02,0)) + " " +;
                                                AllTrim(oRsDet:Fields("CON_DES"):Value)}
...
...

STATIC FUNCTION FootCpt(oReporte,nFont)
   oReporte:bEndGroup   := {|| oReporte:Say( 02,"Totales por concepto:",nFont,RPT_RIGHT,oReporte:nRow + (oReporte:nStdLineHeight() / 2) ) }
RETURN(Nil)

STATIC FUNCTION FootPry(oReporte,nFont)
   oReporte:bEndGroup   := {|| oReporte:Say( 02,"Totales por proyecto:",nFont,RPT_RIGHT,oReporte:nRow + (oReporte:nStdLineHeight() / 2) ) }
RETURN(Nil)
Siempre sale "Totales por concepto:"

Por esto se hace imprescindible saber de qué grupo es el ENGROUP.

Muy agradecido
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Otra pregunta sobre TREPORT
Posted: Thu Aug 01, 2024 06:27 PM
Por esto se hace imprescindible saber de qué grupo es el ENGROUP.
Como dice Antonio Linares, para conocer el numero de grupo:
Code (fw): Select all Collapse
Function MyFunction(oReport,oGpo)
 oGpo:nOrder ?
Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Otra pregunta sobre TREPORT
Posted: Thu Aug 01, 2024 06:54 PM
Francisco:

Te agradezco la paciencia pero
Code (fw): Select all Collapse
    ACTIVATE REPORT oReporte ;
      ON STARTPAGE Alinea(oReporte,1,2);
      ON ENDGROUP MyFunction(oReporte,oGpo);            <==== Aquí me reclama , no existe la variable oGpo
       WHILE nLinea <= nHasta
RETURN(.T.)

STATIC FUNCTION MyFunction(oReporte,oGpo)
   msginfo(oGpo:nOrder,"No. de Grupo")
RETURN(Nil)
Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: Otra pregunta sobre TREPORT
Posted: Fri Aug 02, 2024 10:29 AM
Hola Armando:
Puedes probar analizando el orden del grupo que esta terminando
En tu caso gPry tendrá el orden 1 y gCpt tendrá el orden 2
Entonces puedes hacer
Code (fw): Select all Collapse
      oReport:bEndGroup   := {|oGroup| MiFuncion(oGroup) }
     ACTIVATE REPORT oReport 
...
//Funcion para cuando termina un grupo
STATIC Function MiFuncion(oGroup)
if oGroup:nOrder = 1
   oReporte:Say( 02,"Totales por proyecto:",nFont,RPT_RIGHT,oReporte:nRow + (oReporte:nStdLineHeight() / 2) ) 
ENDIF
if oGroup:nOrder = 2
   oReporte:Say( 02,"Totales por concepto:",nFont,RPT_RIGHT,oReporte:nRow + (oReporte:nStdLineHeight() / 2) ) 
ENDIF
IF oGroup:nOrden = 3
  // Etc.
ENDIF
RETURN NIL
Tendras que declarar como STATIC a oReporte y nFont creo
Espero que te sirva
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Otra pregunta sobre TREPORT
Posted: Fri Aug 02, 2024 07:22 PM
César, Francisco y Antonio:

Casi casi el éxito, el código quedó así:

Al definir los grupos no definí el FOOTER
Code (fw): Select all Collapse
      GROUP gPry ON oRsDet:Fields("HDR_PRO"):Value FONT 2
            gPry:bHeader := {|| "Proyecto: " + oRsDet:Fields("HDR_PRO"):Value + " " + AllTrim(oRsDet:Fields("PRO_DES"):Value)}
El footer los defini hasta tener el objeto oReporte creado:
Code (fw): Select all Collapse
      oReporte:bEndGroup         := { |oGroup| MiFuncion(oReporte,oGroup) }
    ENDIF
Y la función MiFuncion qudó así
Code (fw): Select all Collapse
STATIC FUNCTION MiFuncion(oReporte,oGroup)
   DO CASE
      CASE  oGroup:nOrder == 1
         oReporte:Say( 03,"Totales por proyecto:",2,RPT_RIGHT,oReporte:nRow + (oReporte:nStdLineHeight() / 2) )
      CASE  oGroup:nOrder == 2
         oReporte:Say( 03,"Totales por concepto:",2,RPT_RIGHT,oReporte:nRow + (oReporte:nStdLineHeight() / 2) )
   ENDCASE
RETURN(Nil)
Por comodidad cambie los IFs por un CASE, pero con los IFs tambien funciona.

El resultado es casí 100 excepto que , al no definir el FOOTER al momento de definir el GROUP, no pinta
los importe de los totales, entonces definí un FOOTER "" etc ... y ya pinta los totales pero pone el texto Total,,,
al inicio del renglón de totales.

Aquí el resultado



Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Otra pregunta sobre TREPORT
Posted: Fri Aug 02, 2024 08:41 PM

Amigos:

Ya quedó solucionado, bastó con definir un FOOTER " " (Un espacio en blanco) y funciona de 100.

Muy agradecido, muy agradecido y muy agradecido

Saludos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Otra pregunta sobre TREPORT (SOLUCIONADO) gracias equipo
Posted: Sat Aug 03, 2024 12:10 AM

Excelente!

Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 1144
Joined: Mon Feb 05, 2007 07:15 PM
Re: Otra pregunta sobre TREPORT (SOLUCIONADO) gracias equipo
Posted: Sat Aug 03, 2024 12:45 AM
Paisano Armando te quedó de 100 :shock:
cuando se grande quiero se como tu :roll:
Cesar Cortes Cruz

SysCtrl Software

Mexico



' Sin +- FWH es mejor "

Continue the discussion