+ All Categories
Home > Documents > Mini-Faq Report.pdf

Mini-Faq Report.pdf

Date post: 15-Dec-2015
Category:
Upload: rajeshbhans
View: 35 times
Download: 3 times
Share this document with a friend
Popular Tags:
15
11/21/12 Mini-Faq Report 1/15 D:/__C_OLD_DRIVE/ExternalDrive/PATCHES/CD-Rene/Todo para FiveWin/CD 2003/…/Mini-Faq Report.htm Mini-Faq Report Inicio Productos Brico- Five Enlaces Buscar Contactar sobre Clase Report / Printer by Thefull (Rafa Carmona) Todo lo que querias saber sobre Report y no tenias pajotera idea XD Ejemplos Agradecimientos Preguntas 1. Escoger un tipo de letra para una linea de los Headers, Footers y Titles. 2. Escoger la alineacion para una linea de los Headers, Footers y Titles, y de paso invertimos las letras. 3. Imprimir en una posicion determinada un Texto y un Bitmap. y poniendo un poco de color. 4. Saber la resolucion de la Impresora. 5. Porque el preview se descuadra todo. 6. Poner el Preview en MODAL 7. Hacer aparecer y desaparecer los SHADOW, creando un efecto bastante majo. 8. ¿ Como pongo la Fecha y Hora en Español en oBrw:Report() ? 9. ¿Como hacer que en mi factura se vea solamente en la primera linea el nºalbaran y no aparezca otro hasta que no sea diferente ? 10. ¿ Como imprimir en Apaisado/Horizontal ? 11. Establecer tamaño de la hoja 12. Manualidades. Creacion de un Recibo Standard. Alucina vecina!!! Sin tener un Scanner) con la Clase Printer 13. Preview o No Preview ? (Metodo cutre y Metodo Señorito) 14. Seleccionar cuantos registros imprimir por página. 15. Poner Titulos, Datos y Longitudes en las Columnas del Report pasadas como variables. ( Esto esta cogido del Foro) (Reproduccion Exacta, juro que no he tocado una coma .) 16. Poner los Margenes del Report en Cms. 17. Atentos a lo que poneis despues del ACTIVATE REPORT. Y como solucionarlo!!! 18. Poner el titulo de las columnas en otro FONT. 19. Saber la diferencia entre cualquier columna Total . 20. Usando el CmSay() de la Clase TPrinter en los Reportes 21. Analizando un poco a la hora de Imprimir. ( No gran cosa, la verdad sea dicha) 22. Truquetes y Consejos utiles: 23. Imprimiendo rectangulos redondeados con Printer y Report 24. Realizando Sub-Reportes. Como hacer un Reporte utilizando dos bases de datos a la vez. Ejemplos 08-02-2000 Rep0802.PRG -> Utilización del CmSay a Color !!y Orientacion de Fonts, con sombras en las columnas. 27-03-2000 RepRound.PRG -> Nuestro Reporte con BORDES REDONDEADOS!!!. 24-03-2000 RPreview.OBJ -> Ejemplo de un simple Analizador.Listo para linkar. 24-03-2000 Recibo.prg -> Nuestro querido Recibo pasa a ser un .prg 27-03-2000 RecRound.prg -> Nuestro recibo con los BORDES REDONDEADOS!!!! 24-03-2000 Anais.prg -> AnalizaPrn(). Lo de Anais viene de Cacherel XD 08-09-2000 SubRpt.prg -> Un Reporte con 2 bases de datos en juego. PERO ESO NO ES TODO!! Sombreado independiente de las lineas del cuerpo del reporte!!! Arfh!! Que me darhhh algorrr,Eduaaarrhgdorrr!! Descarga de ejemplos Inicio Agradecimientos Rene Flores Señores, este tio es un genio!!! Gracias a él por sus comentarios en el Foro esta Mini-Faq habría sido imposible. Es un tio cojonudo, eso si pa que suerte `prenda' le ties que llevar a comer. Creo que con el estomago lleno, se suerta!!! XD Mil gracias , Maestro. Joaquim Ferrer Compañero de penas y alegrías. Gracias a él , mis ojos ahora ven un poco más. Este tio es un 'monstruo' de Clipper/Five. ..y a todos los del Foro Como no, esa gente maravillosa que pupula por el Foro de Fivewin Spanish. Gracias , colegas Fivetech. Sobre todo a nuestro compatriota Antonio Linares, que gracias a su labor no hemos tirado Clipper, y seguimos dando guerra. Esperemos que con Haurbour la cosa continúe. Inicio Respuestas 1.- Escoger un tipo de letra para una línea de los Headers, Footers y Titles. Para escoger un tipo de letra para los Headers etc.. , es muy sencillo. Piensa en los objetos como un array dentro de otro array , etc.. Pues bien, los headers son unos arrays que contiene unas posiciones que
Transcript
Page 1: Mini-Faq Report.pdf

11/21/12 Mini-Faq Report

1/15D:/__C_OLD_DRIVE/ExternalDrive/PATCHES/CD-Rene/Todo para FiveWin/CD 2003/…/Mini-Faq Report.htm

Mini-Faq Report

Inicio

Productos

Brico-Five

Enlaces

Buscar

Contactar

sobre Clase Report / Printer

by Thefull (Rafa Carmona)

Todo lo que querias saber sobre Report y no tenias pajotera idea XD

Ejemplos Agradecimientos

Preguntas1. Escoger un tipo de letra para una linea de los Headers, Footers y Titles.

2. Escoger la alineacion para una linea de los Headers, Footers y Titles, y de paso invertimos las letras.

3. Imprimir en una posicion determinada un Texto y un Bitmap. y poniendo un poco de color.

4. Saber la resolucion de la Impresora.5. Porque el preview se descuadra todo.6. Poner el Preview en MODAL7. Hacer aparecer y desaparecer los SHADOW, creando un efecto bastante majo.8. ¿ Como pongo la Fecha y Hora en Español en oBrw:Report() ?9. ¿Como hacer que en mi factura se vea solamente en la primera linea

el nºalbaran y no aparezca otro hasta que no sea diferente ?10. ¿ Como imprimir en Apaisado/Horizontal ?11. Establecer tamaño de la hoja12. Manualidades. Creacion de un Recibo Standard. Alucina vecina!!!

Sin tener un Scanner) con la Clase Printer13. Preview o No Preview ? (Metodo cutre y Metodo Señorito)14. Seleccionar cuantos registros imprimir por página.15. Poner Titulos, Datos y Longitudes en las Columnas del Report

pasadas como variables. ( Esto esta cogido del Foro) (Reproduccion Exacta, juro que no he tocado una coma .)

16. Poner los Margenes del Report en Cms.17. Atentos a lo que poneis despues del ACTIVATE REPORT.

Y como solucionarlo!!!18. Poner el titulo de las columnas en otro FONT.19. Saber la diferencia entre cualquier columna Total .20. Usando el CmSay() de la Clase TPrinter en los Reportes21. Analizando un poco a la hora de Imprimir. ( No gran cosa, la verdad sea dicha)22. Truquetes y Consejos utiles:23. Imprimiendo rectangulos redondeados con Printer y Report24. Realizando Sub-Reportes.

Como hacer un Reporte utilizando dos bases de datos a la vez.

Ejemplos

08-02-2000 Rep0802.PRG -> Utilización del CmSay a Color !!y Orientacion de Fonts, con sombras en las columnas.

27-03-2000 RepRound.PRG -> Nuestro Reporte con BORDES REDONDEADOS!!!.

24-03-2000 RPreview.OBJ -> Ejemplo de un simple Analizador.Listo para linkar.

24-03-2000 Recibo.prg -> Nuestro querido Recibo pasa a ser un .prg

27-03-2000 RecRound.prg -> Nuestro recibo con los BORDES REDONDEADOS!!!!

24-03-2000 Anais.prg -> AnalizaPrn(). Lo de Anais viene de Cacherel XD

08-09-2000 SubRpt.prg -> Un Reporte con 2 bases de datos en juego. PERO ESO NO ES TODO!! Sombreado independiente de laslineas del cuerpo del reporte!!! Arfh!! Que me darhhh algorrr,Eduaaarrhgdorrr!!

Descarga de ejemplos

Inicio

Agradecimientos

Rene Flores

Señores, este tio es un genio!!! Gracias a él por sus comentarios en el Foro estaMini-Faq habría sido imposible. Es un tio cojonudo, eso si pa que suerte `prenda'le ties que llevar a comer. Creo que con el estomago lleno, se suerta!!! XD Milgracias , Maestro.

