Consulta de Tipo Kardex Con Formato de Cortes

09/01/2008 - 19:08 por Dany Acosta | Informe spam
Amigos,
necesito hacer una consulta tipo kardex con pura sentencia SQL y tener el
siguiente resultado

Prod Fecha Det. Mov Ingreso Salida Saldo
XXX 01/01/2007 Saldo Anterior 0 0 800
XXX 14/12/2007 Ventas 0 1 799
XXX 15/12/2007 Inv. Fisico 0 0 30 --> Aca existe nuevo saldo inicial debido
a corte de Inv.
XXX 18/12/2007 Compras 64 0 94
XXX 18/12/2007 Muestras 0 1 93
XXX 18/12/2007 Compras 1 0 94
XXX 18/12/2007 Inv. Fisico 0 0 50 --> Aca existe nuevo saldo inicial debido
a corte de Inv.
XXX 31/12/2007 Ventas 0 4 46
XXX 31/12/2007 Ventas 0 7 39


Como puedo llegar a esto.

Tablas participantes

D_kardex
Prod_Pk char (8)
Fecha datetime
Det_Mov v(50)
Ingreso decimal (10,2)
Salida decima(10,2)

D_Inve
Prod_Pk char(8)
Fecha datetime
Det_Mov v(50)
Cant_Inve decimal (10,2)


Desde ya muchas gracias por toda la informacin que me puedan brindar

Dany Acosta - Developers

Preguntas similare

Leer las respuestas

#1 Maxi
10/01/2008 - 02:03 | Informe spam
Hola, te paso un ejemplo:

create table movimientos (articulo varchar(30),
tipo char(1)
check(tipo='E' or tipo='S'),
cantidad int, fecha datetime,
transaccion int identity)
go



insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','E',100,getdate())

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','E',10,getdate())

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','E',10,getdate()+2)

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','E',15,getdate()+3)

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','S',30,getdate())

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','S',10,getdate()+1)

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','S',20,getdate()+4)


insert into movimientos (articulo,tipo,cantidad,fecha)
values
('HDD','S',20,getdate()+4)

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('HDD','S',10,getdate())

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('HDD','E',100,getdate()+5)

update movimientos set fecha = convert(char(8),fecha,112)


SELECT SUM(CASE WHEN TIPO='E' THEN CANTIDAD
ELSE -CANTIDAD END) AS SALDO,
ARTICULO
FROM MOVIMIENTOS
GROUP BY ARTICULO


SELECT M.ARTICULO,FECHA,SUM(CASE WHEN TIPO='E' THEN CANTIDAD
ELSE -CANTIDAD END) AS NETO_DIARIO,
(SELECT SUM(CASE WHEN TIPO='E' THEN CANTIDAD
ELSE -CANTIDAD END) AS SALDO
FROM MOVIMIENTOS M2
WHERE M2.ARTICULO = M.ARTICULO AND
M2.FECHA <= M.FECHA) AS SALDO
FROM MOVIMIENTOS M
WHERE ARTICULO = 'MOUSE'
GROUP BY ARTICULO,FECHA
ORDER BY FECHA





-
Microsoft M.V.P en SQLServer
SQLTotal Consulting - Servicios en SQLServer
Email:
"Dany Acosta" escribió en el mensaje
news:
Amigos,
necesito hacer una consulta tipo kardex con pura sentencia SQL y tener el
siguiente resultado

Prod Fecha Det. Mov Ingreso Salida Saldo
XXX 01/01/2007 Saldo Anterior 0 0 800
XXX 14/12/2007 Ventas 0 1 799
XXX 15/12/2007 Inv. Fisico 0 0 30 --> Aca existe nuevo saldo inicial
debido a corte de Inv.
XXX 18/12/2007 Compras 64 0 94
XXX 18/12/2007 Muestras 0 1 93
XXX 18/12/2007 Compras 1 0 94
XXX 18/12/2007 Inv. Fisico 0 0 50 --> Aca existe nuevo saldo inicial
debido a corte de Inv.
XXX 31/12/2007 Ventas 0 4 46
XXX 31/12/2007 Ventas 0 7 39


Como puedo llegar a esto.

Tablas participantes

D_kardex
Prod_Pk char (8)
Fecha datetime
Det_Mov v(50)
Ingreso decimal (10,2)
Salida decima(10,2)

D_Inve
Prod_Pk char(8)
Fecha datetime
Det_Mov v(50)
Cant_Inve decimal (10,2)


Desde ya muchas gracias por toda la informacin que me puedan brindar

