The problem is here

> db.task.id_person_released.requires       = IS_IN_DB( db,'person.initials', 
> '%(initials)s  |  %(name_first)s %(name_last)s')

and 'person.initials' shoud be 'person.id' for a reference field.

You also have a | instead of an &.

Anyway, here is a more compact notation that should work

#    Table Definitions

db.define_table("person",
    Field("initials",length=16, notnull=True,unique=True),
    Field("name_last",length=128, notnull=True),
    Field("name_first",length=128, notnull=False,default=''),
    format='%(initials)s  |  %(name_first)s %(name_last)s'
    )

db.define_table("category",
    Field("name",length=128, notnull=True,unique=True),
    format='%(name)s'
    )

db.define_table("task",
    Field("title", length=256, notnull=True),
    Field("description", "text"),
    Field("id_person_assigned", db.person, ondelete='NO ACTION'),
    Field("id_person_responsible", db.person, ondelete='NO ACTION'),
    Field("id_person_released", db.person, ondelete='NO ACTION'),
    Field("date_due", "datetime"),
    Field("date_nextcheck", "datetime"),
    format='%(title)s'
    )

db.define_table("task_category",
    SQLField("id_category", db.category),
    SQLField("id_task", db.task)
    )

task_category =
db((db.category.id==db.task_category.id_category)&(db.task.id==db.task_category.id_task))

I would also replace

    Field("initials",length=16, notnull=True,unique=True),

with

    Field("initials",length=16, compute=lambda row: ''.join(x[0] for x
in (row.first_name+' '+row.last_name).split())),



On Nov 17, 1:22 pm, asklucas <[email protected]> wrote:
> Hello!
>
> I'm new to web development and my trying web2py because of DRY and,
> most importantly, Python.
>
> I created a model, however I can't insert records in the admin
> interface because of a constraints-error I don't understand.
>
> When trying to insert a record 
> here:http://127.0.0.1:8000/task/appadmin/insert/db/task
>
> I get the Error Snapshot:
> <class 'pyodbc.IntegrityError'>
>     (
>         ('23000',
>         '[23000] [Microsoft][ODBC SQL Server Driver][SQL Server]
>         The INSERT statement conflicted with the FOREIGN KEY
> constraint "task_id_person_assigned__constraint".
>         The conflict occurred in database "taskdb", table
> "dbo.person", column \'id\'. (547) (SQLExecDirectW);
>         [01000] [Microsoft][ODBC SQL Server Driver][SQL Server]The
> statement has been terminated. (3621)'
>         )
>     )
>
> What I really want is to have dropdown fields in [task] for all three
> person-fields, where only persons from the list can be chosen or no
> one (a task could be created without yet assigning it to anybody).
>
> Additionally I'd like to have a field in [task] where I can choose 0
> to n categories.
>
> Thank you very much!
>
> Lucas.
>
> Model:
>
> <code>
> #    Table Definitions
>
> db.define_table("person",
>     Field("initials", "string", length=16, notnull=True, default=None,
> unique=True),
>     Field("name_last", "string", length=128, notnull=True,
> default=None),
>     Field("name_first", "string", length=128, notnull=False,
> default=None)
>     )
>
> db.define_table("category",
>     Field("name", "string", length=128, notnull=True, default=None,
> unique=True)
>     )
>
> db.define_table("task",
>     Field("title", "string", length=256, notnull=True, default=None),
>     Field("description", "text"),
>     Field("id_person_assigned", db.person, ondelete='NO ACTION'),
>     Field("id_person_responsible", db.person, ondelete='NO ACTION'),
>     Field("id_person_released", db.person, ondelete='NO ACTION'),
>     Field("date_due", "datetime"),
>     Field("date_nextcheck", "datetime")
>     )
>
> db.define_table("task_category",
>     SQLField("id_category", db.category),
>     SQLField("id_task", db.task)
>     )
>
> #    Table Relations
> #    (remove fields you don't need from requires)
>
> db.task.id_person_assigned.requires       = IS_IN_DB( db,
> 'person.initials', '%(initials)s  |  %(name_first)s %(name_last)s')
> db.task.id_person_responsible.requires    = IS_IN_DB( db,
> 'person.initials', '%(initials)s  |  %(name_first)s %(name_last)s')
> db.task.id_person_released.requires       = IS_IN_DB( db,
> 'person.initials', '%(initials)s  |  %(name_first)s %(name_last)s')
>
> task_category = db(
>     (db.category.id == db.task_category.id_category) | (db.task.id ==
> db.task_category.id_task)
>     )
> </code>

Reply via email to