Hey dps,
Thanks for your reply. It is definitely getting closer, you're right, the
reference was a good idea, I hadn't put it in because if a tr_items, item
doesn't exist in product I wanted it to be added.
I now have:
Model:
db.define_table('products_summary',
Field('product', unique=True),
Field('cumulative_amount', default='0', type='double'))
db.define_table('tr_items',
Field('products_summary_id', 'reference products_summary',
writable=False),
Field('item'),
Field('amount', type='double'))
Controller:
def index():
form = SQLFORM(db.tr_items)
if form.process().accepted:
item_in_out = form.vars.item
amount_in_out = form.vars.amount
db.products_summary.update_or_insert(db.products_summary.product==item_in_out,
product=item_in_out,
cumulative_amount=db(db.products_summary.product).select(db.products_summary.cumulative_amount)[0]["cumulative_amount"]+form.vars.amount)
response.flash = T("Product: %s Amount: %d") % (item_in_out,
amount_in_out)
return locals()
It is getting closer, but it isn't quite right: I seem to have two
problems:
1 - When both databases are empty, and I first try to add an item I get the
following error:
<type 'exceptions.IndexError'> list index out of range
2 - The [0] for the cumulative seems to reference the very first product,
take that amount and then add the amount the user entered in tr_item and
add them - I am trying to have the amount for the same product (or create a
new product with amount 0) and then add the tr_item amount to it.
Thanks again!!
On Tuesday, 17 November 2015 00:13:42 UTC, Dave S wrote:
>
>
> On Sunday, November 15, 2015 at 11:58:01 AM UTC-8, RedBeard wrote:
>>
>> Hi,
>>
>>
> Hi. See below (inline)
>
>
>> I have only just started learning python and web2py so please bear with
>> me.
>>
>> When a user inserts an item and amount in tr_items, I am trying to have
>> the system check whether the item exists in products_summary, if it does,
>> update the amount by the amount input by the user into tr_items - if it
>> doesn't exist, the product should be added to products_summary and the
>> amount set to the amount input by the user.
>>
>> Below I have put in three variations that most make sense, but I have
>> tried a whole load of different possibilities. Any ideas on how I could go
>> about solving this problem would be great!
>>
>> Model:
>>
>> db.define_table('products_summary',
>> Field('product'),
>> Field('cumulative_amount', default='0', type='double'))
>>
>>
>> db.define_table('tr_items',
>> Field('item'),
>> Field('amount', type='double'))
>>
>>
>>
> Are products_summary.product and tr_items supposed to be the same
> identification? If so, you may want to change one to a reference to the
> other.
> See <URL:
> http://web2py.com/books/default/chapter/29/06/the-database-abstraction-layer#Field-types>,
>
> where "reference" is one of the field types.
> More at <URL:
> http://web2py.com/books/default/chapter/29/06/the-database-abstraction-layer?search=reference+type#One-to-many-relation
> >
>
>
>
>
>>
>> Controller:
>>
>> def index():
>> form = SQLFORM(db.tr_items)
>> if form.process().accepted:
>> item_in_out = form.vars.item
>> amount_in_out = form.vars.amount
>> #1
>>
>> #db.products_summary.update_or_insert(db.products_summary.product==item_in_out,
>>
>> product=item_in_out,
>> cumulative_amount=db.products_summary.cumulative_amount+form.vars.amount)
>> #2
>>
>> #db.products_summary.update_or_insert(db.products_summary.product==item_in_out,
>>
>> product=item_in_out,
>> cumulative_amount=db(db.products_summary.product).select(db.products_summary.cumulative_amount)+form.vars.amount)
>> #3
>> db.products_summary.update_or_insert(db.products_summary.product
>> ==item_in_out, product=item_in_out, cumulative_amount=+form.vars.amount)
>> response.flash = T("Product: %s Amount: %d") % (item_in_out,
>> amount_in_out)
>> return locals()
>>
>>
>>
>> Error message #1
>>
>> <class 'sqlite3.OperationalError'> no such column:
>> products_summary.cumulative_amount
>>
>> Error message #2
>>
>> <type 'exceptions.TypeError'> unsupported operand type(s) for +: 'Rows'
>> and 'float'
>>
>>
> I believe that #2 is what you want, but you have to extract the field of
> interest from the Rows object. A Rows object is (roughly) an array of Row
> objects, and a Row object is (roughly) a dictionary of fields. Assuming
> you only get 1 match to your query, you'd want
>
> db.products_summary.update_or_insert(db.products_summary.product==
> item_in_out, product=item_in_out,
> cumulative_amount=db(db.products_summary.product).select(db.
> products_summary.cumulative_amount)[0]["cumulative_amount"]
> + form.vars.amount)
>
>
>
> Error message #3
>>
>> No error message - this overwrites cumulative amount to the amount
>> entered by the user, no memory.
>>
>
> Python doesn't have the increment assignment operator, so number 3 is
> being taken as
>
> cumulative_amount = NULL + form.vars.amount
>
>
>
>>
>>
>>
>> Thanks for any help!!
>>
>
>
> If this was of any help, you're welcome!
>
> /dps
>
>
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.