Page 1 of 1

REPORTE CON COLUMNAS DINAMICAS

PostPosted: Mon Jul 04, 2016 5:00 pm
by joseluisysturiz
Buen dia, necesito hacer un reporte, preferiblemente con FAST REPORT, si no es posible entonces con REPORT o lo mas recomendado, donde pueda hacer lo siguiente: voy tener un xbrowse con X cantidad de columnas, el usuario eligira cuales son las columnas que quiere en el reporte, eliminando del xbrowse las que no quiera, con xBrw;report() basico lo hace, peros resulta que el reporte lleva logo de la empresa y otros detalles..y luego es que vendran las columnas y hasta alguns totalizadores...

Espero haber sido claro y espero sus sugerencias y observaciones para el reporte que necesito, si alguien ha hecho algo parecido o si tiene idea de como pasarle los array de titulos y el master en fast report seria de gran ayuda, gracias..saludos... :shock:

Re: REPORTE CON COLUMNAS DINAMICAS

PostPosted: Mon Jul 04, 2016 5:12 pm
by cnavarro
Una forma sencilla que puedes ir probando, y te puede servir de inspiración

Haz un pequeño programa que abra la base de datos y utiliza la funcion XBROWSE( cAlias )
Pulsa con el boton derecho del raton sobre una de las cabeceras ( header ), y marca / desmarca las columnas que desees, y pulsa sobre el boton de imprimir
El estudio de esas funciones, creo que te pueden servir de punto de partida
Algo asi
Image

Re: REPORTE CON COLUMNAS DINAMICAS

PostPosted: Mon Jul 04, 2016 5:34 pm
by joseluisysturiz
cnavarro wrote:Una forma sencilla que puedes ir probando, y te puede servir de inspiración

Haz un pequeño programa que abra la base de datos y utiliza la funcion XBROWSE( cAlias )
Pulsa con el boton derecho del raton sobre una de las cabeceras ( header ), y marca / desmarca las columnas que desees, y pulsa sobre el boton de imprimir
El estudio de esas funciones, creo que te pueden servir de punto de partida


Navarro, gracias por la rapida respuesta, disculpa, olvide decir que uso MySql y lo de ocultar las columnas es la parte facil, y el reporte oBrw:report() es muy sencillo y basico, necesito el reporte mas elaborado, con logos y titulos con tipos de letras especificos, por eso pense en REPORT o Fast Report, uso es Fast Report. Gracias, saludos... :shock:

PostData: Navarro, no habia visto la imagen, hare lo que me dices para ver lo de Report()...gracias, saludos... :shock:

Re: REPORTE CON COLUMNAS DINAMICAS

PostPosted: Mon Jul 04, 2016 6:38 pm
by cnavarro
Algo asi? ( esto es un xbrowse, evidentemente )

Image

Re: REPORTE CON COLUMNAS DINAMICAS

PostPosted: Mon Jul 04, 2016 7:23 pm
by joseluisysturiz
cnavarro wrote:Algo asi? ( esto es un xbrowse, evidentemente )

Image


Woaooo. algo asi es lo q debo hacer, tengo ya varios hechos con Fast Report, la diferencia ahora es que el usuario jugara con las columnas...hare un frezee a algunas que van siempre y le dare la libertad de quitar o mover las restantes...y no se como hacerlo con FR, he leido en los foros de Delphi que usan mucho FR y no veo nada parecido, tendria que pasar array con los titulos y al master un array con las columnas y determinar cuales totalizare y cuales no...alo trabajoso porque no tengo ni idea de como hacerlo...por eso pense en REPORT ya que veo que hace lo de las columnas desde el xbrowse que es lo mas importante...

Hay algun sample, algo parecido o puedes compartir el reporte que me enseñas.? gracias...saludos... :shock:

Re: REPORTE CON COLUMNAS DINAMICAS

PostPosted: Mon Jul 04, 2016 7:57 pm
by cnavarro
Qué version de Fwh utilizas?

Re: REPORTE CON COLUMNAS DINAMICAS

PostPosted: Mon Jul 04, 2016 8:58 pm
by joseluisysturiz
cnavarro wrote:Qué version de Fwh utilizas?


Estoy usando la 15.12, espero sea compatible con ese trabajo, una consulta, de esa misma manera se veria el informe o solamente se ve asi el xbrowse.? recuerda que lo mas importante es lo de las columnas dinamicas...gracias...saludos... :shock:

Re: REPORTE CON COLUMNAS DINAMICAS

PostPosted: Mon Jul 04, 2016 9:28 pm
by cnavarro
joseluisysturiz wrote:
cnavarro wrote:Qué version de Fwh utilizas?


Estoy usando la 15.12, espero sea compatible con ese trabajo, una consulta, de esa misma manera se veria el informe o solamente se ve asi el xbrowse.? recuerda que lo mas importante es lo de las columnas dinamicas...gracias...saludos... :shock:


