Problemas con Reportlab
jmajadot
adminies.reinoaftasi en edu.juntaextremadura.net
Jue Dic 13 09:50:12 CET 2007
Creo que esta metido en un problema de recursividad, cada salto de
página vuelves a llamar a cotiz(cotiza)
Idea:
crea una función cabecera y otro proceso. En la cabecera iría todo salvo
el for de la consulta de productos, y en proceso, esta claro, el for.
Dentro de este último en cada salto de línea, vuelve a llamar a
cabecera.
otra cosa, no utilices el índice i >= 16, incrementa cuent_line y
controla con el la linea y vuelve a ponerlo a cero
SAludos
El jue, 13-12-2007 a las 00:22 -0400, hidura escribió:
> Buenas noches lista,
>
> Me encuentro generando un reporte en Reportlab y he tenido una desgracia
> cada vez que pasa de las 16 filas el reporte debe generar una segunda pagina
> para poder continuar pero en vez de generame la otra pagina me da un error
> fatal y no hace nada si pudieran darme una mano se los agradeceria aqui pego
> el fuente del reporte para que lo vean y me digan todo esta bien indexado
> solo es cuando se genera la segunda pagina que explota
>
>
>
> # -*- coding: utf-8 -*
>
>
>
> ### Import Modules
>
> from obje import con
> db = con()
> from reportlab.pdfgen import canvas
> from reportlab.lib.units import inch
> from reportlab.lib.pagesizes import letter,landscape
> import os
> import datetime
> import time
>
> ###Define With and Height for the page (This does not set the page
> properties)
>
> ancho=8.50
> largo=11
>
>
> #def __init__(idfactu):
> def cotiz(cotiza):
>
> cotiza.setTitle ("Cotización")
> #Draw Header Strings
> cotiza.setFont("Helvetica", 40)
> cotiza.drawString(2*inch, 10*inch, "Ocean Blue")
> cotiza.setFont("Helvetica", 12)
> cotiza.drawString(2*inch, 9.7*inch, "Direccion")
> cotiza.drawString(2*inch, 9.4*inch, "Telefono")
> cotiza.drawString(2*inch, 9.1*inch, "RNC")
> idfactu=91
> ## Obtener los datos del cliente
>
> cr = db.source()
> cr.execute("SELECT cliente FROM cotiz WHERE(id='%s')" % idfactu)
> c = cr.fetch()[0]
> clien = c[0]
> cr.execute("SELECT nombre FROM clientes WHERE(id='%s')" % clien)
> nomc = cr.fetch()[0]
> nombcli = nomc[0]
> cr.execute("SELECT direccion FROM clientes WHERE(id='%s')" % clien)
> dire = cr.fetch()[0]
> direc = dire[0]
> cr.execute("SELECT telefono FROM clientes WHERE(id='%s')" % clien)
> te = cr.fetch()[0]
> tel = te[0]
> cr.execute("SELECT celular FROM clientes WHERE(id='%s')" % clien)
> ce = cr.fetch()[0]
> cel = ce[0]
> cr.close()
> #Draw Clients Data
> cotiza.drawString(1.48*inch, 8.45*inch, "%s" % nombcli)
> cotiza.drawString(1.60*inch, 8.25*inch, "%s" % direc[0:12])
> cotiza.drawString(0.75*inch, 8.05*inch, "%s" % direc[12:])
> cotiza.drawString(1.55*inch, 7.75*inch, "%s" % tel)
> cotiza.drawString(1.55*inch, 7.50*inch, "%s" % cel)
> cotiza.setFont("Helvetica", 26)
> cotiza.drawRightString(7.5*inch, 9.5*inch, "Cotizacion")
>
> #Draw Square and Strings for the Client Data
> cotiza.rect(0.5*inch, 7.2*inch, 3.5*inch, 1.5*inch)
> cotiza.setFont("Helvetica", 12)
> cotiza.drawString(0.75*inch, 8.45*inch, "Cliente.:")
> cotiza.drawString(0.75*inch, 8.25*inch, "Direccion.:")
> cotiza.drawString(0.75*inch, 7.75*inch, "Tel.:")
> cotiza.drawString(0.75*inch, 7.50*inch, "Movil.:")
>
> #Draw Gridline for the Schema; and Signature Lines
> cotiza.grid([0.5*inch, 1.5*inch, 5*inch, 8*inch], [6.8*inch, 6.5*inch,
> 1*inch])
> cotiza.line(6.5*inch, 6.8*inch, 6.5*inch, 2*inch)
> cotiza.rect(5*inch, 1.00*inch, 3*inch, 0.25*inch)
> cotiza.rect(5*inch, 1.25*inch, 3*inch, 0.25*inch)
> cotiza.rect(5*inch, 1.50*inch, 3*inch, 0.25*inch)
> cotiza.rect(5*inch, 1.75*inch, 3*inch, 0.25*inch)
>
> cotiza.line(1*inch, 0.5*inch, 3.5*inch, 0.5*inch)
> cotiza.line(4.5*inch, 0.5*inch, 7.0*inch, 0.5*inch)
>
> #Draw Strings Inside The Schema
> cotiza.setFont("Helvetica", 12)
> cotiza.drawCentredString(1*inch, 6.6*inch, "Cantidad")
> cotiza.drawCentredString(3.25*inch, 6.6*inch, "Descripcion")
> cotiza.drawCentredString(5.75*inch, 6.6*inch, "Precio")
> cotiza.drawCentredString(7.25*inch, 6.6*inch, "Total")
> cotiza.drawString(5.05*inch, 1.82*inch, "Sub-Total:")
> cotiza.drawString(5.05*inch, 1.57*inch, "Impuestos:")
> cotiza.drawString(5.05*inch, 1.32*inch, "Otros:")
> cotiza.drawString(5.05*inch, 1.07*inch, "Total:")
>
> #Obtener los productos de dicha cotizacion
>
> pos_y = 6.50
> cr = db.source()
> cr.execute("SELECT id FROM cotiz_productos WHERE(id_cotiz='%s')"%
> idfactu)
> r = cr.ntuples
> w = cr.fetch(r)
> cuent_line = 0
> for i in range(0,r):
> t = w[i]
> q = t[0]
> pos_y = pos_y-0.25
> cr.execute("SELECT cantidad FROM cotiz_productos WHERE(id='%s')"% q)
> ca = cr.fetch()[0]
> cant = ca[0]
> cotiza.drawString(1*inch, pos_y*inch, "%s" % cant)
> cr.execute("SELECT producto FROM cotiz_productos WHERE(id='%s')"% q)
> idp = cr.fetch()[0]
> idpr = idp[0]
> cr.execute("SELECT nombre FROM productos WHERE(id='%s')"% idpr)
> no = cr.fetch()[0]
> nombr = no[0]
> cotiza.drawString(1.75*inch, pos_y*inch, "%s" % nombr)
> cr.execute("SELECT precio_vent FROM productos WHERE(id='%s')"% idpr)
> pc = cr.fetch()[0]
> prec = pc[0]
> cotiza.drawString(5.10*inch, pos_y*inch, "RD$%s.00" % prec)
> total = float(cant)*float(prec)
> cotiza.drawString(6.60*inch, pos_y*inch, "RD$%s0" % total)
> if (i >= 16):
> cotiza.showPage()
> cotiz (cotiza)
> cotiza.setFont("Helvetica", 40)
> pos_y= pos_y -10
>
>
> cotiza = canvas.Canvas("Cotizacion.pdf", pagesize=(ancho*inch, largo*inch))
> cotiz(cotiza)
> cotiza.showPage()
> cotiza.save()
> os.system("evince Cotizacion.pdf")
>
>
>
------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes
Más información sobre la lista de distribución Python-es