Lineas de separacion en un Report

User avatar
Rafael Clemente
Posts: 365
Joined: Sat Oct 08, 2005 7:59 pm
Location: Barcelona, Spain

Lineas de separacion en un Report

Post 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
User avatar
Rafael Clemente
Posts: 365
Joined: Sat Oct 08, 2005 7:59 pm
Location: Barcelona, Spain

Post 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
Loren
Posts: 458
Joined: Fri Feb 16, 2007 10:29 am
Location: Cadiz - España

Post by Loren »

Rafael

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

oReport:CellView()

y listo!!

Un saludo
LORENZO
Loren
Posts: 458
Joined: Fri Feb 16, 2007 10:29 am
Location: Cadiz - España

Post 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
User avatar
jrestojeda
Posts: 543
Joined: Wed Jul 04, 2007 3:51 pm
Location: Buenos Aires - Argentina

Post 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
User avatar
Rafael Clemente
Posts: 365
Joined: Sat Oct 08, 2005 7:59 pm
Location: Barcelona, Spain

Post by Rafael Clemente »

Lorenzo:
Lo probé y funcionó de maravilla. Muchas gracias
Rafael
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Post 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
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
User avatar
Rafael Clemente
Posts: 365
Joined: Sat Oct 08, 2005 7:59 pm
Location: Barcelona, Spain

Post 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
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Post 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
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
User avatar
jrestojeda
Posts: 543
Joined: Wed Jul 04, 2007 3:51 pm
Location: Buenos Aires - Argentina

Post by jrestojeda »

Armando:

Muy buena tu solución funciona perfectamente para lo que yo estoy haciendo.
Desde ya muchas gracias.
Saludos, Esteban.
User avatar
Rafael Clemente
Posts: 365
Joined: Sat Oct 08, 2005 7:59 pm
Location: Barcelona, Spain

Post 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
User avatar
jrestojeda
Posts: 543
Joined: Wed Jul 04, 2007 3:51 pm
Location: Buenos Aires - Argentina

Post 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

....

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.
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Post 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
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
User avatar
jrestojeda
Posts: 543
Joined: Wed Jul 04, 2007 3:51 pm
Location: Buenos Aires - Argentina

Post by jrestojeda »

Code: Select all

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.
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Post 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
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
Post Reply