Hola, 

Tengo el siguiente método de table_query y las siguientes tablas: 

class Gp:
     name 

class Reporte
     fecha_inicio
     fecha_fin
     distrito

class ReporteLine
     reporte many2one Reporte
     gp        many2one Gp
     cantidad 

Deseo encontrar los grupos que no generan reportes, es decir sean NULL o 
cero. Si existe un registro en la clase ReporteLine se puede sumar (aunque 
sea 0), pero si no existe un registro no sé como obtener el nombre del 
grupo (Gp) que no está registrado en ReporteLine. 

Tengo el siguiente table_query pero devuelve un valor de error al realizar 
la consulta y devuelve el siguiente error 
ProgrammingError: syntax error at or near ")"

Cualquier comentario será de mucha ayuda. 

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 Transaction().context.get('fecha_inicio'):
        where &= reporte.fecha_inicio >= 
Transaction().context['fecha_inicio']
    if Transaction().context.get('fecha_fin'):
        where &= reporte.fecha_fin <= Transaction().context['fecha_fin']
    
    where &= gp.id == None

    query1 = reporte.join(reporte_linea,
            condition=reporte_linea.reporte == reporte.id).select(
                Max(reporte_linea.id * 1000).as_('id'),
                Max(reporte.create_uid).as_('create_uid'),
                Max(reporte.create_date).as_('create_date'),
                Max(reporte.write_uid).as_('write_uid'),
                Max(reporte.write_date).as_('write_date'),
                Max(reporte.distrito).as_('distrito'),
                (reporte_linea.gp).as_('gp'),
                Sum(reporte_linea.cantidad).as_('total'),
                group_by=(reporte_linea.gp),
                )
    
    query2 = gp.join(query1,'LEFT').select(
            Max(gp.id * 1001).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'),
            Max(query1.distrito).as_('distrito'),
            (reporte_linea.gp).as_('gp'),
            where = where,
            group_by=(query1.gp),
    )

Responder a