viernes, 5 de diciembre de 2008

Lección No. 8

Nuevamente retomaremos la lección 6 con sus últimas modificaciones, o sea, la de la Lección No. 7, con el fin de aprender a hacer reportes de dos tipos: en html para visualizar en el navegador y en formato pdf.



Materiales para esta lección
El material de la lección número 6
El ReportLab que lo encontramos en.....
2 iconos de 16x16 para el menú reporte html y reporte pdf


Lección No. 8
Recuperamos la última modificación que reposa en la lección No. 7, creamos un menú denominado Reportes y debajo de éste se mostrarán las opciones: Formato html y Formato Pdf, agregamos los íconos para el menú.

Algo parecido a esto es lo que debemos tener:


Y sin más preámbulos vamos a programar el menú Formato html; creamos entonces una función (ya debes saber cómo crear una función para un menú, si no es así entonces te recomiendo que leas las lecciones anteriores) a la que denominaremos genera_html y este es el código:

En la parte superior del código debemos colocar las librerías que vamos a utilizar, así como configurar la conexión a MySQL:

import MySQLdb as con
db = con.connect(host='localhost',user='root',passwd='12345678',db='leccion6')
c = db.cursor()
import subprocess
import sys
import datetime
import os

Buscamos la función que acabamos de crear y digitamos nuestro código:

def genera_html(self,event): #init function
#add your code here
self.imprime()
f = open("C:/REPORTES/mascotas.html", "w")
f.write(self.cadena)
f.close()
if sys.platform == "win32":
subprocess.Popen('explorer C:\\REPORTES\\mascotas.html', shell=True)
else:
subprocess.Popen('firefox C:\\REPORTES\\mascotas.html', shell=True)
return #end function

El anterior código lo que hace es llamar a una función denominada imprime() [que debemos crear enseguida], abrir un archivo en modo de escritura (“w”) ubicándolo en la carpeta REPORTES que se encuentra en la raíz del C: (que no te pase, de una vez y antes de ejecutar el programa crea una carpeta en el disco duro donde se almacenarán los reportes), luego verifica si la plataforma sobre la que estamos trabajando es basada en win32 para abrir el internet explorer, sino abre el Firefox.

Ahora debemos crear la función imprime(), para ello solo buscate un espacio libre (puede ser debajo de la función anterior) y escribe como sigue:


La anterior función lo que hace es tomar una variable para concatenarla utilizando código html en la cual colocamos los encabezados de la tabla, la segunda parte de este código está determinada por una consulta sql y en el for lo que hacemos es reemplazar %s por el resultado de la consulta (bueno, estoy tratando de explicar de la forma más sencilla posible!!).

Guarda y ejecuta el programa. Al ejecutar el programa espera algo así como unos tres o cuatro segundos y se abrirá el navegador con el resultado de la consulta que aparece enmarcado dentro de una tabla.

Si todo va bien hasta ahora entonces podemos pasar a crear el reporte en pdf.

Lo primero es descargarnos la última versión del ReportLab que al día de escribir este tutorial anda por la 2.2, se puede descargar de http://www.reportlab.org/

ReportLab trae un binario denominado ReportLab-2.2.win32-py2.5.exe el cual una vez descargado no es sino dar doble clic y seguir las instrucciones de instalación (siguiente, siguiente,.... y listo).

Para verificar si quedó correctamente instalado el pdf puedes hacer la prueba desde la consola de windows como se muestra en la imagen:

Si no te aparece ningún error es porque todo marcha bien.

- Creamos una función para programar el pdf.
- Buscamos la función y allí escribimos

En la parte superior del código agregamos las librerías que vamos a utilizar, en este caso las del reportlab

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib.units import inch

Luego vamos a la función que hemos creado y allí escribimos lo siguiente:

def genera_pdf(self,event): #init function
#add your code here
sql = c.execute('SELECT * FROM mascotas ORDER BY especie')
res = c.fetchall()

"""Determino la ubicación del reporte, el
tamaño y la orientación del papel a utilizar"""
ca = canvas.Canvas("c:/REPORTES/mascotas.pdf",pagesize=letter)
ca.setFont("Helvetica-Bold",14)
ca.drawString(30,750,"MASCOTAS") #Título
ca.drawString(30,735,u"Ejemplo de Reporte PDF") #Subtítulo

