"movimiento" de informacion

54 views
Skip to first unread message

BlackLion

unread,
Feb 28, 2012, 12:55:32 PM2/28/12
to web2py-usuarios
Me encuentro desarrollando una aplicación que maneja una base de
datos, referente a un proceso productivo, cuyos subprocesos poseen
entradas y salidas, es conocido que la salida del paso A se convierte
en la entrada del paso B y así sucesivamente. Quisiera saber si existe
alguna forma de reflejar una especie de movimiento de materia prima
entre los pasos del procesos productivo, es decir, que si transfiero
100 unidades de material de A a B, se me actualicen las tablas que
representan a ambos pasos

Alan Etkin

unread,
Feb 29, 2012, 10:20:48 AM2/29/12
to web2py-usuarios
Creo que una forma de resolverlo es con código en el controlador:

función movimiento:
# acá faltaría algo
# que consulte los registros
# a actualizar
cantindad = 100
origen = registro A
destino = registro B
sumar 100 a A en la base de datos
restar 1000 a B en la base de datos
# opcional
registrar cambio en una tabla auxiliar

Otra forma sería asignar código a ejecutar al actualizarse un registro
de la base de datos, pero no sé si Field provee un atributo para esa
funcionalidad. Creo que está en discusión en este issue:
http://code.google.com/p/web2py/issues/detail?id=354

BlackLion

unread,
Feb 29, 2012, 1:40:03 PM2/29/12
to web2py-usuarios
ok muchas gracias, yo pense que se hacia con crud, pero tratare de
montar algo con el algoritmo que me indicaste

BlackLion

unread,
Mar 1, 2012, 7:04:56 AM3/1/12
to web2py-usuarios

siguiendo el consejo de Alan estoy tratando de hacer el algoritmo de
la actualización como una función:

def movimiento(campo1,campo2,tabla1,tabla2,cant,dt,sh):
a = db.tabla1.fecha
b = db.tabla1.turno
c = db.tabla2.fecha
d = db.tabla2.turno
s = db((a == dt) & (b == sh)).select(campo1)
s1 = db((c == dt) & (d == sh)).select(campo2)
rst = s-cant
ac = db((a == dt) & (b == sh)).update(campo1 = rst)
su = s1+cant
ac1 = db((c == dt) & (d == sh)).update(campo2 = su)
return (ac,ac1)
pero cuando la voy a utilizar:

def movs():

var = movimiento('disco_10','tapa_10','linea_corte','estampado',
100,'2012-02-28','dia')

return dict(var=var)
me da este error:

TRACEBACK

Traceback (most recent call last):
File "gluon/restricted.py", line 204, in restricted
File "D:/Documents and Settings/biblioteca/Escritorio/web2py/
applications/gestpro/controllers/default.py", line 380, in <module>
File "gluon/globals.py", line 172, in <lambda>
File "D:/Documents and Settings/biblioteca/Escritorio/web2py/
applications/gestpro/controllers/default.py", line 376, in movs
File "D:/Documents and Settings/biblioteca/Escritorio/web2py/
applications/gestpro/controllers/default.py", line 363, in movimiento
File "gluon/dal.py", line 5119, in __getattr__
File "gluon/dal.py", line 5113, in __getitem__
KeyError: 'tabla'

es decir parece que la funcion no esta asignando los valores a las
variabes pq lo lógico es que "tabla=linea_corte".
Agradezco si me pueden ayudar

Alan Etkin

unread,
Mar 1, 2012, 9:05:43 AM3/1/12
to web2py-usuarios
No sé porqué te da ese traceback (¿Qué es "tabla"?), pero lo que noto
es que estás accediendo en forma incorrecta a la tabla en db:

Lo que podés hacer es:

db[<string con nombre de tabla>].fecha

En lugar de:

db.string_con_tabla.fecha

Si usás la notación de punto, string_de_tabla tiene que ser un
atributo de db (normalmente el nombre de una tabla definida
con .define_table)

BlackLion

unread,
Mar 8, 2012, 1:26:32 PM3/8/12
to web2py-...@googlegroups.com
disculpen la demora pero no funciona con  "db[<string con nombre de tabla>].fecha" da error de sintaxis ademas si funcionara hacer toda la cuestion de la suma y la actualizacion es complikdo pq al parecer cuando se hace un "variable = db().select()" en variable no se guarda solo el valor de la tabla sino el nombre del campo, el tipo de valor que almacena y de ultimo el valor, entonces no se puede hacer ninguna operacion aritmetica, debe existir otra forma de hacer la actualizacion del campo

nicolás rosbaco

unread,
Mar 8, 2012, 5:26:48 PM3/8/12
to web2py-...@googlegroups.com
variable = db().select(db.nombreTabla.ALL)
te devuleve un objeto iterable con todos los registros de la tabla....
mira acá: http://www.latinuxpress.com/books/drafts/web2py/caps/cap6.htm

por ejemplo, para acceder a los datos sería algo así:

registros = db().select(db.nombreTabla.ALL)
for registro in registros:
   miLista.append(registro.nombreDelCampo)

y listo, tenés una lista con TODOS los datos que estaban registrados en el campo nombreDelCampo de la tabla referida.....

No entiendo muy bien lo que decís pero intuyo que te esta sorprendiendo un poco el resultado del select.... mirá el capítulo ese que me parece está más que bien para el tema....

suerte , espero sirva


