tengo un problema serio en la aplicación que estoy haciendo deseo mostrar un reporte mensual de producción y lo hago de la siguiente manera: le pregunto al usuario el rango de fechas (desde-hasta) y las guardo en 2 variables 'finicio' y 'ffin', y tambien le pregunto el turno de producción 'turno', una vez hecho esto hago algo así:
date = finicio
while date <= ffin:
t_l10_co = db((lf == date) & (lt == turno)).select(db.logo.c10clipon)
aj = t_l10_co.last()
l10co = aj['c10clipon']
suma=suma+l10co
date = datetime.timedelta(1)
Pensé que así funcionaria pero me da error cuando pasa por las fechas donde se carga información por ser día no laboral, el error es este:
entiendo el error, lo que deseo es un forma de resolverlo ya que no se de que otra forma podré hacer el reporte mensual sin tener que estar llenando las tablas con ceros automáticamente
No sé cómo es el flujo del reporte (qué va, cuándo y cómo), pero por el código que mostrás, la falla parece ser que cuando la consulta que hace el bucle devuelve una secuencia de registros vacía, al pedir el valor del campo de un registro inexistente genera la excepción. Lo más sencillo sería omitir el error y continuar (con un bloque try-except o comprobando que el resultado de la consulta no sea vacío), pero no sé si el reporte lo permite.
Por ejemplo, para omitir el registro nulo es algo así:
Declaración del bucle:
Si t_l10_co no es None:
...
date = <dato>
On Monday, April 30, 2012 12:01:56 PM UTC-3, BlackLion wrote:
> tengo un problema serio en la aplicación que estoy haciendo deseo mostrar > un reporte mensual de producción y lo hago de la siguiente manera: le > pregunto al usuario el rango de fechas (desde-hasta) y las guardo en 2 > variables 'finicio' y 'ffin', y tambien le pregunto el turno > de producción 'turno', una vez hecho esto hago algo así:
> date = finicio
> while date <= ffin:
> t_l10_co = db((lf == date) & (lt == turno)).select(db.logo.c10clipon)
> aj = t_l10_co.last()
> l10co = aj['c10clipon']
> suma=suma+l10co
> date = datetime.timedelta(1)
> Pensé que así funcionaria pero me da error cuando pasa por las fechas > donde se carga información por ser día no laboral, el error es este:
> entiendo el error, lo que deseo es un forma de resolverlo ya que no se de que otra forma podré hacer el reporte mensual sin tener que estar llenando las tablas con ceros automáticamente
ok pero que valor compruebo que no sea None, "aj = t_l10co.last()"? Porque una vez que trato de asignarle ese contenido a una variable me da la excepción
El lunes, 30 de abril de 2012 11:01:56 UTC-4, BlackLion escribió:
> tengo un problema serio en la aplicación que estoy haciendo deseo mostrar > un reporte mensual de producción y lo hago de la siguiente manera: le > pregunto al usuario el rango de fechas (desde-hasta) y las guardo en 2 > variables 'finicio' y 'ffin', y tambien le pregunto el turno > de producción 'turno', una vez hecho esto hago algo así:
> date = finicio
> while date <= ffin:
> t_l10_co = db((lf == date) & (lt == turno)).select(db.logo.c10clipon)
> aj = t_l10_co.last()
> l10co = aj['c10clipon']
> suma=suma+l10co
> date = datetime.timedelta(1)
> Pensé que así funcionaria pero me da error cuando pasa por las fechas > donde se carga información por ser día no laboral, el error es este:
> entiendo el error, lo que deseo es un forma de resolverlo ya que no se de que otra forma podré hacer el reporte mensual sin tener que estar llenando las tablas con ceros automáticamente
puedes hacer un len(aj) > 0
de esta forma sabes si extrajo registros.
la otra cosa que te recomendaría es colocar nombres de variables mas
descriptivos..
lo único que me quedo claro fue "suma"... y en realidad suma de?
debería tener un nombre descriptivo del valor que contiene.. no de lo
que se hace con ella..
> ok pero que valor compruebo que no sea None, "aj = t_l10co.last()"? Porque
> una vez que trato de asignarle ese contenido a una variable me da
> la excepción
> El lunes, 30 de abril de 2012 11:01:56 UTC-4, BlackLion escribió:
>> tengo un problema serio en la aplicación que estoy haciendo deseo mostrar
>> un reporte mensual de producción y lo hago de la siguiente manera: le
>> pregunto al usuario el rango de fechas (desde-hasta) y las guardo en 2
>> variables 'finicio' y 'ffin', y tambien le pregunto el turno
>> de producción 'turno', una vez hecho esto hago algo así:
>> date = finicio
>> while date <= ffin:
>> t_l10_co = db((lf == date) & (lt == turno)).select(db.logo.c10clipon)
>> aj = t_l10_co.last()
>> l10co = aj['c10clipon']
>> suma=suma+l10co
>> date = datetime.timedelta(1)
>> Pensé que así funcionaria pero me da error cuando pasa por las fechas
>> donde se carga información por ser día no laboral, el error es este:
>> Traceback (most recent call last):
>> File "gluon/restricted.py", line 205, in restricted
>> File "C:/Omar/web2py/applications/gestpro/controllers/default.py", line
>> 682, in <module>
>> File "gluon/globals.py", line 173, in <lambda>
>> File "C:/Omar/web2py/applications/gestpro/controllers/default.py", line
>> 650, in reportemensual
>> TypeError: 'NoneType' object is unsubscriptable
>> entiendo el error, lo que deseo es un forma de resolverlo ya que no se de
>> que otra forma podré hacer el reporte mensual sin tener que estar llenando
>> las tablas con ceros automáticamente
> tengo un problema serio en la aplicación que estoy haciendo deseo mostrar > un reporte mensual de producción y lo hago de la siguiente manera: le > pregunto al usuario el rango de fechas (desde-hasta) y las guardo en 2 > variables 'finicio' y 'ffin', y tambien le pregunto el turno > de producción 'turno', una vez hecho esto hago algo así:
> date = finicio
> while date <= ffin:
> t_l10_co = db((lf == date) & (lt == turno)).select(db.logo.c10clipon)
> aj = t_l10_co.last()
> l10co = aj['c10clipon']
> suma=suma+l10co
> date = datetime.timedelta(1)
> Pensé que así funcionaria pero me da error cuando pasa por las fechas > donde se carga información por ser día no laboral, el error es este:
> entiendo el error, lo que deseo es un forma de resolverlo ya que no se de que otra forma podré hacer el reporte mensual sin tener que estar llenando las tablas con ceros automáticamente
Lo que creo que deberías hacer es una consulta que sume y agrupe por fecha. Algo similar a.
> puedes hacer un len(aj) > 0 > de esta forma sabes si extrajo registros.
> la otra cosa que te recomendaría es colocar nombres de variables mas > descriptivos.. > lo único que me quedo claro fue "suma"... y en realidad suma de? > debería tener un nombre descriptivo del valor que contiene.. no de lo > que se hace con ella..
> Díaz Luis > Analista Programador Facultad de Odontología UC > http://www.about.me/diazluis > User Linux 532223
> El día 30 de abril de 2012 11:35, BlackLion <omar.fari...@gmail.com> > escribió: > > ok pero que valor compruebo que no sea None, "aj = t_l10co.last()"? > Porque > > una vez que trato de asignarle ese contenido a una variable me da > > la excepción
> > El lunes, 30 de abril de 2012 11:01:56 UTC-4, BlackLion escribió:
> >> tengo un problema serio en la aplicación que estoy haciendo deseo > mostrar > >> un reporte mensual de producción y lo hago de la siguiente manera: le > >> pregunto al usuario el rango de fechas (desde-hasta) y las guardo en 2 > >> variables 'finicio' y 'ffin', y tambien le pregunto el turno > >> de producción 'turno', una vez hecho esto hago algo así: > >> date = finicio > >> while date <= ffin: > >> t_l10_co = db((lf == date) & (lt == > turno)).select(db.logo.c10clipon) > >> aj = t_l10_co.last() > >> l10co = aj['c10clipon'] > >> suma=suma+l10co > >> date = datetime.timedelta(1) > >> Pensé que así funcionaria pero me da error cuando pasa por las fechas > >> donde se carga información por ser día no laboral, el error es este:
> >> Traceback (most recent call last):
> >> File "gluon/restricted.py", line 205, in restricted > >> File "C:/Omar/web2py/applications/gestpro/controllers/default.py", > line > >> 682, in <module> > >> File "gluon/globals.py", line 173, in <lambda> > >> File "C:/Omar/web2py/applications/gestpro/controllers/default.py", > line > >> 650, in reportemensual > >> TypeError: 'NoneType' object is unsubscriptable
> >> entiendo el error, lo que deseo es un forma de resolverlo ya que no se > de > >> que otra forma podré hacer el reporte mensual sin tener que estar > llenando > >> las tablas con ceros automáticamente
> El lunes, 30 de abril de 2012 12:01:56 UTC-3, BlackLion escribió:
>> tengo un problema serio en la aplicación que estoy haciendo deseo mostrar >> un reporte mensual de producción y lo hago de la siguiente manera: le >> pregunto al usuario el rango de fechas (desde-hasta) y las guardo en 2 >> variables 'finicio' y 'ffin', y tambien le pregunto el turno >> de producción 'turno', una vez hecho esto hago algo así:
>> date = finicio
>> while date <= ffin:
>> t_l10_co = db((lf == date) & (lt == turno)).select(db.logo.c10clipon)
>> aj = t_l10_co.last()
>> l10co = aj['c10clipon']
>> suma=suma+l10co
>> date = datetime.timedelta(1)
>> Pensé que así funcionaria pero me da error cuando pasa por las fechas >> donde se carga información por ser día no laboral, el error es este:
>> entiendo el error, lo que deseo es un forma de resolverlo ya que no se de que otra forma podré hacer el reporte mensual sin tener que estar llenando las tablas con ceros automáticamente
> Lo que creo que deberías hacer es una consulta que sume y agrupe por > fecha. Algo similar a.
El tema es este: si t_l10_co no devolvió resultados (instancia de Rows sin registros), al hacer .last() devuelve None. Luego, para este caso tendrías que continuar el bucle sin procesar datos, evitando el error, o reemplazar la propiedad del registro inexistente con un dato válido por defecto (o cualquier otra cosa que evite la excepción). Para la primera opción sería algo así:
while date <= ffin:
t_l10_co = db((lf == date) & (lt == turno)).select(db.logo.c10clipon)
aj = t_l10_co.last()
# procesar datos sólo si la consulta no es vacía.
if aj is not None:
l10co = aj['c10clipon']
suma=suma+l10co
date = datetime.timedelta(1)
El lunes, 30 de abril de 2012 15:04:55 UTC-3, BlackLion escribió:
> El lunes, 30 de abril de 2012 12:53:37 UTC-4, Jose escribió:
>> El lunes, 30 de abril de 2012 12:01:56 UTC-3, BlackLion escribió:
>>> tengo un problema serio en la aplicación que estoy haciendo deseo >>> mostrar un reporte mensual de producción y lo hago de la siguiente manera: >>> le pregunto al usuario el rango de fechas (desde-hasta) y las guardo en 2 >>> variables 'finicio' y 'ffin', y tambien le pregunto el turno >>> de producción 'turno', una vez hecho esto hago algo así:
>>> date = finicio
>>> while date <= ffin:
>>> t_l10_co = db((lf == date) & (lt == turno)).select(db.logo.c10clipon)
>>> aj = t_l10_co.last()
>>> l10co = aj['c10clipon']
>>> suma=suma+l10co
>>> date = datetime.timedelta(1)
>>> Pensé que así funcionaria pero me da error cuando pasa por las fechas >>> donde se carga información por ser día no laboral, el error es este:
>>> entiendo el error, lo que deseo es un forma de resolverlo ya que no se de que otra forma podré hacer el reporte mensual sin tener que estar llenando las tablas con ceros automáticamente
>> Lo que creo que deberías hacer es una consulta que sume y agrupe por >> fecha. Algo similar a.
Surgio una falla inesperada y es que cuando el programa esta ejecutando esto:
ex20 = db((sbf == date) & (sbt == turno)).select(db.soldadura_b.extintor20)
c = ex20.last()
try:
e20 = c['extintor20']
except:
e20 = 0
s50 = s50+e20
me da este error: unsupported operand type(s) for +: 'int' and 'NoneType'
no entiendo por qué, porque si la variable es NoneType le estoy asignando un valor entero = 0, si alguien me puede ayudar
> unsupported operand type(s) for +: 'int' and 'NoneType'
> no entiendo por qué, porque si la variable es NoneType le estoy asignando un
> valor entero = 0, si alguien me puede ayudar
Por empezar no uses "try" asi solo, pone try tipo_de_error. Si no
sabes cual es el tipo de error, correlo una vez sin try y miralo,
luego ponelo en el try, asi te aseguras que se active solo por eso y
no por otra cosa.
Ahora en donde asignas s50?
Al comienzo de esa funcion digo que s50 = 0, y el tipo de error que da sin el try es que dice que 'NoneType is unsuscriptable', sera que debo colocar algo así:
except NoneType:
e20 = 0
A ver si así hace lo que yo quiero, lo que me intriga es que hace unos 30 minutos sin especificar ni el try ni el except, funcionaba bien, pero ahora no.
> unsupported operand type(s) for +: 'int' and 'NoneType'
El error que te da actualmente es porque uno de los dos objetos de la
suma
es de tipo None. Necesitarías depurar el código para saber cuándo se
cambia a None (probablemente cuando
llamás a una función de la DAL como .select() o .last() o
registro["campo"])
y establecer el valor numérico por defecto que necesites antes de que
se haga la operación.
si ya vi que hay una diferencia cuando dice que es unsuscriptable es porque
no hay nada, por ejemplo si pido un reporte en una fecha donde no se haya
guardado nada, es decir, fines de semana feriados, etc. Pero si lo que esta
guardado es un 'None' el query si lo trae y por eso no hace la suma.
Gracias por la ayuda