rows=db(db.shares.id>0).select(left=db.prices.on(db.prices.share_id==db.shares.id))
AND
<table>
{{for row in rows:}}
<tr><td>{{=row.shares.asx_code}}</td><td>{{=row.prices.price_close}}
</td></tr>
{{pass}}
</table>
OR BETTER
{{id=None}}
<ul>
{{for row in rows:}}
{{if row.shares.id!=id:}}{{if id:}}</ul></li>{{pass}}
<li>{{=row.shares.asx_code}}<ul>{{id=row.shares.id}}{{pass}}
<li>{{=row.prices.price_close or '(nothing)'</li>
{{pass}}
{{if id:}}</ul></li>{{pass}}
<ul>
On May 3, 12:44 pm, ztd <[email protected]> wrote:
> Hi Massimo - I should say thanks for the simple and interesting
> framework you've made -thanks!
>
> One share can have between zero and (practically) unlimited prices
> associated to it, by i's ID.
>
> Initially I want to list all prices associated to each share just to
> get an idea of what I'm doing. Later I will implement a form to
> control the time period. Currently there aren't any other criteria, so
> the workflow is just 'list each share as a LI item and all recorded
> prices associated to that share as sub LI items'. I'm not running this
> on GAE.
>
> Below you can see that four prices appear under each of the two
> shares, each one should have only two - GDA should have the first two
> and VZZ the last two.
>
> On May 3, 6:04 pm, mdipierro <[email protected]> wrote:
>
> > do you have only one price per share or multiple prices? If multiple
> > prices, do you want to list them all? Only the last one? what is the
> > criteria? Are you running on GAE?
>
> > On May 3, 7:12 am, ztd <[email protected]> wrote:
>
> > > Another quick question. I've now stored prices.ALL into a variable
> > > 'prices' and passed to the view. I want to show each share as a line
> > > with a subline for each price associated to that share. Here is the
> > > code:
>
> > > {{extend 'layout.html'}}
> > > <h1>Share portfolio</h1>
> > > <ul>
> > > {{for share in shares:}}
> > > {{=LI(share.asx_code)}}
> > > <ul>
> > > {{for price in prices:}}
> > > {{=LI(price.price_close)}}
> > > {{pass}}
> > > </ul>
> > > {{pass}}
> > > </ul>
>
> > > (price_close is the value I want to show). This is how it comes out
> > > and the closest I can get it:
>
> > > * GDA
> > > o 3
> > > o 67
> > > o 45
> > > o 31
> > > * VZZ
> > > o 3
> > > o 67
> > > o 45
> > > o 31
>
> > > How do I alter the view to only make a new 'price_close' line if the
> > > price belongs to that share? They are linked here:
>
> > > Field('share_id',db.shares)
>
> > > Thanks!
>
> > > On May 3, 2:29 pm, ztd <[email protected]> wrote:
>
> > > > With the above two solutions I cleaned up the code and it now works.
>
> > > > I had changed this:
> > > > [IS_NOT_EMPTY(),IS_NOT_IN_DB(db,db.shares.asx_code)]
> > > > to this
> > > > [IS_NOT_EMPTY(),IS_NOT_IN_DB(db,'shares.asx_code')]
>
> > > > and this:
> > > > {{for asx_code in shares:}}
> > > > {{=LI(shares.asx_code)}}
> > > > {{pass}}
>
> > > > to this:
> > > > {{for share in shares:}}
> > > > {{=LI(share.asx_code)}}
> > > > {{pass}}
>
> > > > After this I'm getting a list of each share, finally! As soon as read
> > > > your suggestion Nathan I twigged that 'share' is a variable created in
> > > > the loop just for the loop - the naming had me thinking I was
> > > > referencing a table or the earlier dict variable. So for reference, in
> > > > the code above, 'share' is just a counter and '.asx_code' is the
> > > > attribute, so the written flow is
>
> > > > For every row ('share' variable) found in the dictionary
> > > > 'shares' (from the controller), show the asx_code variable for the
> > > > current row.
>
> > > > On May 2, 9:27 pm, Nathan Freeze <[email protected]> wrote:
>
> > > > > You're not using the iteration variable.
>
> > > > > This line:
> > > > > {{=LI(shares.asx_code)}}
>
> > > > > should be:
> > > > > {{=LI(asx_code.asx_code)}}
>
> > > > > But a more logical iteration variable would be 'share':
>
> > > > > {{extend 'layout.html'}}
> > > > > <h1>Share portfolio</h1>
> > > > > <ul>
> > > > > {{for share in shares:}}
> > > > > {{=LI(share.asx_code)}}
> > > > > {{pass}}
> > > > > </ul>
>
> > > > > On Sun, May 2, 2010 at 11:02 AM, ztd <[email protected]>
> > > > > wrote:
> > > > > > Hi,
>
> > > > > > here is an error I receive in a simple stock tracking application
> > > > > > I'm
> > > > > > making to help me learn Web2Py:
>
> > > > > > Traceback (most recent call last):
> > > > > > File "gluon/restricted.py", line 178, in restricted
> > > > > > File
> > > > > > "C:\Users\Zac\Desktop\web2py\applications\shares/views\default/
> > > > > > index.html", line 86, in <module>
> > > > > > AttributeError: 'Rows' object has no attribute 'asx_code'
>
> > > > > > I think the problem is to do with passing variables between the
> > > > > > controller and view. I've based this app on the 'image blog' example
> > > > > > in the book. Here is my code so far:
>
> > > > > > ---db.py---
>
> > > > > > db.define_table('shares',
> > > > > > Field('asx_code'),
> > > > > > Field('date_added','datetime',default=request.now),
> > > > > > Field('quantity'),
> > > > > > Field('buy_price'))
>
> > > > > > db.define_table('prices',
> > > > > > Field('share_id',db.shares),
> > > > > > Field('date','datetime',default=request.now),
> > > > > > Field('price_low',default='0'),
> > > > > > Field('price_high',default='0'),
> > > > > > Field('price_close',default='0'))
>
> > > > > > db.shares.asx_code.requires =
> > > > > > [IS_NOT_EMPTY(),IS_NOT_IN_DB(db,db.shares.asx_code)]
> > > > > > db.shares.quantity.requires = IS_NOT_EMPTY()
> > > > > > db.shares.buy_price.requires = IS_NOT_EMPTY()
>
> > > > > > db.prices.share_id.requires =
> > > > > > IS_IN_DB(db,db.shares.id,'%(asx_code)s')
>
> > > > > > db.prices.share_id.writable = db.prices.share_id.readable = False
>
> > > > > > ---index in default.py---
>
> > > > > > def index():
> > > > > > shares=db().select(db.shares.ALL, orderby=db.shares.asx_code)
> > > > > > return dict(shares=shares)
>
> > > > > > ---default/index.html---
>
> > > > > > {{extend 'layout.html'}}
> > > > > > <h1>Share portfolio</h1>
> > > > > > <ul>
> > > > > > {{for asx_code in shares:}}
> > > > > > {{=LI(shares.asx_code)}}
> > > > > > {{pass}}
> > > > > > </ul>
>
> > > > > > What am I doing wrong? i'm a bit confused with variables in the
> > > > > > controller, I have a table called shares, a variable declared in the
> > > > > > controller called shares and the value in the dictionary called
> > > > > > shares
> > > > > > so it's very hard to know what I'm calling / using in the view!!!
> > > > > > (the
> > > > > > LI code could be wrong, I couldn't get it to show anything to debug
> > > > > > that far). shares table contains two entries.
>
> > > > > > Thanks!