Jose Luis, es un ejemplo de Rao
Voy a ver en qué punto está el tema y te comento, pero sobre todo creo que las modificaciones para poder realizar esto están implementadas en la versión 16.04, pero te lo confirmaré

Re: REPORTE CON COLUMNAS DINAMICAS

PostPosted: Mon Jul 04, 2016 11:30 pm
by joseluisysturiz
cnavarro wrote:
joseluisysturiz wrote:
cnavarro wrote:Qué version de Fwh utilizas?


Estoy usando la 15.12, espero sea compatible con ese trabajo, una consulta, de esa misma manera se veria el informe o solamente se ve asi el xbrowse.? recuerda que lo mas importante es lo de las columnas dinamicas...gracias...saludos... :shock:


Jose Luis, es un ejemplo de Rao
Voy a ver en qué punto está el tema y te comento, pero sobre todo creo que las modificaciones para poder realizar esto están implementadas en la versión 16.04, pero te lo confirmaré


Navarro, en realidad lo que necesito es que se vea de esa manera es el reporte si es posible con REPORT, no importa si el xbrowse se ve de forma normal, crei que si usaba xBrw:Report() con alguos parametros podia hacer algo como lo que muestras, ya que la parte mas importante la haria el xBrw que es la seleccion de columnas y luego esa data enviarla al REPORT, no se si me explico, el xBrw me permitiria hacer la opcion de columnas dinamicas, ya las demas cosas creo las puedo hacer con el REPORT, no se si es posible, gracias, saludos... :shock:

Re: REPORTE CON COLUMNAS DINAMICAS

PostPosted: Tue Jul 05, 2016 1:29 am
by cmsoft
Teniendo la consulta armada, lo que puedes hacer es permitir que los campos de la consultas sean o no elegibles de la siguiente manera:
Code: Select all  Expand view

FOR i := 1 TO LEN(oQry:aStructure)
    AADD(aEst,{.f.,oQry:FieldName(i)})
NEXT i
DEFINE DIALOG oDlg1 TITLE "Listado" FROM 03,15 TO 35,90
   @ 10, 10 SAY "Campos a incluir" OF oDlg1 PIXEL
    @ 25, 10 XBROWSE oBrw SIZE 105,80 pixel OF oDlg1 ARRAY aEst ;
      HEADERS "Muestra", "Campo";
      COLUMNS 1, 2 ;
      CELL LINES NOBORDER FASTEDIT
   WITH OBJECT oBrw
      :nEdittYPEs := 1
      :aCols[ 1 ]:SetCheck()
      :CreateFromCode()
   END  
   @ 45,10 BUTTON oBot1 PROMPT "&Imprimir" OF oDlg1 SIZE 30,10  ACTION ((mrta := .t.), oDlg1:End() ) PIXEL
   @ 45,20 BUTTON oBot2 PROMPT "&Cancelar" OF oDlg1 SIZE 30,10  ACTION ((mrta := .f.), oDlg1:End() ) PIXEL
ACTIVATE DIALOG oDlg1 CENTER
IF !mrta
   RETURN  NIL
ENDIF
REPORT oRep TITLE "Listado" FONT  oFont1,oFont2,oFont3 HEADER "Encabezado" RIGHT;
       FOOTER "Hoja:" + STR(oRep:npage,3) + SPACE(40)+"Fecha:"+DTOC(DATE())  PREVIEW
FOR i := 1 TO LEN(aEst)
    IF aEst[i,1]
       oCol := MakeRepCol( oRep, i, oQry )
    ENDIF
NEXT i

oRep:oTitle:aFont[1] := {|| 3 }
oRep:bInit := {|| oQry:GoTop() }
oRep:bSkip := {|| oQry:Skip() }
END REPORT
ACTIVATE REPORT oRep WHILE !oQry:EOF() ON STARTPAGE oRep:SayBitmap(.1,.1,"LOGO.BMP",.5,.5)
oQry:End()
RETURN NIL

static function MakeRepCol( oRep, i , oQry)

   local oCol, bData, cPic, nSize
   local cAlign

   
   bData := { || oQry:FieldGet(i) }
   
   nSize       := oQry:FieldLen(i)
   cPic        := IF(oQry:FieldType(i)=="N",;
                       REPLICATE("9",oQry:FieldLen( i ))+"."+REPLICATE("9",oQry:FieldDec( i )),NIL)
   cPic        := IF(RIGHT(cPic,1)=".",LEFT(cPic,LEN(cPic)-1),cPic)
   if bData != nil

      cAlign   := If( oQry:FieldType(i) == "C", "LEFT", "RIGHT" )
      oCol := RptAddColumn( { { || oQry:FieldName(i) } }, nil ,;
                            { bData }, nSize, { cPic } ,;
                            nil, .f., nil ,;
                            cAlign, .F., .F., nil, ;
                            .f.,.f., ;
                            nil, nil, nil, nil )

   endif

return oCol
 


