Hi, Wes! I didn't get back online til after you had left -- sorry! On Oct 30, 10:57 am, Wes Hall <wesh...@gmail.com> wrote: > I am trying to show a grouped count in a powertable. How do I > reference the count's storage object? > > <snippet> > def event_list(): > class Virtual(object): > @virtualsettings(label='Count') > def email_count(self): > return ??????????? # What do I need to reference? > > report_id = int(request.args[0]) > > count1 = db.events.email.count() > datasource = db( > (db.events.report_id==report_id) & > (db.events.event_type=='event1') > ).select( > db.events.id, > count1, > db.events.email, > db.events.name, > db.users.first_name, > db.users.last_name, > left=db.users.on( > db.events.email==db.users.email), > groupby=db.events.email) > > table = plugins.powerTable > table.datasource=datasource > table.headers = 'labels' > table.virtualfields = Virtual() > table.keycolumn = 'events.id' > table.columns = ['virtual.email_count','events.email'] > > ... > </snippet> > > This is my first web2py project and second python project, so if it is > a lack of basic understanding, pointing me towards helpful resources > would also be appreciated.
I'm guessing you read... http://web2py.com/book/default/chapter/06?search=count#Grouping-and-Counting "Notice the count operator (which is built-in) is used as a field. The only issue here is in how to retrieve the information. Each row clearly contains a person and the count, but the count is not a field of a person nor is it a table. So where does it go? It goes into the storage object representing the record with a key equal to the query expression itself." ...and were wondering what that key looks like. If I'm guessing correctly, then it may be "COUNT(events.email)". Here's a way to find out -- start up the Web2py command line, do the query that uses the count field, and look at the column heading names in the result. Here's an example of doing this on our database. (I'm using actual table and field names, to avoid introducing typos by changing them. I'm showing this with a plain Python shell since that's cleaner.) $ python web2py.py -N -M -P -S eden (Replace "eden" with your application directory. >>> count=db.gis_location.id.count() >>> rows=db(db.gis_location.id>0).select(db.gis_location.level,count,groupby=db. gis_location.level) >>> print rows gis_location.level,COUNT(gis_location.id) L0,246 There is only one value of "level" in the table here, so the result of the query contains only one Row in the returned Rows object. Get one Row out, and then look up the value for key "COUNT(gis_location.id)": >>> row=rows[0] >>> row['COUNT(gis_location.id)'] 246 Just FYI (and others please correct me if I'm wrong): If there is data from more than one table, the Row class nests each table's data in another layer of Row objects, one with the data from each table. Anything not in a table is put in a Row indexed by "_extra". That is: >>> row.keys() ['gis_location', '_extra'] >>> row['_extra'] <Row {'COUNT(gis_location.id)': 246}> >>> row['gis_location'] <Row {'level': 'L0'}> So...you might try indexing by "COUNT(events.email)" rather than "virtual.email_count" in table.columns. If you try the query at the Web2py prompt, and print the result, is that what it has in its column names? -- Pat