El 8 de marzo de 2012 15:26, BlackLion <omar.f...@gmail.com> escribió:
disculpen la demora pero no funciona con  "db[<string con nombre de tabla>].fecha" da error de sintaxis ademas si funcionara hacer toda la cuestion de la suma y la actualizacion es complikdo pq al parecer cuando se hace un "variable = db().select()" en variable no se guarda solo el valor de la tabla sino el nombre del campo, el tipo de valor que almacena y de ultimo el valor, entonces no se puede hacer ninguna operacion aritmetica, debe existir otra forma de hacer la actualizacion del campo



--
"En un país colonial las oligarquías son las dueñas de los diccionarios" (John William Cooke)

Omar Fariñez

unread,
Mar 8, 2012, 5:56:13 PM3/8/12
to web2py-...@googlegroups.com
yo se que ese select me trae todo pero yo necesito uno para sumarlo a una variable y el resultado de la suma guardarlo en el mismo campo q me traje con el query, algo asi:

query = db.nombre_tabla.nombre_campo
a = db(query).select(query, orderby=~query, limitby=(0,1))
b = valor entero 
suma = a + b
y luego hacer el update al mismo query
--
Omar Fariñez

nicolás rosbaco

unread,
Mar 8, 2012, 6:45:36 PM3/8/12
to web2py-...@googlegroups.com
aja....:

No entiendo tu consulta (a la tabla digo), parecería traes un único registro. Yo uso .first() para hacer eso... así que no me doy cuenta bien que haces....

pero en definitiva (CREO) deberías traer el id del registro cuando haces la consulta, porque la única manera que imagino de actualizar la tabla es LUEGO de la consulta, LUEGO de realizar la modificación del valor del campo en el fieldset (resultado de la consulta) hacer un update.... y me parece sería piola tener el id para actualizar más fácil....

¿se entiende lo que digo? de todos modos no se si te servirá-

nos vemos

Alan Etkin

unread,
Mar 9, 2012, 5:56:12 AM3/9/12
to web2py-usuarios
Por conjuntos de registros creo que no se puede aplicar una expresión
genérica. Lo que te tiene que andar es esto:

registros = ... .select()
for registro in registros:
registro.update_record(campo_sumado=registro.campo_sumado +
incremento)

Habría que ver si anda esto, yo no lo intenté, si no, sería
interesante proponerlo como mejora:

db(query).update(campo_sumado=lambda row: row.campo_sumado +
incremento)

Además podés usar computed fields:

db.tabla.campo.compute = lambda row ...

Pero con este atributo, el campo se actualiza cada vez que se hace
update o insert y no se especificó un valor.

Omar Fariñez

unread,
Mar 9, 2012, 7:01:22 AM3/9/12
to web2py-...@googlegroups.com
el query lo hago de esa forma pq siempre quiero seleccionar el ultimo valor de la tabla, no se como seria con el id, además no pretendo actualizar todos los registros del campo solo el ultimo, pero al parecer es mas complicado de lo que imaginaba jeje

Omar Fariñez

Alan Etkin

unread,
Mar 9, 2012, 7:43:00 AM3/9/12
to web2py-usuarios
Fijate en el libro (4a edición) 6.17.8 "Expressions", es algo de lo
que no estaba al tanto y es muy práctico:

db(db.mitabla.campo.id == n).update(campo=db.mitabla.campo +
incremento)

Para recuperar el último registro de la lista consultada podés
usar .select().last() creo. El tema es que ahí tenés que estar seguro
de que la consulta va a tener el orden con la instancia que te
interesa al final. Una forma más segura me parece es restringir el
query string lo mejor posible para que al hacer el select() tengas
como máximo un registro y de ese modo lo podés recuperar con .first().
En fin, quizás alguien de la lista tenga algún algoritmo más apropiado
para el problema.

Gustavo

unread,
Mar 9, 2012, 7:57:26 AM3/9/12
to web2py-...@googlegroups.com

Hola a todos:

Hasta ahora he trabajado con el m�todo tradicional que propone web2py en
la presentaci�n de la aplicaci�n., o sea se expone el men� aunque para
acceder lleve siempre a la autenticaci�n, c�mo puedo llevar el ambiente
a que no se muestre el men� sino ha sido autenticado

gracias por adelantado

saludos

Gustavo

Luis Díaz

unread,
Mar 9, 2012, 8:13:10 AM3/9/12
to web2py-...@googlegroups.com
prueba lo siguiente en models/menu.py:

if auth.is_logged_in():
    response.menu += [
            ('solo para usuarios registrados ;)', False, URL('default','otro'), []),
    ]



Díaz Luis
Analista Programador Facultad de Odontología UC
http://www.about.me/diazluis
User Linux 532223




El 9 de marzo de 2012 08:27, Gustavo <gustavo....@etecsa.cu> escribió:

Hola a todos:

Hasta ahora he trabajado con el método tradicional que propone web2py en la presentación de la aplicación., o sea se expone el menú aunque para acceder lleve siempre a la autenticación, cómo puedo llevar el ambiente a que no se muestre el menú sino ha sido autenticado


gracias por adelantado



saludos

Gustavo

---
This message was processed by Kaspersky Mail Gateway 5.6.28/RELEASE running at host imx3.etecsa.cu
Visit our web-site: <http://www.kaspersky.com>, <http://www.viruslist.com>


BlackLion

unread,
Mar 9, 2012, 8:37:28 AM3/9/12
to web2py-...@googlegroups.com
creo que lo mas fácil sera no tratar de hacer la actualización de manera automática sino colocar un grid que me muestre el ultimo registro de la tabla y permitir que lo actualicen y ya
Reply all
Reply to author
Forward
0 new messages