you need to put it in the dict so the view can see it.

On Feb 27, 2:57 pm, Paul <paul.robinson...@gmail.com> wrote:
> One last part of the puzzle, this all works ok at the command line
> with print row[mysum] but I cannot get the syntax for using this in a
> view
>
> for example:-
>
> controller DAL query:-
> def mileage():
>     mysum = db.t_appointment.miles_to.sum()
> +db.t_appointment.miles_from.sum()
>     groupyyyymm = db.t_appointment.f_start_time.year()|
> db.t_appointment.f_start_time.month()
>     rows = db().select(
>         mysum,
>         db.t_appointment.f_start_time.year(),
>         db.t_appointment.f_start_time.month(),
>     groupby=groupyyyymm)
>
>     return dict(rows=rows, sql = db._lastsql)
>
> IN VIEW:
> {{for row in rows:}}
>  {{=row[mysum]}}
>  {{pass}}
>
> I get NameError: name 'mysum' is not defined
>
> If I try:
>
> {{for row in rows:}}
>  {{=row['mysum']}}
>  {{pass}}
>
> I get:
>
> Traceback (most recent call last):
>   File "D:\web2py-src\web2py\gluon\restricted.py", line 194, in
> restricted
>     exec ccode in environment
>   File "D:\web2py-src\web2py\applications\caltest\views\info/
> mileage.html", line 105, in <module>
>   File "D:\web2py-src\web2py\gluon\dal.py", line 4331, in __getitem__
>     return dict.__getitem__(self, key)
> KeyError: 'mysum'
>
> On Feb 27, 2:08 pm, Anthony <abasta...@gmail.com> wrote:
>
>
>
>
>
>
>
> > > That syntax works and I can use that to refer to the data, I could see
> > > that a row object had an '_extra' dict for the selected expressions
> > > but could not see that the data could be referred to be the name of
> > > the expression 'mysum' (its in there somewhere but not sure where!!)
>
> > The book example does show that usage:
>
> > >>> sum = db.log.severity.sum()
> > >>> print db().select(sum).first()[sum]
>
> > Actually, when you do row[mysum], the __getitem__ method of the Row object
> > automatically does row[str(mysum)]. Since mysum is a DAL Expression object,
> > its __str__ method converts it to the SQL syntax for the particular
> > database adapter you are using, which in this case is 
> > "(SUM(t_appointment.miles_to)
> > + SUM(t_appointment.miles_from))". The Row __getitem__ method first looks
> > for that key in its _extra dict and returns the value if found. So, when
> > you do:
>
> > row[mysum]
>
> > This is essentially what is happening behind the scenes:
>
> >    1. row[str(mysum)]
> >    2. row['(SUM(t_appointment.miles_to) + SUM(t_appointment.miles_from))']
> >    3. row['_extra']['(SUM(t_appointment.miles_to) +
> >    SUM(t_appointment.miles_from))']
>
> > Anthony

Reply via email to