Joaquim FerrerCompañero de penas y alegrías. Gracias a él , mis ojos ahora ven un poco más.Este tio es un 'monstruo' de Clipper/Five.

..y a todos losdel Foro

Como no, esa gente maravillosa que pupula por el Foro de Fivewin Spanish.Gracias , colegas

Fivetech.Sobre todo a nuestro compatriota Antonio Linares, que gracias a su labor nohemos tirado Clipper, y seguimos dando guerra. Esperemos que con Haurbour lacosa continúe.

Inicio

Respuestas

1.- Escoger un tipo de letra para una línea de los Headers, Footers y Titles.

Para escoger un tipo de letra para los Headers etc.. , es muy sencillo. Piensa en los objetos como un array dentro de otro array , etc.. Pues bien, los headers son unos arrays que contiene unas posiciones que

Page 2: Mini-Faq Report.pdf

11/21/12 Mini-Faq Report

2/15D:/__C_OLD_DRIVE/ExternalDrive/PATCHES/CD-Rene/Todo para FiveWin/CD 2003/…/Mini-Faq Report.htm

Pues bien, los headers son unos arrays que contiene unas posiciones que almacenan como se comporta LINEA por LINEA ese array. La forma de hacerlo es muy sencilla :

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

Y que narices es esto ? La primera expresion oReport:oHeader:aFont es un array que contiene el tipo de letra por CADA linea que compone el Objeto oHeader, es decir que si le decimos oReport:oHeader:aFont[1] , le estamos diciendo que la PRIMERA linea de los oHeaders es la que queremos que cambie la fuente.

Y ese Codeblock ? Pues con ese Code le asignamos el tipo de Letra. y con el Code {|| 3 } le estamos diciendo a la Clase Report que utilice la fuente 3 QUE HEMOS DEFINIDO en la cabecera del REPORT, eih ?

Se me olvidaba poner una cabecera de Ejemplo ( I'm Sorry )

// Definir fuentes que usaremos en el Reporte DEFINE FONT oFnt NAME "Arial" SIZE 0,-9 DEFINE FONT oFnt2 NAME "Arial" SIZE 0,-10 BOLD DEFINE FONT oFnt3 NAME "Arial" SIZE 0,-9 BOLD DEFINE FONT oFnt4 NAME "Arial" SIZE 0,-19 ITALIC BOLD DEFINE FONT oFnt5 NAME "Times New Roman" SIZE 0,-18 BOLD DEFINE FONT oFnt6 NAME "Times New Roman" SIZE 0,-15 ITALIC BOLD

REPORT oReport CAPTION "Sub-Reportes " PREVIEW ; FONT oFnt,oFnt2,oFnt3,oFnt4,oFnt5,oFnt6 ; TITLE "Sub-Reportes","con sombreado de campos independientes",; "by TheFull( Rafa Carmona ) & Joaquim Ferrer" ; FOOTER " "," "," ","No dejes de visistarnos en :",; "http://www.getex.net/gentefive" CENTER

Ya está! Pos claro, el Tipo de Letra sera la oFnt3 que es la tercera que he

definido en la Clausula FONT, y afectara solamente a la primera linea Lo has cogido ? Pos si no, lo vuelves a leer macho. Esto se aplica de igual forma a los oFooter y a los oTitle.

Por ejemplo , haciendo esto a la cabecera de arriba : oReport:oTitle:aFont[1] := {|| 6 } oReport:oTitle:aFont[2] := {|| 6 } oReport:SetTxtColor(CLR_GREEN,6)

oReport:oTitle:aFont[3] := {|| 5 } oReport:SetTxtColor(CLR_HRED,5)

El resultado es el siguiente :

Inicio

2.- Escoger la alineacion para una linea de los Headers, Footers y Titles. y de paso invertimos las letras.( Como mola!)

Esto viene a raiz de una pregunta en en foro de Jesus Gerardo. Según el manual no es posible hacerlo, pero ... como Ignacio es un lince , va y nos ilumina con esto :

oReport:oHeader:aPad[6] := RPT_CENTER oReport:oHeader:aPad[7] := RPT_CENTER

Se supone que queremos centrar las lineas 6 y 7 del oHeader. Un ejemplo practico: Casi todas las facturas poseen una descripcion que pone: 'Sociedad inscrita blablabal....' a la Izquierda y de arriba a bajo. Pos nosostros somos asin de chulos y los hacemos en Fivewin. Otra vez 'Rene' dio en el Clavo y se me ilumino la cabeza :)

Definimos una fuente invertida 90 Grados. DEFINE FONT oFnt NAME "Arial" SIZE 0,-10 DEFINE FONT oFnt2 NAME "Arial" SIZE 0,-8 NESCAPEMENT 900

Utilizamos los Footers para que empiece desde abajo para arriba. REPORT oReport CAPTION "FACTURA Nº"+STR(oDbf:Factura) ; FONT oFnt,oFnt2 PEN oPen1 ; TITLE "Titulo " LEFT ; HEADER "Cabeceras" ; FOOTER "Esto esta CENTRADO a PIE de Pagina" ,; "Sociedad Inscrita en Blabalala...." CENTER ; PREVIEW

Pa chulos, nosotros : oReport:oFooter:aFont[2] := {|| 2 } // Pie de Empresa controlado la inclinación oReport:oFooter:aPad[2] := 1 // y la alineación independiente a la izquierda

Inicio

3.- Imprimir en una posición determinada un Texto y un Bitmap.

y poniendo un poco de color.

Page 3: Mini-Faq Report.pdf

11/21/12 Mini-Faq Report

3/15D:/__C_OLD_DRIVE/ExternalDrive/PATCHES/CD-Rene/Todo para FiveWin/CD 2003/…/Mini-Faq Report.htm

Los oReport:Say() solamente usarlos cuando queráis enseñar alguna cosa que coincida con una columna, puesto que son columnares, osease, el primer parámetro corresponde en que columna quieres mostrarlo, no es una coordenada de pixel, por ejemplo:

Tenemos un Reporte

Codigo Nombre Total

1290 Pepito 200

1234 Juanito 400

3434 Joselito Perez 800

Total Duplicado 2800

¿Como pongo 'Total' , 'Duplicado' y '2800' ? Muy Fácil:

oReport:Say(1,"Total") // En la primera columna oReport:Say(2,"Duplicado") // En la segunda columna oReport:Say(3,"2800") // En la tercera columna

Esto nos ira de perlas para cuando queramos poner alguna cosa en la misma columna del Report, sin tener que calcularlo nosotros.

Ahora con el ejemplo Subrpt.prg lo verás más claro.

Aqui puedes ver como el todo lo que esta sombreado, asin como la operacion y las columnas H/prep y H/Eje estan puesto con el oReport:Say()

Pero si queremos poner cualquier otro texto desperdigado por la página, utilizar el Metodo CmSay() de la Clase TPrinter, de la siguiente forma :

oReport:oDevice:CmSay(). Hay una pregunta , la 20 concretamente, que nos enseña a manejar el CmSay().

Para poner un BITMAP, puedes ponerlo en el evento STARPAGE , ENDPAGE, de esta manera verás los bitmaps en todas las paginas.

oReport:SayBitmap( nRow, nCol, cBitmap, nWidth, nHeight, nScale ) oReport:SayBitMap(2.5,.70,"C:\GESTION\FOTOS\IMPRESO.BMP",2.1,1.0,1)

Y ahora un tono de color de rosa :) Podemos cambiar el color de una linea simplemente :

TReport:SetTxtColor( nColor, nFont ) // La tercera fuente definida la pongo COLORADA ;) oReport:SetTxtColor(CLR_HRED,3)

//Mirate el ejemplo de las sombras , mas pa abajo TReport:SetShdColor( nColor ) oReport:SetShdColor(CLR_YELLOW )

TReport:SetPenColor( nColor ) //Cambias el color horizontal de los GRID oReport:SetPenColor(CLR_HCYAN )

Para poner el color de los GRID Verticales haces esto otro : DEFINE PEN oPen2 WIDTH 15 COLOR CLR_HMAGENTA REPORT etc..... COLUMN TITLE "Peazo de GORDO MAGENTA" ;

DATA Color->Muestra ; GRID 2

Obtienes los GRID verticales de color magenta y tamaño MUY GRANDE!!! /* La Font Italic cuando cobramos un millon $ al mes Nota : Ni con la Primitiva ;) */

Imaginemos que queremos poner en un COLOR y en una FUENTE distinta todos los campos de una determina condicion. Esa condicion es : Si el Precio es menor de 1000 Arial y ROJO Si es mayor Times Italic y Amarilla.

1.- Defimos las fuentes. DEFINE FONT oFont1 NAME "ARIAL" SIZE 0,-10 DEFINE FONT oFont2 NAME "ARIAL" SIZE 0,-14 DEFINE FONT oFont3 NAME "Times New Roman" SIZE 0,-10 ITALIC

2.- Cambiamos las fuentes de la columna que hemos ido declarando, pa tontos, esta es la cuarta que tengo definida :

COLUMN TITLE "primera" DATA Test->que COLUMN TITLE "segunda" DATA Test->lo COLUMN TITLE "tercera" DATA Test->sepas

//ESTA!!!! COLUMN TITLE "Millonarios La cuarta" DATA Test->Precio ; PICTURE "9,999,999" SIZE 9 //Y Esto hace este rollo!!!: oReport:aColumns[4]:bDataFont := {|| iif(Test->Precio>1000,3 ,2 ) }

//PERO ESTO HACE EXACTAMENTE LO MISMO COLUMN TITLE "Millonarios La cuarta" DATA Test->Precio ; PICTURE "9,999,999" SIZE 9 FONT iif(Test->Precio>1000,3 ,2 )

Escoje lo que mas te guste!!!

Page 4: Mini-Faq Report.pdf

11/21/12 Mini-Faq Report

4/15D:/__C_OLD_DRIVE/ExternalDrive/PATCHES/CD-Rene/Todo para FiveWin/CD 2003/…/Mini-Faq Report.htm

3.- Definimos los colores. oReport:SetTxtColor(CLR_HRED,2) // La segunda fuente definida Rojo Intenso oReport:SetTxtColor(CLR_YELLOW,3) // La tercera fuente definida amarilla

Inicio

4.- Saber la resolución de la Impresora.

Para saber la resolucion 'típica' de la Impresora preguntar a la DATA del Report por nLogPixX y nLogPixY

// Resolucion de la Impresora desde REPORT DpiX := oReport:nLogPixX DpiY := oReport:nLogPixY

O esto otro tambien vale : // Resolucion de la Impresora desde Report utilizando el Metedo de la // Clase TPrinter DpiX := oReport:oDevice:nLogPixelxX() DpiY := oReport:oDevice:nLogPixelxY()

// Utilizando la Clase TPrinter DpiX := oPrn:nLogPixelxX() DpiY := oPrn:nLogPixelxY()

Inicio

5.- Porque el preview se descuadra todo.

Esta pregunta se la hice a Ignacio en el Foro y pongo a continuacion sus mismas palabras.

De TheFull a Ignacio : Porque cuando defino diferentes fuentes y tamaños en los header footer y demas, el Preview se descuadra todo y en cambio en la Impresion sale de muerte ?

De Ignacio a TheFull : En mi opinion es un problema de los metafiles de Windows, que no son todo lo bueno que deberían ser. Y ello es debido a la conversión automatica de coordenadas que hace windows cuando se utiliza el modo Isotropico o anisotropico, para que me entiendas, la salida impresa se realiza sobre un dispositivo de contexto que es una hoja de impresora que tiene una resolución muy superior a una pantalla (la pantalla tiene 72 pixels por pulgada) y con unas dimensiones completamente distintas (sino dime en que se parece una hoja folio o DINA4 con la pantalla de tu ordenador) por lo tanto cuando se quiere mostrar esa misma información en una ventana hay que hacer una transformación de absolutamente todo lo que se imprime. Hay algunos drivers de impresora que lo hacen mejor que otros, lo que si es cierto, es que se debe evitar el uso de fuentes de sólo impresora, es decir, has de utilizar fuentes Truetype.

Windows 32 bits posee unos nuevos 'Enhanced metafiles', que funcionan mucho mejor, sin embargo de momento no estan implementados en Fivewin. En cualquier caso el mismo Word es bastante chapuzero mostrando previews.

=:-O Amigos, aqui queda eso. Y si Ignacio dice que se le va hacer, pos que se le va hacer.

Inicio

6.- Poner el Preview en MODAL.

Esto lo descubrimos mi amigo Joaquim y Yo en casa del otro. También he visto que 'Rene' dio otra de sus brillantes respuestas.

// Reportes en Modal!!! oReport:oDevice:lPrvModal := .T.

¿ Y que significa esto ? Significa que tu programa 'desaparece' para el usuario mientras este en el Previsualizador de Impresión, si no dará la impresión que esta en otro programa que no sea el tuyo, puesto que se abre otra ventana.

7.- Hacer aparecer y desaparecer los SHADOW, creando un efecto bastante majo.

Esta idea se me ocurrio cuando estaba diseñando un albaran. Vistos un monton de ellos me percate de que la mayoria pone una linea de diferente color. Puestos manos a la obra , cojo mi Fivewin y ¡¡Tachan!!

Lo primero es definir TODOS los campos que queremos sombrados con la clausula SHADOW.

//Variables lSombra := .T. //para verlas y el nColor := choosecolor() // Numerico de 10

Yo tengo creado un mantemiento de Empresas y coje los valores de la oDbf , pero para el ejemplo es un idea rapidilla

COLUMN TITLE "Cantidad" DATA IF(oLineas:cantidad == 0 ,; TRANSFORM(oLineas:Cantidad,"@Z"),oLineas:Cantidad) FONT 2 SIZE 6 SHADOW

COLUMN TITLE "Concepto" DATA oLineas:Concepto FONT 1 SIZE 65 SHADOW GRID 1

COLUMN TITLE "Precio" DATA IF(oLineas:Precio == 0 ,; TRANSFORM(oLineas:Precio,"@Z"),oLineas:Precio) FONT 2 SIZE 8

//Podemos hacer que Precio no tenga , no declarandola.

Page 5: Mini-Faq Report.pdf

11/21/12 Mini-Faq Report

5/15D:/__C_OLD_DRIVE/ExternalDrive/PATCHES/CD-Rene/Todo para FiveWin/CD 2003/…/Mini-Faq Report.htm

//Podemos hacer que Precio no tenga , no declarandola.

IF lSombras // Empresa quiere Sombras oReport:SetShdColor(nColor) // Para poner las sombras en Color que quiero ELSE FOR nVeces := 1 TO Len(oReport:aColumns) // Sin Sombras oReport:aColumns[nVeces]:lShadow := .F. NEXT ENDIF

En el ACTIVATE REPORT ON CHANGE ( IF(lSombras,Sombras(oReport),NIL) )

La función que hace el efecto es esta. /* Poner/Quitar sombras */ Static Func Sombras(oReport) Local nVeces

IF oReport:aColumns[1]:lShadow FOR nVeces := 1 TO Len(oReport:aColumns) oReport:aColumns[nVeces]:lShadow := .F. NEXT ELSE FOR nVeces := 1 TO Len(oReport:aColumns) oReport:aColumns[nVeces]:lShadow := .T. NEXT ENDIF RETURN NIL

Esto le hizo caer a mi Jefe la BABA!!! Espero que os guste. El resultado de este codigo aplicado a un programa ,quedaria asin :

Inicio

8.- ¿ Como pongo la Fecha y Hora en Español en oBrw:Report() ?

Pos aprovechando el dia en casa de Joaquim , y puesto que tambien aparecio en el grupo, veamos como podemos arreglar esto.

Lo Primero pillate el fichero \FW20\SOURCE\CLASSES\WBROWSE.PRG Despues lo editas, y buscas el metodo REPORT().

Encontraras esto: if lPreview REPORT oRpt TITLE cTitle PREVIEW ; HEADER "Date: " + DToC( Date() ) + ", Time: " + Time() ; FOOTER "Page: " + Str( oRpt:nPage, 3 ) else REPORT oRpt TITLE cTitle ; HEADER "Date: " + DToC( Date() ) + ", Time: " + Time() ; FOOTER "Page: " + Str( oRpt:nPage, 3 ) endif

Ahora esta linea la cambias , por ejemplo , a esta otra : if lPreview REPORT oRpt TITLE cTitle PREVIEW ; CAPTION cTitle ; // by TheFull , Quito el Five Report que sale. HEADER "Fecha: " + DToC( Date() ) + ", Hora: " + Time() ; FOOTER "Página: " + Str( oRpt:nPage, 3 ) else REPORT oRpt TITLE cTitle ; HEADER "Fecha: " + DToC( Date() ) + ", Hora: " + Time() ; FOOTER "Página: " + Str( oRpt:nPage, 3 ) endif Ahora la compilas y la enlazas con tu aplicacion y LISTO!!!

Inicio

9.- ¿Como hacer que en mi factura se vea solamente en la primera línea el nºalbaran y no aparezca otro hasta que no sea diferente ?

Tenemos un factura con estos campos :

NºALBARAN CONCEPTO TOTAL

192 Engranaje Helicoidal de 40 Dientes 150000.00

192 Sin Fin Modulo 1.5 Z5 25363.20

Page 6: Mini-Faq Report.pdf

11/21/12 Mini-Faq Report

6/15D:/__C_OLD_DRIVE/ExternalDrive/PATCHES/CD-Rene/Todo para FiveWin/CD 2003/…/Mini-Faq Report.htm

192 Sin Fin Modulo 1.5 Z5 25363.20

192 Sin Fin Modulo 2.34 Z2 1252.23

223 Probranado Tbala 25300.00

El efecto que digo es que aparezca de la siguiente forma :

NºALBARAN CONCEPTO TOTAL

192 Engranaje Helicoidal de 40 Dientes 150000.00

Sin Fin Modulo 1.5 Z5 25363.20

Sin Fin Modulo 2.34 Z2 1252.23

223 Probranado Tbala 25300.00

Una vez entendido el problema , yo lo he solucionado de esta forma : En la definición del Albaran pondremos una variable local en vez del objeto Database:

Local nAlbaran

COLUMN TITLE "" DATA IF(nAlbaran == 0 ,; TRANSFORM(nAlbaran,"@Z"),nAlbaran) FONT 2 SIZE 6 RIGHT

Y en el ACTIVATE REPORT en el evento ON STARTLINE (Muestra(oReport,oLineas,@nAlbaran))

Tiene que ser en el STARTLINE , NO en el ON CHANGE y si te fijas la variable nAlbaran es pasada por referencia

La función que hace esto es esta :

// Funcion que nos muestra si debe enseñar el nºalbaran o no // Reescrita un monton de veces porque utilizaba en evento del // ON CHANGE en vez del STARLINE y no funciona ni a dos velas // Gracias Joaquim!!! Te debo una!!! XD

Static Function Muestra(oReport,oLineas,nAlbaran) Static nPosterior := 0 ,lEntra := .T.

IF lEntra nAlbaran := oLineas:Albaran nPosterior := oLineas:Albaran lEntra := .F. ELSEIF nPosterior == oLineas:Albaran .AND. !lEntra .AND. nPosterior > 0 nAlbaran := 0 nPosterior := oLineas:Albaran ELSEIF nPosterior # oLineas:Albaran .AND. oLineas:Albaran > 0 nAlbaran := oLineas:Albaran nPosterior := oLineas:Albaran ELSEIF oLineas:Albaran == 0 nAlbaran := 0 nPosterior := 0 ENDIF Return nAlbaran

Inicio

10.- ¿ Como imprimir en Apaisado/Horizontal ?

oPrn:SetLandScape() //para hoja horizontal

oPrn:SetPortrait() // para hoja vertical. // Por defecto

Ten en cuenta que si la impresión sobrepasa en vertical , te dirá que saldrá en Apaisado.

Inicio

11.- Establecer tamaño de la hoja

PrnSetSize( <nAncho>, <nAltura> ) expresados en milimetros. Segun Ignacio , funciona en muy pocas impresoras, el motivo lo desconozco.

Inicio

12.- Manualidades. Creación de un Recibo Estándar. Alucina vecina!!! (Sin tener un Scanner) con la Clase Printer

Dado que cada dia que pasa , vamos adquiriendo mas conocimientos, (no sera gracias al English de la 5WIN!!!),vamos a crear un Recibo Standar Y QUE SIRVA PARA CUALQUIER IMPRESORA!!!

Argh!! (SS'L) Sangre , Sudor y Lagrimas!!! Que va!! Eso era al principio , pero he aqui como lo he hecho : (Advierto que esto me lo he currado en un par de horas) Este ejemplo funciona si lo compilas. La posiciones donde tiene que ir los campos o variables, os lo dejo que os lo curreis, yo solamente os pongo la miel en lo labios XD

24-03-2000 Ahora pasa el codigo fuente a Recibo.prg. Aqui tienes el resultado ya terminado :

Page 7: Mini-Faq Report.pdf

11/21/12 Mini-Faq Report

7/15D:/__C_OLD_DRIVE/ExternalDrive/PATCHES/CD-Rene/Todo para FiveWin/CD 2003/…/Mini-Faq Report.htm

Inicio

13.- Preview o No Preview ? (Metodo cutre y Metodo Señorito)

Hace tiempo alguien en el Foro alguien preguntaba como seria posible seleccionar si queria el Report por la pantalla o Impresora. Pues bien. Hay dos aclaraciones:

Pos tan tonto como esto : Function Imprimir(lMode) IF lMode PRINTER oPrn PREVIEW // Enseñame a cantar....oleole ELSE PRINTER oPrn // No me ensenes que ya se ;) ENDIF PAGE .... ENDPAGE ENDPRINTER

Esta es la manera que he encontrado , porque segun la docu, oPrn:Preview() se supone que nos muestra el PREVIEW , pero yo no lo he echo funcionar.( Mi english mezcla significados XD ) De todas maneras , esto chuta de momento.

( 2 horas mas tarde ) Si cojeis y compilais con la /P editas y veras como se monta el Preview.

Entonces nuestra function quedaria de esta forma, mucho mas elegante :

// Clase Tprinter Function Imprimir(lMode) //lMode .T. por pantalla oPrn := PrintBegin("Imprimiendo", .F., lMode,, .F. ) PAGE ....

ENDPAGE ENDPRINTER

En la Treport tres cuartos de lo mismo, el inconveniente es que ha diferencia de la TPrinter, la TReport tiene unas peazos declaraciones ,¡ que te voy yo a contar! :

IF lMode REPORT oRrp etc... PREVIEW ELSE REPORT oRrp etc... // SIN EL PREVIEW ENDIF COLUMN etc.... ENDREPORT !!!! Argh! Cachi in diez. Que Sistema mas cutre!!!

( 2 horas mas tarde mas las 2 horas anteriores = 4 horas )....

Pero todo en esta vida tiene solucion. Si os fijais en la Clase Treport(Report.prg), vereis en el METHOD New(..) donde dice 'Indicar Device', como Ignacio manda la Impresion a la pantalla , fichero, Impresora y oDEVICE! Aqui esta la solucion :

Antes de declarar el REPORT oReport, creamos nosotros el Device : Local lPantalla := .T. // Si es .F. saldra por Impresora

cCaption := "Definimos aqui el Caption del Report" oDevice := TPrinter():New(cCaption,.F.,lPantalla)

Lo que hacemos es montarlo nosotros mismos , en vez de que lo haga la Clase Report.

El Report entonces montara lo que nosotros le hallamos dicho.

REPORT oReport ... FONT ... PEN ... TITLE ... HEADER ... FOOTER ... TO DEVICE oDevice // Aqui esta la solucion

Pero recuerda no montarlo con PREVIEW o PRINTER , puesto que son incompatibles

Page 8: Mini-Faq Report.pdf

11/21/12 Mini-Faq Report

8/15D:/__C_OLD_DRIVE/ExternalDrive/PATCHES/CD-Rene/Todo para FiveWin/CD 2003/…/Mini-Faq Report.htm

¿¿Yasta!!! Cosa mas absurda!!! ¿ A que no te imaginabas que seria tan TONTO ?

Inicio

14.- Seleccionar cuantos registros imprimir por página

Ramon Jimenez, me pregunto, en el Foro, como seria posible imprimir un numero determinado de registros en la Clase TReport.

Siempre que puedo, intento probarlo antes de decir como se hace, y he llegado a la conclusion siguiente:

Fuera del REPORT .... creamos la variable nNumero := 1 Definimos el Report etc......

nNumero++ ACTIVATE REPORT oReport ; ON CHANGE (IF(nNumero ==10,(oReport:EndPage(),nNumero := 1),nNumero++))

En el Evento ON CHANGE comprobamos cuantos quiero enseñar, si la variable nNumero llega a 10, ha impreso 10 registros y nos pasa A MEJOR VIDA!! osease, Eject al canto, y empieza de nuevo donde lo dejo.

Inicio

15.- Poner Titulos, Datos y Longitudes en las Columnas del Report pasadas como variables. ( Esto esta cogido del Foro) (Reproduccion Exacta, juro que no he tocado una coma .)

De José Luis Groiss Buiza al Foro : Saludo foro: Se me plantea un problema, tengo definido un report, en el que las columnas se definen de la sigiente forma: * atitcol es un array con los titulos como elementos * datadato es una expresión * longdato es un valor numerico for i=1 to len(atitcol) coltitulo:=atitcol[i] column title coltitulo DATA &datadato SIZE longdato font 2 next i Pues bien todo va sobre ruedas, salvo que en el titulo de las columnas sólo me muestra en todas la columnas el título de la última definida ¿Como podría hacer para que en cada columna me diera el titulo definido? Gracias a todos y un saludo José Luis

De Ignacio Ortiz a Jose Luis : Jose Luis,

El problema es que realmente el valor de DATA se convierte en un codeblock y cuando se evalua i siempre vale len(aticol). La solución es un poco enrevesada pero es la siguiente:

for i=1 to len(atitcol) coltitulo:=atitcol[i] column title coltitulo DATA GenVar(coldata, i) SIZE longdato font 2 next i

function GenVar(coldata, i) return coldata[i]

El truco consiste en crear lo que se llama una detached local. --FIN--

(Eigh???) ¿?-D

Si ha alguien le sirve, aqui esta. Si quieres ver un ejemplo , lo tienes en GenteFive. Cojete el zip que explica la Clase TPanel() y verás lo que significa esto de una forma practica.

Inicio

16.- Poner los Margenes del Report en Cms.

Pues bien, si quereis empezar por la parte superior a 4.5 cms, con el metodo Margin() no se puede!! Comorr?? No es posible!!. Si, ya se que las NG dice que se puede :

oReport:Margin(nValor,Tipo,Scale), o lo ques lo mismo : Cms := 4.5 Tipo := 4 // Para Margen Superior. Ver NG para TIPOS Scale := 2 // Para que sean cms oReport:Margin(Cms,Tipo,Scale)

Pues muy simple, Ignacio los convierte a enteros, por tanto no se puede poner a 4.5 cms, solamente a 4,5,6....20etc... ¡ Si, ya sé lo pijotero que es ponerlo a 4.5 pero es que

TENIA QUE PONERLO A 4.5!!!

Mirate la Clase, Report.prg METHOD MARGIN(...)

// Perdon. Esta linea es lo que lo hace a Enteros. IF nScale == RPT_CMETERS nValue := Int(nValue/2.54) ENDIF

Page 9: Mini-Faq Report.pdf

11/21/12 Mini-Faq Report

9/15D:/__C_OLD_DRIVE/ExternalDrive/PATCHES/CD-Rene/Todo para FiveWin/CD 2003/…/Mini-Faq Report.htm

Y Porque ? Y YO QUE SE!!! XD. Preguntarle a Ignacio. ( Yo ya se lo he preguntado , ya te dire algo si me contesta )

Y como los pongo ? Pues con el nTopMargin. El nTopMargin esta expresado en pixels,(creo, pues tengo puesto 600, vamos,como una moto), que es lo mismo que la definicion de lo de arriba , pero se lo asignamos nosotros , y entonces NO nos lo pasara a entero.

Pues para ponerlos como centimetros hacemos una conversion : // Convertimos Cms a pixels // Ponemos Margen Superior e Izquierdo a cms aARRAY := oReport:oDevice:Cmr2trPix(4.5,2.34)

// Ponemos Margen Superior e Izquierdo a cms independiente de la impresora oReport:nTopMargin := aArray[1] oReport:nLeftMargin := aArray[2]

*Array := Arreglo , para los amigos del otro lado de la charca!!! ;)

Si miramos el valor de aArray[1] veremos que para la resolucion de : [720dpi --- 1190.06pix] [360dpi --- 595.44pix] y [300dpi --- 493.26pix] [360dpi --- 594.88pix]

Todas imprimen en el mismo sitio Ya lo tenemos!! Esto es aplicable tambien a los demas Margenes.

Pero OJO!! Para los margenes Superior e Inferior teneis que usar el primer elemento del Array , y para los de la Izquierda y Derecha utilizar el segundo elemento del Array, dicho de otro modo,

// SUPER MAL!!! aArray := oReport:oDevice:Cmr2trPix(4.5,0) oReport:nLeftMargin := aArray[1] // ESTO SI QUE NO!!!! // SUPER BIEN y Te lo juro por Snoppy XD aArray := oReport:oDevice:Cmr2trPix(0,4.5) oReport:nLeftMargin := aArray[2] // ESTO SI QUE SI!!!!

La razon de todo ello radica a la hora de hacer la conversion, si no , mirate lo que hace el METHOD Cmtr2Pix(...) // Printer.prg Clase TPrinter METHOD Cmtr2Pix( nRow, nCol ) CLASS TPrinter // Superior o Inferior. Resolucion Vertical nRow := Max( 0, ( nRow * 10 * ::nVertRes() / ::nVertSize() ) - ::nXoffset ) // Derecha e Izquierda. Resolucion Horizontal nCol := Max( 0, ( nCol * 10 * ::nHorzRes() / ::nHorzSize() ) - ::nYoffset ) return { nRow, nCol }

Y todo este rollo para poder poner .5 cms de más. :-D

Inicio

17.- Atentos a lo que poneis despues del ACTIVATE REPORT.

He descubierto de que si poneis un MSGYESNO(..) despues del ACTIVATE, os podeis encontrar con estas sorpresas :

1.- Si no es MODAL , osease, que te muestra la ventana del Preview en otra ventana, te preguntara despues de que se hayan generado

todas las páginas. ( Quizas este no presente un problema )

2.- Pero hay de ti que lo pongas MODAL!!! Quina Desfeta!!! Resulta que nos enseña la pantalla de Preview, y como es modal y no esta nuestro programa hasta que no salgamos, resulta que el MsgYesNo() sale despues de salir del Preview, pero NO PERTENECE A NUESTRO PROGRAMA!!! Puede pertenecer a la última ventana de Carpeta que hallamos abierto, hasta al Escritorio de Windows, con lo que , a veces , desaparece misteriosamente el MsgYesNO(), y NO PUEDES NI IR A MIPC., Se oye ese peazo de fistro de tone pitpitpitpti cada vez que pulsas el button del MOOUSSE,jo que english el mio :) Comunicare este posible Bug a Ignacio haber que me comenta y ya os comentare alguna cosa o ya lo vereis en el foro.

Al dia siguiente, y ver una vez más como en el foro te vienen a ayudar ;( , vamos , que corren que se las pelan. Entonces encontre la solucion :

Antes del declarar el Report , creamos una variable :

Local hDc := GetActiveWindow() // Coge handle de la ventana activada // antes de entrar en el Preview de la TREPORT //Declaramos REPORT

REPORT oReport etc.....

ACTIVATE REPORT oReport Etc....

oFont:End() etc... SetActiveWindow(hDc) // Vamos a la ventana antes declarada IF MSgYEsNO("Imprimir Recibo","") Recibos(oDbf,oCLientes) ENDIF oDbf:Close() oCLientes:Close()

Inicio

18.- Poner el titulo de las columnas en otro FONT.

Leonardo Olexyn, toma la manguera XD

Page 10: Mini-Faq Report.pdf

Pos tan simple como esto :

Ponemos la cuarta columna definida , la cuarta fuente definida ;)

oReport:aColumns[4]:bTitleFont := { || 4 }

Y ya esta!!! Cuesta creer lo absurdo de estas cosas, no crees ? :-0

Inicio

19.- Saber la diferencia entre cualquier columna Total .

Pregunta en el foro de Willi Quintana.( Actualizado )

Cogemos las columnas que esten totalizadas, por ejemplo :

REPORT ... COLUMN oCol1 TITLE "DAATOS" DATA IF(oLineas:Precio == 0 ,; TRANSFORM(oLineas:Precio,"@Z"),oLineas:Precio) FONT 2 SIZE 9 RIGHT TOTAL

COLUMN oCol2 TITLE "" DATA IF(oLineas:Total == 0,; TRANSFORM(oLineas:Total,"@Z"),oLineas:Total) FONT 1 SIZE 10 RIGHT TOTAL

// Utilizar los ON que mas os convengan. ON ENDPAGE, ON END, ON POSTEND ACTIVATE REPORT oReport ON ENDPAGE( Diferencia (oReport )) ON END ( Diferencia2( oCol1,oCol2 ) )

Static Func Diferencia( oReport ) Local nDif := oReport:aColumns[1]:nTotal - oReport:aColumns[2]:nTotal // Diferencia en la 1 y 2 Columna oReport:CmSay(1,1,"Diferencia:" +STR(nDif) ) RETURN NIL

// Tratamos la Columna directamente como un Objeto COLUMN Static Func Diferencia2( oCol1,oCol2 ) Local nDif := oCol1:nTotal - oCol2:nTotal // Diferencia entre el Objeto Columna oCol1 y oCol2 oReport:CmSay(1,1,"Diferencia:" +STR(nDif) ) RETURN NIL

Inicio

20.- Usando el CmSay() de la Clase TPrinter en los Reportes

Como yo , y supongo que la mayoria, estaba usando el metodo Say de la Clase TReport, hasta que nos dinos cuenta, TA DAS CUEN!!!, del grosso error, por no utilizar el Metodo CmSay()de la Clase TPrint. Y CAMBIATE ANTES DE QUE SEA DEMASIADO TARDE!!!!

Pues vamos a explicar como funciona y un par de ejemplos con la TPrinter y la TReport.( Es lo mismo )

CmSay( nRow, nCol, cText, oFont, nWidth, nClrText, nBkMode, nPad )

nRow := Fila en Cms nCol := Columna en Cms cText := ¿ Alguna duda ? XD oFont := Fuente a Utilizar nWidth := Misterio!!!(Mirate la Clase). No le pases nada y punto. nClrText := Colorines. Pasale la funcion ChooseColor() para que veas como funciona. ;) nBkMode := Un Valor numerico nos dice como mesclar el Texto con el Fondo 1 Transparente 2 Opaco nPad := Alineacion. PAD_LEFT es por Defecto #define PAD_LEFT 0 #define PAD_RIGHT 1 #define PAD_CENTER 2

Pero lo bueno , es que, ha diferencia del oReport:Say , con este tenemos un mayor control. Y como lo utilizo ? Pos para el Report.

oReport:oDevice:cmSay(5,0,"HOLA",oReport:aFont[8],NIL,oReport:aClrText[8]) oReport:oDevice:cmSay(5,2,"DON PEPITO",oReport:aFont[9],,CLR_GRAY)

Ostia!! Que he esto! , mi vida ? :-D

oReport:aFont es un array que contiene todas las fuentes que utilizamos en el Report, en este caso le estamos diciendo que vamos a utilizar la 8 fuente declarada. Y el oReport:aClrText es un array con los colores de esas fuentes, en este caso le estamos diciendo que utilice el color 8 que tiene esa fuente, que por defecto es negra, y se cambia ¿ Comoor? con el oReport:SetTxtColor(), que ya lo tendrias que saber.

Y el Otro ejemplo, ves como puedes poner directamente el color, no tiene porque ser el tenias definido en la fuente.

Este ejemplo es para la Clase Tprinter,más sencillo : oPrinter:cmSay(5,2,"HOLA, DON JOSE",oFont1,,CLR_GRAY)

Inicio

21.- Analizando un poco a la hora de Imprimir. ( No gran cosa, la verdad sea dicha)

¡Pero menos da una piedra! Esta rutina la he tenido que hacer para poder ver en que impresora estoy

Page 11: Mini-Faq Report.pdf

11/21/12 Mini-Faq Report

11/15D:/__C_OLD_DRIVE/ExternalDrive/PATCHES/CD-Rene/Todo para FiveWin/CD 2003/…/Mini-Faq Report.htm

Esta rutina la he tenido que hacer para poder ver en que impresora estoy realizando un Reporte o una impresion a traves de la Clase Printer, asi como varias variables, ya que tengo varias impresoras , y a cada una le da por imprimir en un sitio diferente, y de tanto cambiar de 'Predeterminada' , al final , SIEMPRE tengo que ir a buscar las impresoras y saber cual es la que tengo activada.*Dolor de Cabeza XD

¿ Y como funciona esto ? AnalizaPrn( oDevice ) --> Le pasamos el objeto oPrn, o en caso de un reporte oReport:oDevice PRINT oPrn AnalizaPrn(oPrn) PAGE END PRINT

Report oReport .....

// Utiliza el evento que mas te convenga. ACTIVATE REPORT oReport StarPage(AnalizaPrn(oReport:oDevice))

Esto puede ser un engorro, puesto que despues debes eliminar la llamada a la rutina. Pero se puede hacer de otra manera , sin tener que escribir NI UNA SOLA LINEA DE CODIGO EN TU PROGRAMA!!! Sabia que lo sabias XD

Utilizando el RPreview.Prg que teneis en \fw20\source\classes\. Lo primero lo cojes y lo copias, a tu directorio de trabajo.

Buscas esta linea , puede ser la 277. @ 7, 370 SAY oPAGE PROMPT TXT_PAGENUM ....etc.

Pones debajo este boton,(los pijoteros que se pongan un bitmap si quieren) // Ponemos un boton a la barra de botones DEFINE BUTTON oBoton OF oBar ; MESSAGE "Analizador By TheFull" ; ACTION AnalizaPrn(oDevice) ; TOOLTIP "Sabiendo valores del Objeto Printer"

Y añadimos la funcion al Final del mismo.( Ver rutina en Anais.prg ) Compilamos y enlazamos nuestro RPreview modificado. Cuando termines , puedes quitarlo del enlazador , y que utilice por defecto el de 5Win.

Si, ya sé que se puede modificar la Clase Tprinter , ponerle una DATA lAnaliza := .F., el boton del Rpreview, quedaria asi :

if oDevice:lAnaliza == .T. // Ponemos un boton a la barra de botones endif y si queremos que salga desde nuestro codigo , añadiremos oPrn:lAnaliza := .T. para analizar, y lo quitamos para que no salga.

Pero no me gusta trastear con las Clases de 5Win.( y la verdad soy medio ignorante , de momento, sobre este tema )

Amigos nos vemos en el Pais Vasco.!!!!

Ya sabes el dicho, si una cosa funciona, NO LA TOQUES. XD

