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.
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.
Comentarios
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..
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
Saludos.
Saludos!