Dany Acosta - Developers
Respuesta Responder a este mensaje
#2 Dany
10/01/2008 - 19:49 | Informe spam
El tema maxi e como hago para tomar el saldo antes del corte para poder restar. PAso nuevamente el
cuadro ligeramente modificado para que veas.
En las filas donde dice CORTE no hay ingreso ni salida sola hay un valor que tiene la columma inve.
ahi esta mi problema como hago para que el saldo se vuelva a generar nuevamente cuando existe corte
entre las filas.


Prod Fecha Inve Ingreso Salida Saldo
XXX 01/01/2007 0.00 0.00 0.00 800.00
XXX 14/12/2007 0.00 0.00 1.00 799.00
XXX 15/12/2007 30.00 0.00 0.00 30.00
XXX 18/12/2007 0.00 64.00 0.00 94.00 (Corte)
XXX 18/12/2007 0.00 0.00 1.00 93.00
XXX 18/12/2007 0.00 1.00 0.00 94.00
XXX 18/12/2007 50.00 0.00 0.00 50.00 (Corte)
XXX 31/12/2007 0.00 0.00 4.00 46.00
XXX 31/12/2007 0.00 0.00 7.00 39.00


Gracias

Dany Acosta

Maxi wrote:
Hola, te paso un ejemplo:

create table movimientos (articulo varchar(30),
tipo char(1)
check(tipo='E' or tipo='S'),
cantidad int, fecha datetime,
transaccion int identity)
go



insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','E',100,getdate())

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','E',10,getdate())

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','E',10,getdate()+2)

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','E',15,getdate()+3)

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','S',30,getdate())

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','S',10,getdate()+1)

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','S',20,getdate()+4)


insert into movimientos (articulo,tipo,cantidad,fecha)
values
('HDD','S',20,getdate()+4)

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('HDD','S',10,getdate())

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('HDD','E',100,getdate()+5)

update movimientos set fecha = convert(char(8),fecha,112)


SELECT SUM(CASE WHEN TIPO='E' THEN CANTIDAD
ELSE -CANTIDAD END) AS SALDO,
ARTICULO
FROM MOVIMIENTOS
GROUP BY ARTICULO


SELECT M.ARTICULO,FECHA,SUM(CASE WHEN TIPO='E' THEN CANTIDAD
ELSE -CANTIDAD END) AS NETO_DIARIO,
(SELECT SUM(CASE WHEN TIPO='E' THEN CANTIDAD
ELSE -CANTIDAD END) AS SALDO
FROM MOVIMIENTOS M2
WHERE M2.ARTICULO = M.ARTICULO AND
M2.FECHA <= M.FECHA) AS SALDO
FROM MOVIMIENTOS M
WHERE ARTICULO = 'MOUSE'
GROUP BY ARTICULO,FECHA
ORDER BY FECHA




Respuesta Responder a este mensaje
#3 Maxi Accotto
11/01/2008 - 01:34 | Informe spam
Hola, la verdad que me cuesta verlo, necesitaria que me envies:

1) Definicion de la tabla
2) insert de algunos registros
3) Como quieres que quede

Atachalo a un archivo please!


Microsoft MVP SQLServer
www.sqltotalconsulting.com
-

"Dany" escribió en el mensaje de
noticias:
El tema maxi e como hago para tomar el saldo antes del corte para poder
restar. PAso nuevamente el cuadro ligeramente modificado para que veas.
En las filas donde dice CORTE no hay ingreso ni salida sola hay un valor
que tiene la columma inve. ahi esta mi problema como hago para que el
saldo se vuelva a generar nuevamente cuando existe corte entre las filas.


Prod Fecha Inve Ingreso Salida Saldo
XXX 01/01/2007 0.00 0.00 0.00 800.00
XXX 14/12/2007 0.00 0.00 1.00 799.00
XXX 15/12/2007 30.00 0.00 0.00 30.00
XXX 18/12/2007 0.00 64.00 0.00 94.00 (Corte)
XXX 18/12/2007 0.00 0.00 1.00 93.00
XXX 18/12/2007 0.00 1.00 0.00 94.00
XXX 18/12/2007 50.00 0.00 0.00 50.00 (Corte)
XXX 31/12/2007 0.00 0.00 4.00 46.00
XXX 31/12/2007 0.00 0.00 7.00 39.00


Gracias

Dany Acosta

Maxi wrote:
Hola, te paso un ejemplo:

create table movimientos (articulo varchar(30),
tipo char(1)
check(tipo='E' or tipo='S'),
cantidad int, fecha datetime,
transaccion int identity)
go



insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','E',100,getdate())

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','E',10,getdate())

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','E',10,getdate()+2)

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','E',15,getdate()+3)

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','S',30,getdate())

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','S',10,getdate()+1)

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','S',20,getdate()+4)


insert into movimientos (articulo,tipo,cantidad,fecha)
values
('HDD','S',20,getdate()+4)

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('HDD','S',10,getdate())

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('HDD','E',100,getdate()+5)