Tambien podrías llenar con .t. los campos que quieres por defecto que el listado incluya, en incluso agregar si quieres totalizar o no un campo.
Espero que al menos te sirva como guia.
Saludos

Re: REPORTE CON COLUMNAS DINAMICAS

PostPosted: Tue Jul 05, 2016 3:07 am
by joseluisysturiz
cmsoft wrote:Teniendo la consulta armada, lo que puedes hacer es permitir que los campos de la consultas sean o no elegibles de la siguiente manera:
Code: Select all  Expand view

FOR i := 1 TO LEN(oQry:aStructure)
    AADD(aEst,{.f.,oQry:FieldName(i)})
NEXT i
DEFINE DIALOG oDlg1 TITLE "Listado" FROM 03,15 TO 35,90
   @ 10, 10 SAY "Campos a incluir" OF oDlg1 PIXEL
    @ 25, 10 XBROWSE oBrw SIZE 105,80 pixel OF oDlg1 ARRAY aEst ;
      HEADERS "Muestra", "Campo";
      COLUMNS 1, 2 ;
      CELL LINES NOBORDER FASTEDIT
   WITH OBJECT oBrw
      :nEdittYPEs := 1
      :aCols[ 1 ]:SetCheck()
      :CreateFromCode()
   END  
   @ 45,10 BUTTON oBot1 PROMPT "&Imprimir" OF oDlg1 SIZE 30,10  ACTION ((mrta := .t.), oDlg1:End() ) PIXEL
   @ 45,20 BUTTON oBot2 PROMPT "&Cancelar" OF oDlg1 SIZE 30,10  ACTION ((mrta := .f.), oDlg1:End() ) PIXEL
ACTIVATE DIALOG oDlg1 CENTER
IF !mrta
   RETURN  NIL
ENDIF
REPORT oRep TITLE "Listado" FONT  oFont1,oFont2,oFont3 HEADER "Encabezado" RIGHT;
       FOOTER "Hoja:" + STR(oRep:npage,3) + SPACE(40)+"Fecha:"+DTOC(DATE())  PREVIEW
FOR i := 1 TO LEN(aEst)
    IF aEst[i,1]
       oCol := MakeRepCol( oRep, i, oQry )
    ENDIF
NEXT i

oRep:oTitle:aFont[1] := {|| 3 }
oRep:bInit := {|| oQry:GoTop() }
oRep:bSkip := {|| oQry:Skip() }
END REPORT
ACTIVATE REPORT oRep WHILE !oQry:EOF() ON STARTPAGE oRep:SayBitmap(.1,.1,"LOGO.BMP",.5,.5)
oQry:End()
RETURN NIL

static function MakeRepCol( oRep, i , oQry)

   local oCol, bData, cPic, nSize
   local cAlign

   
   bData := { || oQry:FieldGet(i) }
   
   nSize       := oQry:FieldLen(i)
   cPic        := IF(oQry:FieldType(i)=="N",;
                       REPLICATE("9",oQry:FieldLen( i ))+"."+REPLICATE("9",oQry:FieldDec( i )),NIL)
   cPic        := IF(RIGHT(cPic,1)=".",LEFT(cPic,LEN(cPic)-1),cPic)
   if bData != nil

      cAlign   := If( oQry:FieldType(i) == "C", "LEFT", "RIGHT" )
      oCol := RptAddColumn( { { || oQry:FieldName(i) } }, nil ,;
                            { bData }, nSize, { cPic } ,;
                            nil, .f., nil ,;
                            cAlign, .F., .F., nil, ;
                            .f.,.f., ;
                            nil, nil, nil, nil )

   endif

return oCol
 


Tambien podrías llenar con .t. los campos que quieres por defecto que el listado incluya, en incluso agregar si quieres totalizar o no un campo.
Espero que al menos te sirva como guia.
Saludos


CMSOFT, voy a revisar lo que me propones, igual te comento que al usuario no le dare lista de los campos...explico..es un xbrowse con varias columnas, asi como lo muestra Navarro en su primer mensaje, si el usuario quiere mandan imprimirlo como esta con todas las columnas que se ven en pantalla,

ejemplo: CODIGO - NOMBRE - CEDULA - DIRECCION - _....

pero luego se le ocurre hacer de ese mismo uno que sea solo... CODIGO - NOMBRE - _... y asi sucesivamente, la idea no es hacer un reporte con cada combinacion, sino que el usuario oculte o mueva las columnas que quiera..y cuando el decida entonces mande imprimir con las columnas en pantallas y si luego quiere otro pero con CODIGO - NOMBRE - DIRECCION, oculte _ y muestre DIRECCION, creo esta clara la idea..para no ser tan repetitivo, creo que oBrw:Report() hace parte de lo que quiero, ahora el punto es para agregarle por defecto el logo de la empresa y si hay alguna columna que lleve total saber cual es, que alli creo ayuda lo que sugieres, revisare con detalle...gracias...saludos... :shock: