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
>>>
>>
>