update movimientos set fecha = convert(char(8),fecha,112)


SELECT SUM(CASE WHEN TIPO='E' THEN CANTIDAD
ELSE -CANTIDAD END) AS SALDO,
ARTICULO
FROM MOVIMIENTOS
GROUP BY ARTICULO


SELECT M.ARTICULO,FECHA,SUM(CASE WHEN TIPO='E' THEN CANTIDAD
ELSE -CANTIDAD END) AS NETO_DIARIO,
(SELECT SUM(CASE WHEN TIPO='E' THEN CANTIDAD
ELSE -CANTIDAD END) AS SALDO
FROM MOVIMIENTOS M2
WHERE M2.ARTICULO = M.ARTICULO AND
M2.FECHA <= M.FECHA) AS SALDO
FROM MOVIMIENTOS M
WHERE ARTICULO = 'MOUSE'
GROUP BY ARTICULO,FECHA
ORDER BY FECHA




Respuesta Responder a este mensaje
#4 Dany Acosta
11/01/2008 - 15:35 | Informe spam
Éste es un mensaje de varias partes en formato MIME.
=_NextPart_000_000A_01C85435.665426D0
format=flowed;
reply-type=response

Gracias maxi por todo el apoyo que me estas dando Yo ya estoy a punto de
Usar Cursores como ultimo recurso.





"Maxi Accotto" escribió en el mensaje de
noticias:em7aLF#
Hola, la verdad que me cuesta verlo, necesitaria que me envies:

1) Definicion de la tabla
2) insert de algunos registros
3) Como quieres que quede

Atachalo a un archivo please!


Microsoft MVP SQLServer
www.sqltotalconsulting.com
-

"Dany" escribió en el mensaje de
noticias:
El tema maxi e como hago para tomar el saldo antes del corte para poder
restar. PAso nuevamente el cuadro ligeramente modificado para que veas.
En las filas donde dice CORTE no hay ingreso ni salida sola hay un valor
que tiene la columma inve. ahi esta mi problema como hago para que el
saldo se vuelva a generar nuevamente cuando existe corte entre las filas.


Prod Fecha Inve Ingreso Salida Saldo
XXX 01/01/2007 0.00 0.00 0.00 800.00
XXX 14/12/2007 0.00 0.00 1.00 799.00
XXX 15/12/2007 30.00 0.00 0.00 30.00
XXX 18/12/2007 0.00 64.00 0.00 94.00 (Corte)
XXX 18/12/2007 0.00 0.00 1.00 93.00
XXX 18/12/2007 0.00 1.00 0.00 94.00
XXX 18/12/2007 50.00 0.00 0.00 50.00 (Corte)
XXX 31/12/2007 0.00 0.00 4.00 46.00
XXX 31/12/2007 0.00 0.00 7.00 39.00


Gracias

Dany Acosta

Maxi wrote:
Hola, te paso un ejemplo:

create table movimientos (articulo varchar(30),
tipo char(1)
check(tipo='E' or tipo='S'),
cantidad int, fecha datetime,
transaccion int identity)
go



insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','E',100,getdate())

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','E',10,getdate())

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','E',10,getdate()+2)

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','E',15,getdate()+3)

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','S',30,getdate())

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','S',10,getdate()+1)

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('mouse','S',20,getdate()+4)


insert into movimientos (articulo,tipo,cantidad,fecha)
values
('HDD','S',20,getdate()+4)

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('HDD','S',10,getdate())

insert into movimientos (articulo,tipo,cantidad,fecha)
values
('HDD','E',100,getdate()+5)

update movimientos set fecha = convert(char(8),fecha,112)


SELECT SUM(CASE WHEN TIPO='E' THEN CANTIDAD
ELSE -CANTIDAD END) AS SALDO,
ARTICULO
FROM MOVIMIENTOS
GROUP BY ARTICULO


SELECT M.ARTICULO,FECHA,SUM(CASE WHEN TIPO='E' THEN CANTIDAD
ELSE -CANTIDAD END) AS NETO_DIARIO,
(SELECT SUM(CASE WHEN TIPO='E' THEN CANTIDAD
ELSE -CANTIDAD END) AS SALDO
FROM MOVIMIENTOS M2
WHERE M2.ARTICULO = M.ARTICULO AND
M2.FECHA <= M.FECHA) AS SALDO
FROM MOVIMIENTOS M
WHERE ARTICULO = 'MOUSE'
GROUP BY ARTICULO,FECHA
ORDER BY FECHA










=_NextPart_000_000A_01C85435.665426D0
format=flowed;
name="kardex SQL.txt";
reply-type=response
filename="kardex SQL.txt"

