Ops, sorry. Desconsider this. I used google translate because I develop in Portuguese. The correct: class VirtualFields:
The code in portuguese: iAdm = db.Table(db, 'iAdm', Field('nome',notnull=True), Field('obs'), Field('ativo','boolean',default=True), Field('dt','datetime',default=request.now), Field('user',db.auth_user,default=auth.user_id) ) iAdm.dt.writable=False iAdm.dt.readable=False iAdm.user.writable=False iAdm.user.readable=False db.define_table('tp_produto', iAdm, Field('pai','reference tp_produto'), ) db.tp_produto.pai.requires = IS_EMPTY_OR(IS_IN_DB(db, db.tp_produto.id, '%(nome)s')) db.tp_produto.nome.requires = IS_NOT_IN_DB(db, db.tp_produto.nome) db.define_table('fabricante', iAdm) db.fabricante.nome.requires = IS_NOT_IN_DB(db, db.fabricante.nome) db.define_table('fornecedor', iAdm, Field('CNPJ'), Field('contato'), Field('email'), Field('telefone') ) db.fornecedor.nome.requires = IS_NOT_IN_DB(db, db.fornecedor.nome) db.define_table('produto', iAdm, Field('tipo',db.tp_produto), Field('fabricante',db.fabricante), Field('quant','integer',default=0), Field('quant_min','integer',default=0) ) class VirtualFields: def prodEnt(self): return self.produto.quant_min * 2 db.produto.virtualfields.append(VirtualFields()) db.produto.tipo.requires = IS_IN_DB(db, db.tp_produto.id, '%(nome)s') db.produto.fabricante.requires = IS_IN_DB(db, db.fabricante.id, '% (nome)s') db.produto.nome.requires = IS_NOT_IN_DB(db, db.produto.nome) db.produto.id.represent = lambda valor: A(valor,_href=URL(r=request,c='default',f='editProduto',args=valor)) db.produto.nome.represent = lambda valor: A(valor,_href="#", _onclick="jQuery('#mdlEntrada').fadeIn(); return false") iOpr = db.Table(db, 'iOpr', Field('produto',db.produto), Field('fornecedor',db.fornecedor), Field('quant','integer'), Field('chamado'), Field('obs'), Field('ativo','boolean',default=True), Field('dt','datetime',default=request.now), Field('user',db.auth_user,default=auth.user_id) ) iOpr.produto.requires = IS_IN_DB(db,db.produto.id,'%(nome)s') iOpr.fornecedor.requires = IS_IN_DB(db,db.fornecedor.id,'%(nome)s') iOpr.dt.writable=False iOpr.dt.readable=False iOpr.user.writable=False iOpr.user.readable=False db.define_table('estoque', iOpr) db.define_table('entrada', iOpr, Field('NF'), Field('dt_garantia','date') ) db.define_table('saida', iOpr) The case to test virtual fields as made the most isolated as possible to ensure the error orign: I have remove table inheritance for table produto, and remove the represent. Correcting myself. The error does not occur in Appadmin but in a custom crud function: @auth.requires_login() def admin(): args = request.args titulo = 'administração' if not args: link = UL(*[LI(A(tab,_href=URL(args=tab))) for tab in db.tables]) return dict(items=link,titulo=titulo) if not args(1): i = 0 else: i =1 for tab in db.tables: if tab==args(i): tb = db[tab] if args(0)=='editar': form = crud.update(tb, args(2),next=URL(f='admin',args=args(1))) items = None titulo = 'Editar %s ' % args(i) else: form = crud.create(tb) rows = db().select(tb.ALL) items = SQLTABLE(rows,linkto='editar') titulo = 'Inserir %s ' % args(i) And the error: File "C:/web2py/applications/estoque/models/db.py", line 40, in prodEnt def prodEnt(self): return self.produto.quant_min * 2 File "C:\web2py\gluon\sql.py", line 733, in __getattr__ return dict.__getitem__(self,key) KeyError: 'quant_min' Exception: <type 'exceptions.KeyError'>('quant_min') Function argument list: (self=<Row {'estoque': <gluon.sql.Set object at 0x0531...'entrada': <gluon.sql.Set object at 0x0531B690>}>, key='quant_min') 728. 729. 730. 731. 732. 733. 734. 735. 736. 737. def __setitem__(self, key, value): dict.__setitem__(self, str(key), value) def __getattr__(self, key): return dict.__getitem__(self,key) def __setattr__(self, key, value): dict.__setitem__(self,key,value) * self: <Row {'estoque': <gluon.sql.Set object at 0x0531...'entrada': <gluon.sql.Set object at 0x0531B690>}> * dict.__getitem__: <method '__getitem__' of 'dict' objects> * builtindict: <type 'dict'> * key: 'quant_min' Creatin a new app test with the model: db.define_table('produto', Field('nome','string'), Field('quant','integer',default=0), Field('quant_min','integer',default=0) ) class VirtualFields: def prodEnt(self): return self.produto.quant_min * 2 db.define_table('produto2', Field('nome','string'), Field('quant','integer',default=0), Field('quant_min','integer',default=0) ) and controller: def adm(): return dict(f=crud()) Using the Appadmin or adm function to access the table produto, There appears prodEnt field in any situation. On Oct 21, 10:13 am, mdipierro <mdipie...@cs.depaul.edu> wrote: > I assume this is a typo: > > VirtualFields class: > > should be > > class VirtualFields: > > What is the error? Can you show the traceback? > > On Oct 21, 8:09 am, Savio Sabino <savi...@gmail.com> wrote: > > > Hello. > > I did the following test with virtual fields: > > > db.define_table('product', > > Field ('type', db.tp_produto) > > Field ('manufacturer', db.fabricante) > > Field ('qt', 'integer', default = 0), > > Field ('qt_min', 'integer', default = 0) > > ) > > db.product.type.requires IS_IN_DB = (db, db.tp_product.id, '% (name) > > s') > > db.product.manufacturer.requires IS_IN_DB = (db, db.manufacturer.id, > > '% (name) s') > > > VirtualFields class: > > def input(self): return self.product.qt_min * 2 > > db.product.virtualfields.append(VirtualFields()) > > > The version of web2py in use is 1.87.3 > > > The new virtual field appears neither in the appadmin. What's missing? > > > And, the line: > > > db.produto.virtualfields.append(VirtualFields()) > > > causes error in the access tables below it. > >