In the following link(1) bellow, Massimo explains how validation mechanism works: .... db.table.field2.requires=IS_NOT_IN_DB(db (db.table.field1==request.vars.field1),db.table.field2)
[1] http://groups.google.com/group/web2py/browse_thread/thread/e5ddcfc6ca019568/a143eb919c92735b?lnk=gst&q=unique+multiple+columns#a143eb919c92735b I didn't noticed that the correct field to validate is "n4" db.account_attributes.n4requires=IS_IN_DB( db, 'account_attributes.account_attribute', '%(n4)s' ) Instead "account_attribute" field: db.account_attributes.account_attribbute( db, 'account_attributes.account_attribute', '%(n4)s' ) After edit this part of code, the validation of form level worked correctly. It would be good in Web2py book an exemple that shows a case to validate uniqueness constraint of multiple fields. [2] http://www.web2py.com/book/default/chapter/07#Database-Validators Until to the next challenge! ;-) Greetings. Lenkaster On 26 maio, 16:27, Lenkaster <lenkast...@gmail.com> wrote: > Hi, > > I have some problems to validate in the form layer when a table has > uniqueness constraint with more than one column. The exemple following > explains the problem. > > I have a table where I need to store accounting numbers. Ex.: > > +==+==+==+==+ > |N1 |N2 |N3 |N4 | > +==+==+==+==+ > |1 |2 |3 |40 | > |1 |2 |3 |41 | > .... > > In the model > ------------------ > (with postgres or mysql) > > :: > db.define_table( > 'account_attributes', > Field('n1', length=10, required=True, notnull=True), > Field('n2', length=30, required=True, notnull=True), > Field('n3', length=40, required=True, notnull=True), > Field('n4', length=100, required=True, notnull=True), > Field( > 'account_attribute', > length=255, > notnull=True, > unique=True, > readable=False, > writable=False, > compute=lambda r: ('%s.%s.%s.%s' % (r.n1, r.n2, r.n3, > r.n4)).upper(), > ), > format="%(account_attribute)s", > ) > > Validations in the form layer are: > > :: > db.account_attributes.n1.requires=IS_NOT_EMPTY() > db.account_attributes.n2.requires=IS_NOT_EMPTY() > db.account_attributes.n3.requires=IS_NOT_EMPTY() > db.account_attributes.n4.requires=IS_NOT_EMPTY() > > db.account_attributes.account_attribute.requires=IS_IN_DB( > db, 'account_attributes.account_attribute', '%(n4)s' > ) > > In controller and view I use the Crud way, but if I try to insert the > same values without use admin interface, the application is broken > with database error: > > :: > IntegrityError: > ERRO: duplicar valor da chave viola a restrição de unicidade > "account_attributes_account_attribute_key" > DETAIL: Chave (account_attribute)=(1.2.3.40) já existe. > > Web2Py book shows how to validate single column, and in this forum I > see solutions to validate with a column that computes the values of > other four columns as above mentioned. > > I try too validates this way: > > :: > account_attribute_form='.'.join( > [request.vars.n1, request.vars.n2, request.vars.n3, > request.vars.n4] > ).upper() > db.account_attributes.account_attribute.requires=[ > IS_NOT_EMPTY(), > IS_NOT_IN_DB( > > db(db.account_attributes.account_attribute==account_attribute_form), > db.account_attributes.account_attribute > ) > ] > > Source consulted: > -http://www.web2py.com/book/default/chapter/07#Database-Validators > > -http://groups.google.com/group/web2py/browse_thread/thread/caaf68de3f... > > -http://groups.google.com/group/web2py/browse_thread/thread/e5ddcfc6ca... > > Obs: > In this case it is important to keep uniqueness constraint in database > layer. So I would like see your sugestions and opinions about that, > and where is my mistake? > > GreetingsLenkaster