Create table d_movikard
(
anio_movi smallint not null,
docuid_movi int not null,
fec_docu_movi date,
des_vta varchar(20),
cdg_prod char(5),
ingreso d(12,4),
salida d(12,4)
)
go
Create table d_movcorte
(
anio_corte smallint not null,
docuid_corte int not null,
fec_docu_corte date,
des_corte varchar(20),
cant_corte decimal n(12,2)
)
go

Insert into d_movikard
(anio_movi,docuid_movi,fec_documovi,des_vta,cdg_prod,ingreso,salida)
values (2007,1,'20071213','Ing. Compras', '00001',800,0)
go
Insert into d_movikard
(anio_movi,docuid_movi,fec_documovi,des_vta,cdg_prod,ingreso,salida)
values (2007,2,'20071214','Sal. Ventas', '00001',0,1)
go
Insert into d_movikard
(anio_movi,docuid_movi,fec_documovi,des_vta,cdg_prod,ingreso,salida)
values (2007,3,'20071218','Ing. Compras', '00001',64,0)
go
Insert into d_movikard
(anio_movi,docuid_movi,fec_documovi,des_vta,cdg_prod,ingreso,salida)
values (2007,4,'20071218','Sal. Muestra', '00001',0,1)
go
Insert into d_movikard
(anio_movi,docuid_movi,fec_documovi,des_vta,cdg_prod,ingreso,salida)
values (2007,5,'20071218','Ing. Compras', '00001',1,0)
go
Insert into d_movikard
(anio_movi,docuid_movi,fec_documovi,des_vta,cdg_prod,ingreso,salida)
values (2007,6,'20071231','Sal. Ventas', '00001',0,4)
go
Insert into d_movikard
(anio_movi,docuid_movi,fec_documovi,des_vta,cdg_prod,ingreso,salida)
values (2007,7,'20071231','Sal. Ventas', '00001',0,7)
go


insert into d_movcorte
(anio_corte, docuid_corte,fec_docu_corte,des_corte,cant_corte)
values (2007,1,'20071215','Corte. x Inv.',30)
go

insert into d_movcorte
(anio_corte, docuid_corte,fec_docu_corte,des_corte,cant_corte)
values (2007,1,'20071218','Corte. x Inv.',50)
go




- Resultado Esperado
Fecha Det.Mov Ingreso Salida Saldo
13/12/2007 Ing.Compras 800.00 0.00 800.00
14/12/2007 Sal. Ventas 0.00 1.00 799.00
15/12/2007 Corte. x Inv. 0.00 0.00 30.00
18/12/2007 Ing. Compras 64.00 0.00 94.00
18/12/2007 Sal.Muestras 0.00 1.00 93.00
18/12/2007 Ing. Compras 1.00 0.00 94.00
18/12/2007 Corte. x inv. 0.00 0.00 50.00
31/12/2007 Sal. Ventas 0.00 4.00 46.00
31/12/2007 Sal. Ventas 0.00 7.00 39.00






=_NextPart_000_000A_01C85435.665426D0--
Respuesta Responder a este mensaje
#5 Carlos M. Calvelo
11/01/2008 - 22:53 | Informe spam
Hola Dany,

On 11 jan, 15:35, "Dany Acosta" wrote:
Gracias maxi por todo el apoyo que me estas dando Yo ya estoy a punto de
Usar Cursores como ultimo recurso.




Aquí abajo te dejo una solución.

Se asumen dos cosas:
1) no se debe producir mas mas que un corte en una fecha
2) 'docuid_movi' es único dentro de un grupo de movimentos
con la misma fecha.

Saludos,
Carlos
-
select A.Fecha, A.DetMov, A.Ingreso, A.Salida, A.Saldo
from
(
select
0 as tipo,
docuid_movi,
fec_documovi as Fecha,
des_vta as DetMov,
ingreso as Ingreso,
salida as Salida,
(isnull((select cant_corte
from d_movcorte
where fec_docu_corte (select max(fec_docu_corte) from d_movcorte
where fec_docu_corte < K.fec_documovi)),0))
+
(select isnull(sum(ingreso-salida),0)
from d_movikard
where (fec_documovi < K.fec_documovi or
(fec_documovi = K.fec_documovi and
docuid_movi <= K.docuid_movi))
and fec_documovi >
isnull((select max(fec_docu_corte)
from d_movcorte
where fec_docu_corte < K.fec_documovi),0)) as Saldo
from d_movikard K
union
select 1 as tipo,
0 as docuid_movi,
fec_docu_corte as Fecha,
des_corte as DetMov,
0 as Ingreso,
0 as Salida,
cant_corte as Saldo
from d_movcorte
) A
order by A.Fecha,A.Tipo,A.docuid_movi
-
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida