Hola de nuevo.
Me surge otra cuestión:
en el buscador que estoy haciendo de movimientos hay distintos
controles y en función de lo que busques se genera un filtro u
otro:
# Filtro, estado inicial, siempre hay fechas y id de almacen.
filtro = (movimientos.fecha>= d1, movimientos.fecha<=d2, movimientos.id_almacen == almId, movimientos.tipo.like(tpn))
if articulo.isdigit(): #movimientos de un artículo concreto.
filtro = (movimientos.fecha>= d1, movimientos.fecha<=d2, movimientos.id_almacen == almId, movimientos.id_articulo == articulo)
if en.isdigit():
filtro = (movimientos.fecha>= d1, movimientos.fecha<=d2, movimientos.id_almacen == almId, movimientos.id_entidad == en)
mov = session.query(movimientos).filter(*filtro).all()
Esto no la mejor forma de hacerlo, pero no se otra. Estas tuplas
no me permiten concatenar
¿ Como podría hacerse ?
Había pensado como alternativa usar "Like" en cada campo como en
el "tipo" que cuando son todos lleva "%" ¿ sería correcto usar
este sistema ?
Saludos.
El 05/03/2016 a las 12:28, Ricardo Cárdenes escribió:
Un JOIN normal hace exactamente eso: un cruce entre
las dos tablas mostrando las filas donde hay coincidencias. Es
lo que se llama "inner join" (una combinación interna). Lo que
tú quieres es que se muestren todas las filas de una de las
tablas que participan en la combinación y que, de la otra,
aparezcan los datos que coinciden. Esto se denomina "outer join"
(combinación externa). Las combinaciones externas las tienes de
dos tipos, por la izquierda y por la derecha, dependiendo de qué
tabla tenga que salir entera. Es decir:
.... FROM articulos LEFT OUTER JOIN movimientos ...
Obtendrá una nueva tabla donde aparecerán todas las filas
de "artículos" (la tabla "por la izquierda") y también las
filas de movimientos que correspondan. Para las filas de
artículos sin movimientos, esas columnas aparecerán
(normalmente) como valores nulos, no como 0. Eso te debería
dará valores incorrectos para el sumatorio, porque NULL +
valor numérico debería ser NULL. Una solución es usar, por
ejemplo, la función COALESCE (es del estándar SQL y SQLite la
soporta). Se usaría así:
func.sum(func.coalesce(movimientos.uEntrada, 0))
si no recuerdo mal. Lo que hace COALESCE es tomar una serie
de valores y devolver el primero que no sea NULL. De esa
manera, si movimientos.uEntrada es NULL, devolverá 0.
Saludos,
Ricardo
_______________________________________________
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/