La consulta base en SQL es la siguiente: 

SELECT ("gp"."id") AS "gp" 
FROM "disc_gp" AS "gp"
LEFT JOIN
(SELECT ("rl"."gp") AS "gp"
FROM "disc_reporte_linea" AS "rl"
INNER JOIN "disc_reporte" AS "r"
ON "rl"."gp" = "r"."id"
GROUP BY "rl"."gp"
) "rm"
ON "rm"."gp" = "gp"."id" 
WHERE "rm"."gp" IS NULL 
GROUP BY "gp"."id";

El viernes, 2 de febrero de 2018, 8:54:37 (UTC-6), Josias Pérez escribió:
>
> El código completo de método es el siguiente:
>
> gp = fields.Many2One('disc.gp',
>         'Grupo')
>     distrito = fields.Many2One('disc.distrito',
>         'Distrito')
>
> @staticmethod
> def table_query():
>         pool = Pool()
>         context = Transaction().context
>         Gp = pool.get('disc.gp')
>         gp = Gp.__table__()
>         Reporte = pool.get('disc.reporte')
>         reporte = Reporte.__table__()
>         ReporteLinea = pool.get('disc.reporte.linea')
>         reporte_linea = ReporteLinea.__table__()
>         
>         where = Literal(True)
>         if context.get('fecha_inicio'):
>             where &= reporte.fecha_inicio >= context['fecha_inicio']
>         if context.get('fecha_fin'):
>             where &= reporte.fecha_fin <= context['fecha_fin']
>         if context.get('distrito'):
>             where &= reporte.distrito <= context['distrito']
>
>         subquery = (reporte_linea
>             .join(reporte,
>                 condition=reporte.id == reporte_linea.reporte)
>             .select(
>                 Max(reporte_linea.id * 1005).as_('id'),
>                 Max(reporte_linea.create_uid).as_('create_uid'),
>                 Max(reporte_linea.create_date).as_('create_date'),
>                 Max(reporte_linea.write_uid).as_('write_uid'),
>                 Max(reporte_linea.write_date).as_('write_date'),
>                 (reporte_linea.gp).as_('gp'),
>                 (reporte.distrito).as_('distrito'),
>                 where = where,
>                 group_by=(reporte_linea.gp,
>                     reporte.distrito), 
>                 order_by=(reporte.distrito),
>                 )
>             )
>         query = (gp
>             .join(subquery,'LEFT',
>             condition=gp.id == subquery.gp)
>             .select(
>                 Max(gp.id * 1005).as_('id'),
>                 Max(gp.create_uid).as_('create_uid'),
>                 Max(gp.create_date).as_('create_date'),
>                 Max(gp.write_uid).as_('write_uid'),
>                 Max(gp.write_date).as_('write_date'),
>                 (gp.id).as_('gp'),
>                 (subquery.distrito).as_('distrito'),
>                 where= subquery.gp == None,
>                 group_by=(gp.id, subquery.distrito,),
>                 order_by=(subquery.distrito)
>                 )
>             )
>
>         #print "QUERY: " + str(query)
>         return query
>
> Y la llamada la realizo de la siguiente forma: 
>
> @classmethod
>     def _get_records(cls, ids, model, data):
>         Reporte = Pool().get('disc.reporte.lider.cero.table')
>
>         fecha_inicio = data['fecha_inicio']
>         fecha_fin = data['fecha_fin']
>         distrito = data['distrito']
>
>         with Transaction().set_context(fecha_inicio=fecha_inicio,
>             fecha_fin=fecha_fin, distrito=distrito):
>             reports = Reporte.search(
>                 [],
>                 #[('distrito','=',distrito)],
>                 order=[('distrito', 'DESC')], 
>                 ) 
>             #print "REPORTS: " + str(reports)
>         
>         return reports
>
> Por alguna razón devuelve el campo 'distrito' vacío, tampoco puedo llamar 
> al campo gp.distrito.zona en el reporte.  
>
> El viernes, 2 de febrero de 2018, 8:06:02 (UTC-6), Josias Pérez escribió:
>>
>>
>>
>> El viernes, 2 de febrero de 2018, 2:40:58 (UTC-6), Sergi Almacellas 
>> Abellana escribió:
>>>
>>> El 02/02/18 a les 07:56, Josias Pérez ha escrit: 
>>> > El problema es que ahora no puedo indexar dicha tabla en el método 
>>> .search() 
>>> > 
>>> > Reporte = Pool().get('disc.reporte.lider.cero.table') 
>>> > 
>>> > reports = Reporte.search( [('distrito','=',distrito)] ) 
>>> > 
>>>
>>> Esto lo deberias hacer sin problema. ¿Que error te da? 
>>>
>>
>> Si le mando el dominio de distrito, no me devuelve ningún registro. Hice 
>> algunas pruebas y encontré que el campo distrito llega vacío por alguna 
>> razón. Los resultados están correctos pero no llega el campo de distrito. 
>>
>>>
>>> > También en los reportes no puedo utilizar, como por ejemplo: 
>>> > gp.distrito.zona (en otros reportes funciona bien, pero no después de 
>>> la 
>>> > doble consulta). 
>>> > 
>>>
>>> Si el tipo del campo es Many2One no deberias tener problemas. 
>>>
>>>
>> El tipo es Many2One pero no puedo utilizar está notación en los reportes. 
>> Lo he utilizado en varios más y no he tenido ningún problema. 
>>
>>>
>>> -- 
>>> Sergi Almacellas Abellana 
>>> www.koolpi.com 
>>> Twitter: @pokoli_srk 
>>>
>>  
>

Responder a