Tabla con un dos campos que pertenecen a la misma tabla

46 views
Skip to first unread message

IvanaEmi

unread,
May 15, 2013, 7:50:19 PM5/15/13
to web2py-...@googlegroups.com
 Buenas Tardes!.. Web2py NO me informa de este error y me carga la BD igual.. solo que me muestra un comprobante incompleto solo el final donde dice FIRMAR!!..JE les cuento

Tengo una tabla boleto:
db.define_table('boleto',
    Field('area','integer',db.areas, required=True, notnull=True, label='Area'),
    Field('destino','integer',db.areas, required=True, notnull=True,label='Destino'),
    Field('fechaAlta','date', notnull=True,required=True, label='FECHA',readable=True,writable=False))



db.define_table('areas',
    Field('nombre', 'string', length=500, required=True, notnull=True, label='Área')
    )


Había probado con tener dos tablas "areas"y "destinos", pero ambas tablas son idénticas y estoy ocupando espacio en vano.. quiero redireccionarlas a la misma pagina.. el error CREOO que esta al momento de la relación cuando yo digo :

relacion= db((db.boleto.destino==db.areas.id)&(db.boleto.area==db.areas.id))

El sistema me guarda los datos correctamente pero cuando necesito imprimirlos sucede este error.. Yo mando la ID del boleto junto con esta relacion, para imprimir muestro :

<center><table width="90%" border="0">
{{for Ha in area:}}
<tr>
<td rowspan="2">{{=IMG(_src=URL('static','images/titulo.png'))}}</td>
</tr>
    <tr>
    <td align="right">ORIGINAL <b>Nº:</b>{{=Ha.boleto.id}} &nbsp; <b>Fecha:</b>{{=Ha.boleto.fechaAlta}}</td>
   </tr>
   
    <tr><td align="center" colspan="2"><B><u>BOLETO</u></B></td></tr>
    <tr><td colspan="2">&nbsp;</td></tr>
    <tr><td width="40%"><b>Área:</b> {{=Ha.areas.nombre}}</td> /*Hay otro modo de saber que campo especifico del boleto quiero que reemplaze osea cuando es el destino y cuando el area??*/
        <td><b>Destino:</b> {{=Ha.areas.nombre}}</td>
 
</table>
    <table width="90%" border="0">
    <tr><td colspan="3">&nbsp;</td></tr>
    <tr><td colspan="3">&nbsp;</td></tr>
 
    <tr>
        <td align="center">..................................</td>
        <td align="center">..................................</td>
        <td align="center">..................................</td>
    </tr>
    <tr>
        <td align="center"><b>Autorizó</b></td>
        <td align="center"><b>Controló</b></td>
        <td align="center"><b>Responsable</b></td>
    </tr>
    </table>

    Me muestra SOLO lo que esta en VIOLETA! :(  Nunca me paso de trabajar con dos campos de una misma tabla que se relacionen con otro tabla!..
y web2py no me muestra el error simplemente me imprime eso!.. Ni las imágenes se me ven o el texto.
GRACIAS POR SU AYUDA SIEMPRE!

Roberto Perdomo

unread,
May 15, 2013, 9:48:34 PM5/15/13
to web2py-...@googlegroups.com

En la primera tabla veo que te falta el cierre del tr final

El for necesita de un {{pass}} para saber en que punto se repetirá el código

Los campos área y destino de la tabla boleto son campos foráreneos[1] y web2py no los define de esa manera, debes tenerlos asi:

Field('area', 'reference areas'),
Field('destino', 'reference areas'),

Ahora, si quieres que cuando se imprima el boleto te muestre el nombre del área y no el id del registro, necesitas utilizar represent[2] algo así:

db.boleto.area.represent = lambda id,row: row.nombre
db.boleto.destino.represent = lambda id,row: row.nombre

No se que se me escapa, pero puedes ir mejorandolo con lo que te estoy pasando y vemos como va.

[1] http://web2py.com/books/default/chapter/29/06?search=reference#Self-Reference-and-aliases
[2] http://web2py.com/books/default/chapter/29/06?search=reference#Record-representation

Saludos!



--
Has recibido este mensaje porque estás suscrito al grupo "web2py-usuarios" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a web2py-usuari...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
 
 

IvanaEmi

unread,
May 16, 2013, 4:05:56 PM5/16/13
to web2py-...@googlegroups.com
Roberto Gracias por tu respuesta hice todo lo que me indicaste cambie el db.tablename, por el reference, y quite la definicion que tenia de la relacion JOIN, dentro del modelo defini los :


db.boleto.area.represent = lambda id,row: row.nombre
db.boleto.destino.represent = lambda id,row: row.nombre

y la hora de imprimir hago lo siguiente:
controlador:
def listando():
   area = db(db.boleto.id>0).select()
   return dict(area=area)

Vista:

<table width="90%" border="0">
{{for Ha in area:}}
    <tr>
    <td rowspan="2">{{=IMG(_src=URL('static','images/titulo.png'))}}</td>
    <td align="right">&nbsp;</td>
    </tr>
    <tr>
    <td align="right">ORIGINAL <b>Nº:</b>{{=Ha.id}} &nbsp; <b>Fecha:</b>{{=Ha.fechaAlta}}</td>

   </tr>
   
    <tr><td align="center" colspan="2"><B><u>BOLETO</u></B></td></tr>
    <tr><td colspan="2">&nbsp;</td></tr>
    <tr><td width="40%"><b>Área:</b> {{=Ha.area}}</td> /*Tuve que sacar el nbre de la tabla porque no tiraba el error, que boletos no tiene atributos*/
        <td><b>Destino:</b> {{=Ha.destino}}</td>
    </tr>

</table>
{{pass}}

Esto Me imprime pero, me muestra el ID del area y del destino. Otroa consulta estuve leyendo tengo que aplicar lo del ALIAS?, es decir
 como en el ejemplo: o no es necesario??
Father = db.person.with_alias('father')
>>> Mother = db.person.with_alias('mother')
>>> rows = db().select(db.person.name, Father.name, Mother.name,
      left=(Father.on(Father.id==db.person.father_id),
            Mother.on(Mother.id==db.person.mother_id)))
>>> for row in rows:
        print row.person.name, row.father.name, row.mother.name

Graciias!!
Reply all
Reply to author
Forward
0 new messages