SELECT IDProducto, Codigo, Descripcion,
ISNULL(SELECT TOP 1 ExistenciaFinal
FROM TbaKardex
WHERE (Fecha BETWEEN '20080215 00:00' AND
'20080215 13:59') AND (TbaKardex.IDProducto = TbaProducto.IDProducto)
ORDER BY IDKardex DESC).0) AS ExistenciaFinal
FROM TbaProducto
gracias de antemano,
Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com
Pasame la estructura de las tablas, ejemplos de datos y que buscas obtener
--
-----------------------------
Microsoft MVP SQLServer
www.sqltotalconsulting.com
-------------------------------
"Antonio Ortiz" <a...@aortiz.net> escribió en el mensaje de
noticias:#ZScdKOl...@TK2MSFTNGP04.phx.gbl...
Tabla: TbaKardex
IDKardex
Fecha {Contiene Fecha y hora
IDProducto
ExistenciaInicial
Cantidad
ExistenciaFinal
Tabla: TbaProducto
IDProducto
Codigo
Descripcion
-> La tabla TbaKardex contiene un registro por cada movimiento que afecta el
inventario, como puede ser: Compra, Venta, Entrada, Salida, Traspaso, lo
unico que necesito es que me diga el inventario que habia de cada producto a
una fecha (al final del dia). Si el producto no tuvo movimientos en la fecha
seleccionada, se toma existencia final del movimiento anterior. Si no existe
movimiento anterior a la fecha seleccionada la existencia sera 0.
gracias por tu tiempo,
Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com
"Maxi Accotto" <max...@infovia.com.ar.sacame> escribió en el mensaje
news:%23HJtq6R...@TK2MSFTNGP04.phx.gbl...
La estructura, algunos datos de ejemplo, y que buscas como resultado con
datos, o sea como deberia quedar el resultado segun los datos de ejemplo.
Porque el diseño de tu aplicacion lo conoces bien tu, yo puedo tirar quizas
una query aqui que ni te ayude.
Pasame eso si y vemos como resolver el problema
--
-----------------------------
Microsoft MVP SQLServer
www.sqltotalconsulting.com
-------------------------------
"Antonio Ortiz" <a...@aortiz.net> escribió en el mensaje de
noticias:ejjoxRSl...@TK2MSFTNGP02.phx.gbl...
SELECT IDProducto, Codigo, Descripcion, ISNULL
((SELECT TOP 1 ExistenciaFinal
FROM TbaKardex
WHERE (Fecha BETWEEN '20080215 00:00' AND
'20080215 13:59') AND (TbaKardex.IDProducto = TbaProducto.IDProducto)
ORDER BY IDKardex DESC), 0) AS ExistenciaFinal
FROM TbaProducto
* De cualquier manera te pongo los datos de ejemplo por si hay una mejor
forma de hacer la consulta:
TbaProducto
{ IDProducto, Codigo, Descripcion }
---------------------------------------
1, 100, Coca Cola
2, 120, Pepsi
3, 90, Fanta
4, 200, Sprite
TbaKardex
{ IDKardex, Fecha, IDProducto, ExistenciaInicial, Cantidad,
ExistenciaFinal }
--------------------------------------------------------------------------------
1000, 14/02/2008 11:30, 2, 10, 1, 9
1000, 14/02/2008 11:30, 2, 9, 1, 8
1000, 14/02/2008 11:30, 3, 5, 1, 4
1001, 14/02/2008 15:48, 1, 18, 1, 17
1000, 15/02/2008 09:02, 1, 17, 1, 16
1000, 15/02/2008 09:14, 3, 4, 1, 3
1000, 15/02/2008 09:02, 1, 16, 1, 15
1000, 15/02/2008 10:49, 1, 15, 1, 14
Con la consulta deberia obtener:
1, Coca Cola, 14
2, Pepsi, 8
3, Fanta, 3
4, Sprite, 0
Gracias por tu tiempo,
Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com
"Maxi Accotto" <max...@infovia.com.ar.sacame> escribió en el mensaje
news:esb9BNel...@TK2MSFTNGP03.phx.gbl...
SELECT TbaProducto.IDProducto, TbaProducto.Codigo, TbaProducto.Descripcion,
IsNull(K.ExistenciaInicial,0) as ExistenciaInicial, IsNull(K.Cantidad,0) as
Cantidad, IsNull(K.ExistenciaFinal,0) as ExistenciaFinal
FROM TbaProducto
LEFT OUTER JOIN
( SELECT TbaKardex.* FROM TbaKardex INNER JOIN ( SELECT TbaKardex.IDProducto
AS IDProducto, MAX(IDKardex) AS IDKardex
FROM TbaKardex WHERE (Fecha <= '20080215 23:59:59.99') And (IDAlmacen=1)
GROUP BY TbaKardex.IDProducto ) K2 ON TbaKardex.IDKardex=K2.IDKardex ) K
ON TbaProducto.IDProducto = K.IDProducto
Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com
"Antonio Ortiz" <a...@aortiz.net> escribió en el mensaje
news:uS2LTtel...@TK2MSFTNGP04.phx.gbl...
On 4 apr, 02:31, "Antonio Ortiz" <a...@aortiz.net> wrote:
> Despues de intentar varias veces de distintas maneras logre hacerlo de esta
> manera:
>
> SELECT IDProducto, Codigo, Descripcion, ISNULL
> ((SELECT TOP 1 ExistenciaFinal
> FROM TbaKardex
> WHERE (Fecha BETWEEN '20080215 00:00' AND
> '20080215 13:59') AND (TbaKardex.IDProducto = TbaProducto.IDProducto)
> ORDER BY IDKardex DESC), 0) AS ExistenciaFinal
> FROM TbaProducto
>
> * De cualquier manera te pongo los datos de ejemplo por si hay una mejor
> forma de hacer la consulta:
>
> TbaProducto
> { IDProducto, Codigo, Descripcion }
> ---------------------------------------
> 1, 100, Coca Cola
> 2, 120, Pepsi
> 3, 90, Fanta
> 4, 200, Sprite
>
> TbaKardex
> { IDKardex, Fecha, IDProducto, ExistenciaInicial, Cantidad,
> ExistenciaFinal }
> --------------------------------------------------------------------------------
> 1000, 14/02/2008 11:30, 2, 10, 1, 9
> 1000, 14/02/2008 11:30, 2, 9, 1, 8
> 1000, 14/02/2008 11:30, 3, 5, 1, 4
> 1001, 14/02/2008 15:48, 1, 18, 1, 17
> 1000, 15/02/2008 09:02, 1, 17, 1, 16
> 1000, 15/02/2008 09:14, 3, 4, 1, 3
> 1000, 15/02/2008 09:02, 1, 16, 1, 15
> 1000, 15/02/2008 10:49, 1, 15, 1, 14
>
> Con la consulta deberia obtener:
>
> 1, Coca Cola, 14
> 2, Pepsi, 8
> 3, Fanta, 3
> 4, Sprite, 0
>
Yo entiendo que lo que necesitas es la ExistenciaFinal
por producto, por día, que con los datos que das deberías
obtener esto:
1, Coca Cola, 14/02/2008, 17
1, Coca Cola, 15/02/2008, 14
2, Pepsi, 14/02/2008, 8
3, Fanta, 14/02/2008, 4
3, Fanta, 15/02/2008, 3
4, Sprite, , 0
A ver si te vale la siguiente consulta.
Por producto, por dia, selecciona el registro con ExistenciaFinal
para el que no existe otro registro con ExistenciaInicial igual
a esa ExistenciaFinal. (Espero se entienda.)
select
P.IDProducto,
P.Descripcion,
convert(char(10),K.Fecha,103) as Fecha,
K.ExistenciaFinal
from
TbaProducto P
Left join
(
select
K1.IDProducto,
K1.Fecha,
K1.ExistenciaFinal
from
TbaKardex K1
where
not exists
(
select *
from TbaKardex
where
IDProducto = K1.IDProducto and
convert(char(8),Fecha,112) = convert(char(8),K1.Fecha,112)
and
ExistenciaInicial = K1.ExistenciaFinal
)
) K on P.IDProducto= K.IDProducto
order by
P.IDProducto,
K.Fecha
Saludos,
Carlos
saludos,
Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com
"Carlos M. Calvelo" <c_ja...@hotmail.com> escribió en el mensaje
news:ade2622b-9707-4615...@d45g2000hsc.googlegroups.com...
On 4 apr, 18:48, "Antonio Ortiz" <a...@aortiz.net> wrote:
> Gracias, solo necesito la existencia al final del dia que indico, esto es,
> el mi aplicacion existe un cuadro de texto donde el usuario indica la fecha
> a la cual desea obtener las existencias de todos los productos. Si observas
> en un dia determinado no todos los productos tienen movimientos, entonces la
> existencia sera la del movimiento anterior inmediato.
>
He puesto la solución anterior porque en los datos que has puesto
de ejemplo me salto lo siguiente a la vista:
{ IDKardex, Fecha, IDProducto, ExistenciaInicial, Cantidad,
ExistenciaFinal }
1000, 14/02/2008 11:30, 2, 10, 1, 9
1000, 14/02/2008 11:30, 2, 9, 1, 8
Dos registros del mismo producto con la misma fecha y hora
y he pensado que la ExistenciaFinal (= 9) del primero es la
ExistenciaInicial del segungo (= 9) y por lo tanto tenemos
que seleccionar el segundo.
O sea que con la fecha y hora no es suficiente para seleccionar
el último.
Al mismo tiempo veo que IDKardex es para los dos registros
el mismo y eso me hace pensar que estos datos no son reales.
Entonces dudo cual es el orden de los registros; la fecha,
ExistenciaInicial y Final o una combinación de los dos.
Es necesario aclarar antes esto para determinar cual es
el último movimiento antes de una fecha determinada.
Saludos,
Carlos
saludos,
Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com
"Carlos M. Calvelo" <c_ja...@hotmail.com> escribió en el mensaje
news:8ab6e80b-5d72-47e6...@s8g2000prg.googlegroups.com...
On 6 apr, 21:18, "Antonio Ortiz" <a...@aortiz.net> wrote:
> Disculpas, fue un error mio, IDKardex es incremental y deberia se secuencial
>
Pues a mi me parece que la solución que tu has encontrado
ha está bastante bien no?
En el FROM puedes evitarte un SELECT * FROM porque
SELECT TbaKardex.* FROM TbaKardex
es lo mismo que simplemente TbaKardex
FROM
TbaProducto
LEFT OUTER JOIN
( TbaKardex K
INNER JOIN
( SELECT IDProducto,
MAX(IDKardex) AS IDKardex
FROM TbaKardex
WHERE (Fecha <= '20080215 23:59:59.99') And (IDAlmacen=1)
GROUP BY IDProducto
) K2 ON K.IDKardex=K2.IDKardex
) ON TbaProducto.IDProducto = K.IDProducto
Supongo que la fecha viene en una cadena 'AAAAMMDD'
Entonces yo pondría un
(Fecha < CAST(@fecha as datetime) + 1)
en vez de
(Fecha <= @fecha + ' 23:59:59.99')
En fin... solo detalles de los que se puede decir que
para gustos se pintan colores.
Saludos,
Carlos
Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com
"Carlos M. Calvelo" <c_ja...@hotmail.com> escribió en el mensaje
news:3deaaf5a-87e6-4f25...@v32g2000prd.googlegroups.com...