Utiliza la forma que más te guste, pero si solamente quieres hacerla servir como funcion y no modificar el Rpreview, al Dialogo quitale el NOWAIT para que se pare, y puedes verlo antes de Imprimir.

Mirate el Anais.prg. No lo dejo aqui por que esto se eleva pa el cielo.

Inicio

22.- Truquetes y Consejos útiles:

-¿ Por que se me 'come' la Impresora los Margenes ?

A la hora de Imprimir recordar que hay drivers de Impresora , QUE NO NOS DEJARAN MODIFICAR LOS MARGENES, por ello empezar a 1 cm de cada esquina, porque puede que la impresora se te 'coma' parte de tu Impresion, porque como empieces a 0,1cm y el margen de tu impresora, que no puedes modificarlo de ninguna de las maneras, te empiece a 0,5cm , ya te veo , reescribiendo las coordenadas. Te lo digo por experiencia. XXDD

-¿ Porque el Report en distintas resoluciones me empieza antes o despues el margen superior ?

Cuando el Report empieza toma unos valores por defecto, y el margen Superior esta expresado en pixels, por tanto, cuando cambias de resolucion en la impresora los Headers, Titles etc... cambian de posicion , o más para arriba del Margen Superior(mayor resolucion de la Impresora) o mas para abajo( menor resolucion de la Impresora ), descuadrando las posiciones si por ejemplo,tenias una caja hecha en cms. Para que SIEMPRE te imprima en la misma posicion, independientemente de la resolucion , debes de poner el Margen Superior , con el metodo Margin() en cms , y ya todos tus reportes saldran bien.

- ¿ Como puedo saber si mi programa funcionara en otro Impresora ?

Pues muy sencillo: Instala el Driver de una impresora cualquiera. Seleccionala como preterminada. Los listados y/o Reportes ponerlo en modo PREVIEW, ( Porque si no , TE APARECERAN MARCIANOS EN TU IMPRESORA >:-D ) Mandala a imprimir. Si sale bien, pues bien , y si no ,ya sabes que con esa FISTRA impresora no te va a funcionar. Especialmente a lo que posiciones de BITMAPS se refiere.

Yo tengo configurado la factura (Ver .GIF) para que puede salirme en:

-HP DESKJET 500 300x300 ( Este driver ha sido la calle de la Amargura)

Page 12: Mini-Faq Report.pdf

11/21/12 Mini-Faq Report

12/15D:/__C_OLD_DRIVE/ExternalDrive/PATCHES/CD-Rene/Todo para FiveWin/CD 2003/…/Mini-Faq Report.htm

-HP DESKJET 500 300x300 ( Este driver ha sido la calle de la Amargura)

-Diferentes impresoras como las EPSON/HP 300x300,180x180,360x360,600x600,720x720. osease, las Inyeccion de tinta y las Lasers.

Quizas cuando encuentre la manera de poner las columnas dentro de un BITMAP , y este no se me vaya dependiendo de la impresora para la derecha , y dependiendo de la resolucion , ya lo reportare por aqui.

- No me cansaré de decirlo. UTILIZAR el Metodo :CmSay() de la Printer en los Reportes, no el suyo, que es columnar. (Se nota que he tenido que reescribir todos mis reportes, XD )

Inicio

23.- Imprimiendo rectangulos redondeados con Printer y Report

Esto si que ha traido cola estos dias en el Foro!! :)

Y AHORA A TRAVES DEL API DE WINDOWS!!! ( Gracias a Jose Lalin )

En desconocimiento te juega malas pasadas. El error que cometia es que lo enviaba al Objeto oPrn, en vez del dispositivo de salida del objeto, oPrn:hDcOut, osease, al Metafile actualmente en uso.Y claro, NO APARECIA NADA

Asi nos quedaria la funcion ( Mirate y Compila RecRound.prg ) El resultado lo puedes ver ahora mismo:

CAJAROUND(1,1,10,30,100,100,oPrn,oPen,oBrush) // Desde la Clase TPrinter

El funcionamiento de la Clase Report es un poco enrevesado: ( Mirate y Compila RepRound.prg ) Si utilizamos , por ejemplo, el evento ON STARTPAGE( oReport,oBrush ), ves que solamete le paso el objecto oReport, y no le paso el oPen, ¿porque ?, porque el oReport YA LO TIENE, si no , mira: // Desde la Clase Report CAJAROUND(1,1,10,30,50,50,oReport:oDevice,oReport:aPen[2],oBrush) pero la Clase no tiene un arrays de Brush, por tanto, si se lo tenemos que pasar, y despues acordarnos de eliminarlo , oBrush:End()

Utiliza el dispositivo de salida del reporte , oReport:oDevice, oReport:aPen es un array que contiene todos los PENS que utilizamos en el Report, en este caso le estamos diciendo que vamos a utilizar el 2 pen declarada, en la definicion del REPORT oReport PEN oPen,oPen2.., y pasamos el Objeto Brush, para el fondo.

/* Dibuja un rectangulo con los bordes redondeados CAJAROUND(..) 2 Rev.27.03.2000 - Le pasamos oBrush para el Fondo

Parámetros : - nArriba,nIzq,nAbajo,nDerecha := Coordenadas en Cms de los bordes - a,b := Bordes Alto y Ancho - oPrn := Dispositivo de Impresion - oPen := Pen a usar - oBrush := Brush a usar. */

Function CAJAROUND(nArriba,nIzq,nAbajo,nDerecha,a,b,oPrn,oPen,oBrush) LOCAL hOldPen, xCor := {} , yCor := {} local hOldBrush // Pasamos coordenadas de cms a pixel xCor := oPrn:Cmtr2Pix(nArriba,nIzq) yCor := oPrn:Cmtr2Pix(nAbajo,nDerecha) // Guardamos el Lapiz y la brocha que teniamos hOldPen := SelectObject( oPrn:hDcOut, oPen:hPen ) hOldBrush := SelectObject( oPrn:hDcOut, oBrush:hBrush ) //Dibujamos el rectangulo redondeado

roundrect(oPrn:hdcOut,xCor[2],xCor[1],yCor[2],yCor[1],a,b) // y seleccionamos el que habiamos guardado selectObject( oPrn:hDcOut, hOldPen ) selectObject( oPrn:hDcOut, hOldBrush ) RETURN NIL

// Llamada al Api de Windows..---------------------------------------------- DLL FUNCTION RoundRect( hDC AS WORD, ; iLeft AS _INT , iTop AS _INT, ; iRight AS _INT, iBottom AS _INT, ; iWidth AS _INT, iHeight AS _INT ) AS BOOL PASCAL LIB "GDI.EXE"

Inicio

Page 13: Mini-Faq Report.pdf

11/21/12 Mini-Faq Report

13/15D:/__C_OLD_DRIVE/ExternalDrive/PATCHES/CD-Rene/Todo para FiveWin/CD 2003/…/Mini-Faq Report.htm

Inicio

24.- Realizando Sub-Reportes. Como hacer un Reporte utilizando dos bases de datos a la vez.

Bueno, como pasa el tiempo. Parece que fue ayer cuando escribí esto. Bien, bien. Por cierto, ya ma o meno se como va esto de los objetos, gracias al Maestro Rene Flores, que nos dio 'lecciones' en el Pais Vasco.

Vamos a meollo de la cuestión , y empezando un poco lo que vamos hacer: Imagina que tenemos la base de datos de los clientes, y que cada cliente a su vez , tiene varias formas de pagos.

-¿ Como se haría un Reporte que contemple los datos del cliente, y todas las formas de pago que tiene ? Asi quedaría el Reporte :

Cliente Forma de Pago

Pepe Luis Contado

tel:7767

Giro 90 dias

Recibo 90 Dias

Eduadorr

Tel:2298

Talon

cheque

pagare

Lo más sensato seria realizarlo a traves de la Clase Printer, controlandolo todo, saltos de lineas , posiciones, variables de acumulados,etc... pero ya sabeis, esta Mini-Faq esta dedicada mayormente a los Reportes, pues lo haremos con los reportes!!