#Defino el tipo y tamaño de la fuente
ca.setFont("Times-Roman",10)
"""Ubico los campos factura y fecha
consultados de la base de datos"""
ca.drawString(30,655,u"Código")
ca.drawString(65,655,"Nombres")
ca.drawString(150,655,"Familia")
ca.drawString(230,655,"Especie")
ca.drawString(280,655,"Sexo")
ca.drawString(310,655,"F. Nacimiento")
ca.drawString(380,655,"F. Muerte")

y = 655

col1 = 30
col2 = 95
col3 = 315
col4 = 425

for i in res:
y = y - 10
y1 = y - 1

codigo = str(i[0])
nombres = str(i[1])
familia = str(i[2])
especie = str(i[3])
sexo = str(i[4])
nace = str(i[5])
muere = str(i[6])


ca.drawString(col1,y,codigo)
ca.line(30,y1,225,y1) #Dibuja la linea (x1,y1,x2,y2)

ca.drawString(65,y,nombres)
ca.line(65,y1,225,y1)

ca.drawString(150,y,familia)
ca.line(150,y1,225,y1)

ca.drawString(230,y,especie)
ca.line(230,y1,225,y1)

ca.drawString(280,y,sexo)
ca.line(280,y1,225,y1)

ca.drawString(310,y,nace)
ca.line(310,y1,225,y1)

ca.drawString(380,y,muere)
ca.line(430,y1,225,y1)

ca.showPage()
ca.save()

os.system('c:/REPORTES/mascotas.pdf') #Muestra el pdf

return #end function

Ejecuta el programa y prueba a generar el pdf, debes obtener algo como esto:

Intenta cambiar los valores de las variables del reportlab para que te des cuenta como funcionan, sino, igual adjunto un archivo en pdf que encontre hace ya muchos días en www.linux-magazine.es con un pequeño pero buen tutorial sobre el manejo de reportlab.

6 comentarios:

Anónimo dijo...

no conocia este blog y la verdad es que me ha encantado!. Muy buenos los tutoriales!!!!!. Sigue escribiendo tutoriales!!!!.

Administrador dijo...

Hola Manuel otra vez yo por aqui, estuve practicando algo con wx.grid y pues intente hacer esto:
En tu leccion 7 hiciste un llenado de un grid con datos de la base de datos mediante un boton y luego al seleccionar la celda o fila apareciera el dato en los text box.. hasta hay todo OK.
Pero ahora yo quice que a la hora de seleccionar la celda o fila se agregaran dicho datos en otro GRID y entonces me salio todo ok..pero me surgio el problema cuando selecciono otra celda de la grilla1 la grilla2 no se actualiza con la fila que seleccione..
Espero que revises este ejemplo que hice y busques una solucion. Gracias.
Aqui te dejo el link en megaupload para descargar mi ejemplo:

http://www.megaupload.com/es/?d=SLBUQ5KH

GRACIAS..

Unknown dijo...

Oye fenomenal tus tutoriales, estoy realizandolos paso a paso, porque estoy muy interesado en aprender a manejar Wx, en unos dias mas te mando unos codigos de ajuste de curvas o metodos numericos, para contribuir a lo mucho que me estas ayudando con tus tutoriales, gracias y por aqui seguimos

Unknown dijo...

hermano! muchas gracias por tus tutoriales, me fueron de extrema ayuda, y por lo que veo no solo a mi.
sinceramente creo que con personas como vos el mundo encuentra nuevos caminos alternativos que llevan al hombre a la evolucion. Esa evolucion compartida.
soy nuevo en python, y ya me apasiona,
quizas si conoces un enlace donde pueda encontrar un listado de los metodos. pues en java la codificacion se nutre con el punto
posterior al objeto , que te lista
los metodos correspondientes. gracias

Anónimo dijo...

Hola nuevamente!, quisiera saber si publicaras algo sobre como manejar controles en diferentes ventanas, por ejemplo, listboxes, ventanas padres e hijas, etc!.

Saludos.

Guillermo Ramos dijo...

Acabo de encontrar este blog por la lista de correo y es simplemente genial, gracias por el trabajo que le estás poniendo a los tutoriales, realmente son de ayuda.
Saludos!