Page 1 of 2

Lineas de separacion en un Report

PostPosted: Thu Aug 02, 2007 10:33 am
by Rafael Clemente
Utilizo FWH 2.6 + Harbour. Para separar columnas de un report mediante una linea vertical hago:

COLUM TITLE "Mi titulo 1" DATA ......... GRID 1
COLUM TITLE "Mi titulo 2" DATA ........ GRID 1

¿Cómo puedo separar las lineas con una linea horizontal? (GRID 0 y GRID 2 dan "Error de acceso a array")
¿Alguien sabe alguna forma de pintar las rows del report alternativamente con fondo gris (como SHADOW) y blanco?

Gracias,

Rafael

PostPosted: Thu Aug 02, 2007 11:40 am
by Rafael Clemente
Buscando en los foros he encontrado respuesta a un par de mis preguntas:
1.- GRID 0 y GRID 2 exigen definir PEN en el report
2.- Para lineas de separación horizontal: ON CHANGE oReport:Separator() (Gracias, Paul - http://fivetechsoft.com/forums/viewtopi ... +separator)

Sigue en pie la pregunta sobre lineas de colores alternados
Saludos, Rafael

PostPosted: Thu Aug 02, 2007 12:07 pm
by Loren
Rafael

justo despues de definir las column del report y antes del END REPORT
tecleas

oReport:CellView()

y listo!!

Un saludo
LORENZO

PostPosted: Thu Aug 02, 2007 12:21 pm
by Loren
ups.... se me olvidó decirte que para alternar colores o sombras horizontales debes jugar con los "SHADOW" de cada columna. Es decir:

...
column title 'Mínimo' data str(minimo,6) SHADOW font 2 right grid
...
activate report infor ON STARTLINE versombra(infor)
...
...
funct versombra(infor)
Local nVeces
IF infor:aColumns[1]:lShadow
FOR nVeces := 1 TO Len(infor:aColumns)
infor:aColumns[nVeces]:lShadow := .F.
NEXT
ELSE
FOR nVeces := 1 TO Len(infor:aColumns)
infor:aColumns[nVeces]:lShadow := .T.
NEXT
ENDIF
RETURN NIL

y listo el pollo! el resultado final es bastante atractivo.
Un saludo.
LORENZO

PostPosted: Thu Aug 02, 2007 2:03 pm
by jrestojeda
Hola Lorenzo

Estuve probando lo que recomiendas, y me funcionó perfecto, de hecho está muy bueno.
Pero como siempre uno quiere un poco más, me surgió una duda.
Si quisiera en vez de intercambiar entre fila y fila del report entre otros colores distintos al gris y el blanco?
Qué debería agregar?
Desde ya muchas gracias
Saludos, Esteban

PostPosted: Thu Aug 02, 2007 2:55 pm
by Rafael Clemente
Lorenzo:
Lo probé y funcionó de maravilla. Muchas gracias
Rafael

PostPosted: Thu Aug 02, 2007 3:16 pm
by Armando
Esteban, Rafael:

Para poner la sombra en color, de hecho no es una sombra se trata de pintar un rectángulo con el color que desees, yo lo hago así, si no recuerdo mal es un aporte de The Full.

oReporte:bStartLine := {|o|IF(gMarca:nCounter % 2 == 0,SHADOWROW(o),)}

y esta es la función ShadowRow()

FUNCTION ShadowRow(oRep)
LOCAL nCols := LEN(oRep:aCols)
LOCAL nLine := IF(EMPTY(oRep:nDataLine),1,oRep:nDataLine)

IF oRep:oShdBrush == NIL
DEFINE BRUSH oRep:oShdBrush COLOR oRep:nClrShadow
ENDIF

SetBkMode(oRep:oDevice:hDCOut,1)

oRep:oDevice:FillRect( {oRep:nRow + 1,;
oRep:aCols[1],;
oRep:nRow + 1 + oRep:aDataHeight[nLine],;
oRep:aCols[nCols] + oRep:aColumns[nCols]:nWidth},;
oRep:oShdBrush)
RETURN (NIL)

Aquí pueden ver una imagen de lo obtenido

http://img183.imageshack.us/my.php?image=clip2xa3.jpg
http://img183.imageshack.us/img183/926/clip2xa3.jpg
Image

Saludos

PostPosted: Thu Aug 02, 2007 5:32 pm
by Rafael Clemente
Armando:
Muchas gracias por tu solución. Funciona perfectamente pero ¿cómo lo haces para que el header de cada grupo no se marque en color (cuando le toque una linea par)?
Rafael

PostPosted: Thu Aug 02, 2007 5:42 pm
by Armando
Rafael:

No me he topado con un problema así, seguramente es porque el reporte se imprime cuando el usuario elige solo una marca de repuesto entonces no hay un nuevo grupo en todo el reporte.

Saludos

PostPosted: Thu Aug 02, 2007 5:45 pm
by jrestojeda
Armando:

Muy buena tu solución funciona perfectamente para lo que yo estoy haciendo.
Desde ya muchas gracias.
Saludos, Esteban.

PostPosted: Thu Aug 02, 2007 6:07 pm
by Rafael Clemente
Armando:
Bueno; lo de los headers tampoco tiene demasiada importancia. Haré algunas pruebas más y veremos si saco algo en claro. Muchas gracias otra vez.
Rafael

PostPosted: Fri Aug 03, 2007 4:34 pm
by jrestojeda
Armando:

Me surgió una dudita más respecto a el tema de pintar las líneas de un report.
Yo cuando estoy activando el Report, en ON INIT voy a otra función donde ahí imprimo línea por línea.
He probado la función para pintar las líneas pero pinta todo, es decir no pinta línea por medio.

Code: Select all  Expand view
....

oReport:CellView()
oReport:bStartLine := {|oReport|IF(oReport:nCounter % 2 =0,PintaLi(oReport),)}

ACTIVATE REPORT oReport ON INIT ListDiaEnfer2(oReport,vMes,vAni,vDes,vHas,oDbf)
...
Return nil
//

//
Function ListDiaEnfer2(oReport,vMes,vAni,vDes,vHas,oDbf)

DO WHILE !oDbf:Eof()
   oReport:StartLine()
       oReport:Say( 1 , oDbf:NOMBRE , 1 , 1 )
   oReport:EndLine()
   oDbf:Skip()
ENDDO
Return nil
//

Pinta todo como si fuera una misma línea.

PostPosted: Fri Aug 03, 2007 4:58 pm
by Armando
Esteban:

Ummm, no entiendo para que utilizas la función ListDiaEnfer()
si la Clase TReport ya utiliza un DO WHILE para imprimir todos los registros de la DBF activa.

Podrías mostrar más código para ver como defines las columnas ?

Saludos

PostPosted: Fri Aug 03, 2007 5:10 pm
by jrestojeda
Code: Select all  Expand view
REPORT oReport TITLE Titulo CENTER;
       HEADER Empresa,Titulo2,Titulo3 LEFT;
       FOOTER "Fecha:"+DTOC(Date())+" Hora:"+Time()+" Pagina:"+STR(oReport:nPage,3) RIGHT;
       FONT oFont1,oFont2,oFont3,oFont4;
       PREVIEW;
       CAPTION "Vista previa del listado"


COLUMN TITLE "Código"          DATA " " CENTER SIZE 10
COLUMN TITLE "Emplado"         DATA " " CENTER SIZE 40
COLUMN TITLE "Días Enfermo"    DATA " " CENTER SIZE 10

ENDREPORT

oReport:oTitle:aFont[1]        :={|| 4}
oReport:oHeader:aFont[1]       :={|| 3}
oReport:oHeader:aFont[2]       :={|| 3}
oReport:oHeader:aFont[3]       :={|| 3}
oReport:aColumns[ 1]:bTitleFont:={|| 3}
oReport:aColumns[ 2]:bTitleFont:={|| 3}
oReport:aColumns[ 3]:bTitleFont:={|| 3}

oReport:CellView()

ACTIVATE REPORT oReport ON INIT ListDiaEnfer2(oReport,vMes,vAni,vDes,vHas)

DBCLOSEALL()
oFont1:End()
oFont2:End()
oFont3:End()
oFont4:End()
Return nil
//


Lo hago de esta forma porque dentro del DO WHILE necesito realizar otros procesos por cada empleado.

PostPosted: Fri Aug 03, 2007 6:03 pm
by Armando
Esteban:

Ok, podrías intentar dejando que la TReport haga su ciclo normal solo para probar si con eso se soluciona el problema del pintado, pues no veo otra razón.

Saludos