Discussion:
[tryton-es] Subquery en python-sql
Josias Pérez
2018-02-01 03:57:51 UTC
Permalink
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),
)
Sergi Almacellas Abellana
2018-02-01 12:28:58 UTC
Permalink
Hola, 
Tengo el siguiente método de table_query y las siguientes tablas: 
     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 ")"
Por el error parece que te falta/sobra algun parentesis.

De todos modos, si nos pones la traza completa mejor.
Cualquier comentario será de mucha ayuda. 
    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)
        where &= reporte.fecha_inicio >=
Transaction().context['fecha_inicio']
        where &= reporte.fecha_fin <= Transaction().context['fecha_fin']
    
    where &= gp.id == None
Una sugerencia: En vez de instanciar el context varias veces es mejor hacer:

context = Transaction().context

y a partir d'aqui context.get('fecha_inicio')

Queda más limpio.
    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),
    )
--
Sergi Almacellas Abellana
www.koolpi.com
Twitter: @pokoli_srk
Josias Pérez
2018-02-02 06:56:02 UTC
Permalink
Gracias por las recomendaciones, quedó en está forma:

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

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

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

Hay alguna recomendación para trabajar con este tipo de datos?

El jueves, 1 de febrero de 2018, 6:29:02 (UTC-6), Sergi Almacellas Abellana
Post by Sergi Almacellas Abellana
Post by Josias Pérez
Hola,
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 ")"
Por el error parece que te falta/sobra algun parentesis.
De todos modos, si nos pones la traza completa mejor.
Post by Josias Pérez
Cualquier comentario será de mucha ayuda.
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)
where &= reporte.fecha_inicio >=
Transaction().context['fecha_inicio']
where &= reporte.fecha_fin <= Transaction().context['fecha_fin']
where &= gp.id == None
context = Transaction().context
y a partir d'aqui context.get('fecha_inicio')
Queda más limpio.
Post by Josias Pérez
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),
)
--
Sergi Almacellas Abellana
www.koolpi.com
Sergi Almacellas Abellana
2018-02-02 08:40:54 UTC
Permalink
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?
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.
--
Sergi Almacellas Abellana
www.koolpi.com
Twitter: @pokoli_srk
Josias Pérez
2018-02-02 14:06:02 UTC
Permalink
El viernes, 2 de febrero de 2018, 2:40:58 (UTC-6), Sergi Almacellas
Post by Josias Pérez
Post by Josias Pérez
El problema es que ahora no puedo indexar dicha tabla en el método
.search()
Post by Josias Pérez
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.
Post by Josias Pérez
Post by Josias Pérez
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.
Post by Josias Pérez
--
Sergi Almacellas Abellana
www.koolpi.com
Josias Pérez
2018-02-02 14:54:37 UTC
Permalink
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.
Post by Josias Pérez
El viernes, 2 de febrero de 2018, 2:40:58 (UTC-6), Sergi Almacellas
Post by Josias Pérez
Post by Josias Pérez
El problema es que ahora no puedo indexar dicha tabla en el método
.search()
Post by Josias Pérez
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.
Post by Josias Pérez
Post by Josias Pérez
gp.distrito.zona (en otros reportes funciona bien, pero no después de
la
Post by Josias Pérez
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.
Post by Josias Pérez
--
Sergi Almacellas Abellana
www.koolpi.com
Josias Pérez
2018-02-02 15:15:29 UTC
Permalink
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";
Post by Josias Pérez
gp = fields.Many2One('disc.gp',
'Grupo')
distrito = fields.Many2One('disc.distrito',
'Distrito')
@staticmethod
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)
where &= reporte.fecha_inicio >= context['fecha_inicio']
where &= reporte.fecha_fin <= context['fecha_fin']
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
@classmethod
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,
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.
Post by Josias Pérez
El viernes, 2 de febrero de 2018, 2:40:58 (UTC-6), Sergi Almacellas
Post by Josias Pérez
Post by Josias Pérez
El problema es que ahora no puedo indexar dicha tabla en el método
.search()
Post by Josias Pérez
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.
Post by Josias Pérez
Post by Josias Pérez
gp.distrito.zona (en otros reportes funciona bien, pero no después de
la
Post by Josias Pérez
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.
Post by Josias Pérez
--
Sergi Almacellas Abellana
www.koolpi.com
Josias Pérez
2018-02-02 16:45:29 UTC
Permalink
Post by Josias Pérez
gp = fields.Many2One('disc.gp',
'Grupo')
distrito = fields.Many2One('disc.distrito',
'Distrito')
@staticmethod
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)
where &= reporte.fecha_inicio >= context['fecha_inicio']
where &= reporte.fecha_fin <= context['fecha_fin']
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
@classmethod
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,
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.
*UndefinedError: None has no member named "rec_name"*
Post by Josias Pérez
Post by Josias Pérez
El viernes, 2 de febrero de 2018, 2:40:58 (UTC-6), Sergi Almacellas
Post by Josias Pérez
Post by Josias Pérez
El problema es que ahora no puedo indexar dicha tabla en el método
.search()
Post by Josias Pérez
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.
Post by Josias Pérez
Post by Josias Pérez
gp.distrito.zona (en otros reportes funciona bien, pero no después de
la
Post by Josias Pérez
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.
Post by Josias Pérez
--
Sergi Almacellas Abellana
www.koolpi.com
Sergi Almacellas Abellana
2018-02-04 19:16:49 UTC
Permalink
Post by Josias Pérez
*UndefinedError: None has no member named "rec_name"*
Claro, porqué si el valor esta vacio, no tiene ningún nombre del registro.

Me he mirado tus correos, y no veo que estes haciendo nada mal a nivel
de sintaxis. Seguramente es que la consulta no te esta devolviendo los
resultados como esperas.

Para ayudarte necesitariamos saber la estructura de las tablas.

Un saludo,
--
Sergi Almacellas Abellana
www.koolpi.com
Twitter: @pokoli_srk
Josias Pérez
2018-02-07 01:33:38 UTC
Permalink
La estructura es la siguiente:

class Reporte(ModelView, ModelSQL):
'Reporte'
__name__ = 'disc.reporte'

fecha_inicio = fields.Date('Fecha inicio',
required=True)
fecha_fin = fields.Date('Fecha fin',
required=True)
lineas = fields.One2Many('disc.reporte.linea',
'reporte','Grupos',
)

class ReporteLinea(ModelView, ModelSQL):
'Reporte Linea'
__name__ = 'disc.reporte.linea'

reporte = fields.Many2One('disc.reporte',
'Reporte',required=True)
gp = fields.Many2One('disc.gp','Grupo', required=True)
cantidad = fields.Numeric('Cantidad', required=True)

class Gp(ModelView, ModelSQL):
'Grupo'
__name__ = 'disc.gp'

name = fields.Char('Grupo', required=True)

Básicamente se lleva un control de agregados por grupo, de acuerdo al
reporte. Luego consolidamos de acuerdo a consultas en las diferentes tablas
mediantes un LEFT JOIN o un INNER JOIN, con la ayuda de python-sql.

El domingo, 4 de febrero de 2018, 13:16:53 (UTC-6), Sergi Almacellas
Post by Josias Pérez
*UndefinedError: None has no member named "rec_name"*
Claro, porqué si el valor esta vacio, no tiene ningún nombre del registro.
Me he mirado tus correos, y no veo que estes haciendo nada mal a nivel
de sintaxis. Seguramente es que la consulta no te esta devolviendo los
resultados como esperas.
Para ayudarte necesitariamos saber la estructura de las tablas.
Un saludo,
--
Sergi Almacellas Abellana
www.koolpi.com
Sergi Almacellas Abellana
2018-02-07 10:26:45 UTC
Permalink
La estructura es la siguiente: 
    'Reporte'
    __name__ = 'disc.reporte'
    fecha_inicio = fields.Date('Fecha inicio', 
        required=True)
    fecha_fin = fields.Date('Fecha fin', 
        required=True)
    lineas = fields.One2Many('disc.reporte.linea',
        'reporte','Grupos',
        )
    'Reporte Linea'
    __name__ = 'disc.reporte.linea'
    reporte = fields.Many2One('disc.reporte',
        'Reporte',required=True)
    gp = fields.Many2One('disc.gp','Grupo', required=True)
    cantidad = fields.Numeric('Cantidad', required=True)
    'Grupo'
    __name__ = 'disc.gp'
    
    name = fields.Char('Grupo', required=True)
Básicamente se lleva un control de agregados por grupo, de acuerdo al
reporte. Luego consolidamos de acuerdo a consultas en las diferentes
tablas mediantes un LEFT JOIN o un INNER JOIN, con la ayuda de python-sql.
Veo que todas las relaciones son obligatorios, por lo que no entiende
como te puede dar error de un None no tiene rec_name.

Siento no poder-te ser de mas ayuda.
--
Sergi Almacellas Abellana
www.koolpi.com
Twitter: @pokoli_srk
Josias Pérez
2018-02-07 01:34:44 UTC
Permalink
El error me lo da cuando intento ingresar al anidado de registros de la
table_query dentro del reporte en un campo Many2One. Ignoro cuál sea la
razón.

El domingo, 4 de febrero de 2018, 13:16:53 (UTC-6), Sergi Almacellas
Post by Josias Pérez
*UndefinedError: None has no member named "rec_name"*
Claro, porqué si el valor esta vacio, no tiene ningún nombre del registro.
Me he mirado tus correos, y no veo que estes haciendo nada mal a nivel
de sintaxis. Seguramente es que la consulta no te esta devolviendo los
resultados como esperas.
Para ayudarte necesitariamos saber la estructura de las tablas.
Un saludo,
--
Sergi Almacellas Abellana
www.koolpi.com
Loading...