Pero no solo haremos esto, si no que aprenderemos como sombrear independiente los campos. Por ejemplo : Que solamente el cliente tenga la sombra y el tipo de letra , por ejemplo, Arial 12, y que el telefono la font por defecto, para ello nos crearemos un par de funciones y ya esta!.

El ejemplo que vamos a explicar , será un poquito más complicado que el de arriba descrito, pero la mecanica es la misma.

Compilar el SubRpt.prg, y vereis de que os hablo.

Lo primero una vez abiertas las bases de datos, atentos que trabajamos con Databases, que para quien no sepa ,vera lo que nos ahorramos de codigo.

Bueno Seguimos... ;)

------------------------------------------------------ Definimos el Reporte como toda la vida . REPORT oReport CAPTION "Sub-Reportes" ; FONT oFnt,oFnt2,oFnt3; TITLE " Un titulo "; PREVIEW ------------------------------------------------------

Bueno aqui esta la primera caracteristica. El Nombre del Cliente lo vamos a montar nosostros, solamente le diremos a la clase Report que nos reserve el espacio apropiado con el valor de la DATA "" y a continuacion ponemos los otros datos que nos interese, como una llamada a una funcion , etc..

COLUMN TITLE "Caracteristicas" DATA "", ; "Exterior="+Str(oDbf:Exterior,6,2)+" Paso="+; str(oDbf:Paso,9,6)+" Z="+Str(oDbf:Z,3),; PolMoleta(oReport,oDbf) FONT 3 SIZE 30 ------------------------------------------------------ Estas cuatro columnas nos lo montaremos nosotros, cogiendo los datos de otra dbf, y los montaremos en el Report. Lo que hacemos es reservar el espacio para que el Report , nos reserve el espacio apropiado.

COLUMN TITLE "Operacion" DATA "" SIZE 41 GRID COLUMN TITLE "H/Prep" DATA "" GRID COLUMN TITLE "H/Ejec" DATA "" GRID COLUMN TITLE "Precio" DATA "" SIZE 9

------------------------------------------------------ El Skip del Report nos pintara el Cliente y despues saltará. Aqui es donde pondremos en el Reporte el Nombre del Cliente, en el Skip del reporte. Ingenioso, no crees! ;)

oReport:bSkip := {|| oDbf:Skip(),CltSombra(oReport,oDbf) }

------------------------------------------------------ Ahora nos queda activarlo. Si os fijais en el Evento CHANGE lo utilizamos para realizar el reporte de la segunda dbf. Y en el ON INIT debe de ser llamado para que nos pinte el primero de todos , si no, nos dejariamos uno sin pintar.

ACTIVATE REPORT oReport ; WHILE !oDbf:Eof() ; ON CHANGE( Tiempos(oTiempos,oDbf,oReport)) ; ON INIT ( CltSombra(oReport,oDbf) )

------------------------------------------------------ Seguis po ahi, no os vayais que viene lo más fuerte: Las dos funciones que realizan el milagro, son..son.. ;)

Operaciones en el Reporte Esta funcion nos mete todos los campos de la otra dbf en el Report.

Page 14: Mini-Faq Report.pdf

Static func Tiempos( oTiempos,oDbf,oReport )

Aqui debemos Scopear o Filtrar la dbf con el codigo de la otra dbf. Para quien no utilize los scopes, esto quedaria sobre el FILTER de la siguiente manera:

(oTiempos:cAlias())->(DbSetFilter()) // Quitamos cualquier filtro (oTiempos:cAlias())->(DbSetFilter({||Field->Codigo == oDbf:Codigo}) )

Y con los scopes ( Utilizar los Scopes!! ) (oTiempos:cAlias())->(OrdScope(0,oDbf:Codigo)) (oTiempos:cAlias())->(OrdScope(1,oDbf:Codigo))

oTiempos:Gotop() // Nos ponemos en el primero

oReport:BackLine(2) // Tira el Report 2 lineas para atras

while !otiempos:Eof() // Bucle de toda la vida // Fijaos . Estamos montando las columnas!!!!

oReport:say(2,oTiempos:Operacion,,) oReport:say(3,oTiempos:Prep,,2) oReport:say(4,oTiempos:Eje,,2) oReport:say(5,oTiempos:Precio,,2) oTiempos:Skip() // Salto de Linea nueva. // No utilizar el metodo NewLine() oReport:StartLine() ; oReport:EndLine() end while // Poniendo Footers!!!! oReport:StartLine() ; oReport:EndLine() // Con esto se te quedara cara gilipollas Sombra( oReport,2 ) oReport:say(2,"Fecha "+DTOC(oDbf:Fecha),3,1) oReport:say(2,"Piezas("+Str(oDbf:Piezas,4)+")",3,2) Sombra( oReport,4 ) oReport:say(4,"Total...",3,1) Sombra( oReport,5 ) oReport:say(5,oDbf:Total,3,2) oReport:StartLine() ; oReport:EndLine() // NewLine() // Linea Separadora oReport:Separator() return .T.

Pero hay una pequeña pega a todo esto, los oReport:Say en un principio puedes coger el tipo de fuente, pero , siempre hay un pero , como el Report ya nos ha calculado el espacio de las columnas , tiene un ancho ya definido, por lo tanto , deberemos de utilizar la misma anchura de fuente, o similar, de lo contrario se nos metera en el espacio de la de más abajo. Pero bueno, puedes ponerle negrita , o subirla un par de numeros por encima, para distinguirlas.

------------------------------------------------------ Columna Cliente Sombreada individualmente. Lo guapo de esto es que ira sombreada y con un tipo de fuente diferente ;)

Static Func CltSombra( oReport,oDbf ) // Se comprueba si no es final de Fichero // porque cuando el ultimo skip viene para aqui if !oDbf:Eof() // Todavia tienes cara gilipollas XD Sombra( oReport,1 ) // En la columna 1 pones el Cliente con el tipo letra 2 oReport:say(1,oDbf:Cliente,2,) endif return .T.

Como puedes ver esto es 'tirao'

Aqui ya se te quitara la cara gilipollas que se te estaba quedando ;) Es similar al Metodo Shadow() de la Clase Report, con la diferencia que soy yo donde le digo en que columna quiero poner la sombra, porque la Report te dibuja toda la fila.

//Le pasamos el Reporte y la columna que quiero. Static Func Sombra( oReport ,nFor ) // Alto de la Fuente Standard. // Recuerda. La fuente standard es la primera definada en la //declarancion del Report, en este caso oFnt1 Local nHeight := oReport:nStdLineHeight Local nGrid := 0 Local oShdBrush

// Nos creamos un objecto Brocha, con el color de las sombras // que tiene el Reporte. // Puedes pasarle un color a parte y cogerlo, tu mismo // Mas tarde... bueno, ya te lo hecho yo en el ejemplo DEFINE BRUSH oShdBrush COLOR oReport:nClrShadow

// Preparado para imprimir en modo trasnparente SetbkMode( oReport:oDevice:hDCOut, 1 )

// Y realiza la sombra de la columna oReport:oDevice:FillRect({oReport:nRow ,; oReport:aCols[nFor] -nGrid ,; oReport:nRow+nHeight ,; oReport:aCols[nFor]+oReport:aColumns[nFor]:nWidth+nGrid} ,; oShdBrush) // Muerete , marditoorr!!! XD oShdbrush:End() return NIL

Bueno, miraros el ejemplo SubRpt.prg, y vereis la sorpresa, ya que esta un pelin más currao que todo esto.

Page 15: Mini-Faq Report.pdf

11/21/12 Mini-Faq Report

15/15D:/__C_OLD_DRIVE/ExternalDrive/PATCHES/CD-Rene/Todo para FiveWin/CD 2003/…/Mini-Faq Report.htm

que esta un pelin más currao que todo esto. Pa despues digan que no se puede hacer en Fivewin.

Inicio

(c) Rafael Carmona Grande. Texto revisado a 11 de septiembre de 2.000

Inicio Subir

Página actualizada a: 12 de septiembre de 2.000 (c) 2000 Joaquim Ferrer & Rafael Carmona. Todos los derechos reservados.


Recommended