EXIBIR ESTOQUE ATUALIZADO

PAULOROMEIRO 03/01/2014 10:19:34
#432612
Bom dia Amigos.

Tenho a seguinte query que é chamada em um relatório

;WITH CTE AS
(
SELECT
ROW_NUMBER() OVER (ORDER BY X.NF, X.DATA) as ID,
X.*
FROM
(
SELECT
P.Descricao AS Descricao,
P.Cod_Produto AS Codigo_do_Produto,
ESI.Id_Doc AS NF,
--ESI.Cod_Estoque AS Cod_Estoque,
ESI.Cod_Produto AS Cod_Produto,
ESI.Cod_Empresa AS Cod_Empresa,
S.Dta_Entrada AS Data,
--S.Usuario AS Usuario,
ESI.Qtde AS Qtde,
ESI.V_Unitario AS V_Unitario,
--ESI.Anula_Item AS Item_Anualdo,
ESI.V_Total AS V_Total,
S.Id_Doc AS Id_Doc
--,EST.Qtde_Estoque AS ESTOQUE_TOTAL

FROM
dbo.Entrada_Itens AS ESI INNER JOIN
dbo.Produtos AS P ON ESI.Cod_Empresa = P.Cod_Empresa AND ESI.Cod_Estoque = P.Cod_Estoque AND ESI.Cod_Produto = P.Cod_Produto INNER JOIN
dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc INNER JOIN
[dbo].[Estoque] AS EST ON EST.Cod_Empresa = S.Cod_Empresa AND EST.Cod_Produto = P.Cod_Produto
WHERE
(ESI.Cod_Estoque = [ô]01[ô]) AND
(ESI.Cod_Produto = [ô]00322[ô]) AND
(ESI.Cod_Empresa = [ô]1[ô]) AND
(S.Dta_Entrada Between [ô]2007-07-31 00:00:00[ô] AND [ô]2007-12-31 00:00:00[ô])
--(S.Usuario = [ô]237[ô])
UNION
SELECT
P.Descricao AS Descricao,
P.Cod_Produto AS Codigo_do_Produto,
ESI.Id_Doc AS NF,
--ESI.Cod_Estoque AS Cod_Estoque,
ESI.Cod_Produto AS Cod_Produto,
ESI.Cod_Empresa AS Cod_Empresa,
S.Dta_Entrada AS Data,
--S.Usuario AS Usuario,
-ESI.Qtde AS Qtde,
ESI.V_Unitario AS V_Unitario,
--ESI.Anula_Item AS Item_Anualdo,
-ESI.V_Total AS V_Total,
S.Id_Doc AS Id_Doc
--,EST.Qtde_Estoque AS ESTOQUE_TOTAL
FROM
dbo.Saida_Itens AS ESI INNER JOIN
dbo.Produtos AS P ON ESI.Cod_Empresa = P.Cod_Empresa AND ESI.Cod_Estoque = P.Cod_Estoque AND ESI.Cod_Produto = P.Cod_Produto INNER JOIN
dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc INNER JOIN
[dbo].[Estoque] AS EST ON EST.Cod_Empresa = S.Cod_Empresa AND EST.Cod_Produto = P.Cod_Produto
WHERE
(ESI.Cod_Estoque = [ô]01[ô]) AND
(ESI.Cod_Produto = [ô]00322[ô]) AND
(ESI.Cod_Empresa = [ô]1[ô]) AND
(S.Dta_Entrada Between [ô]2007-07-31 00:00:00[ô] AND[ô]2007-12-31 00:00:00[ô])
--(S.Usuario = [ô]237[ô])
) AS X


)

SELECT
*,

--MOSTRA QUaNTIDADE EM ESTOQUE ATUALIZANDO POR LINHA
--SOMA qtd de entadas no periodo
(SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN
dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
WHERE (ESI.Cod_Estoque = [ô]01[ô]) AND
(ESI.Cod_Produto = [ô]00322[ô]) AND
(ESI.Cod_Empresa = [ô]1[ô])AND
(S.Dta_Entrada Between [ô]2007-07-31 00:00:00[ô] AND [ô]2012-12-31 00:00:00[ô])) AS V_SE,
--Total entradas no estoque
(SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN
dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
WHERE (ESI.Cod_Estoque = [ô]01[ô]) AND
(ESI.Cod_Produto = [ô]00322[ô]) AND
(ESI.Cod_Empresa = [ô]1[ô])AND
(S.Dta_Entrada Between [ô]2007-07-31 00:00:00[ô] AND [ô]2012-12-31 00:00:00[ô]))*(V_Unitario)AS V_SE,
--SOMA SAIDAS no Periodo
(SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN
dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
WHERE (ESI.Cod_Estoque = [ô]01[ô]) AND
(ESI.Cod_Produto = [ô]00322[ô]) AND
(ESI.Cod_Empresa = [ô]1[ô]) AND
(S.Dta_Entrada Between [ô]2007-07-31 00:00:00[ô] AND [ô]2007-12-31 00:00:00[ô])) AS V_SS,
--- Total de SAIDAS no estoque
(SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN
dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
WHERE (ESI.Cod_Estoque = [ô]01[ô]) AND
(ESI.Cod_Produto = [ô]00322[ô]) AND
(ESI.Cod_Empresa = [ô]1[ô]) AND
(S.Dta_Entrada Between [ô]2007-07-31 00:00:00[ô] AND [ô]2007-12-31 00:00:00[ô]))*(V_Unitario) AS V_SSV,
----ENTRADAS ANTES DO PERIODO
((SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN
dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
WHERE (ESI.Cod_Estoque = [ô]01[ô]) AND
(ESI.Cod_Produto = [ô]00322[ô]) AND
(ESI.Cod_Empresa = [ô]1[ô])AND
(S.Dta_Entrada < [ô]2007-07-31 00:00:00[ô]))
- (SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN
dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
WHERE (ESI.Cod_Estoque = [ô]01[ô]) AND
(ESI.Cod_Produto = [ô]00322[ô]) AND
(ESI.Cod_Empresa = [ô]1[ô]) AND
(S.Dta_Entrada < [ô]2007-07-31 00:00:00[ô]))) AS V_DQ,
---- Disponivel no estoque antes do periodo
((SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN
dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
WHERE (ESI.Cod_Estoque = [ô]01[ô]) AND
(ESI.Cod_Produto = [ô]00322[ô]) AND
(ESI.Cod_Empresa = [ô]1[ô])AND
(S.Dta_Entrada < [ô]2007-07-31 00:00:00[ô])) - (SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN
dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
WHERE (ESI.Cod_Estoque = [ô]01[ô]) AND
(ESI.Cod_Produto = [ô]00322[ô]) AND
(ESI.Cod_Empresa = [ô]1[ô]) AND
(S.Dta_Entrada < [ô]2007-07-31 00:00:00[ô])))*(V_Unitario) AS V_DV,
-----
V_Acum = (SELECT SUM(V_Total) FROM CTE WHERE ID <= C.ID)

FROM
CTE AS C


Essa query precisa ter a funcionalidade de mostrar o estoque atualizado a cada linha.
então tenho a query que faz essa função.


if object_id([ô]tempdb..#MovSeq[ô],[ô]U[ô]) is not null drop table #MovSeq;
--
declare @Data_Inicio datetime, @Data_Fim datetime;
set dateformat dmy;
set @Data_Inicio= [ô]1/1/2012[ô];
set @Data_Fim= [ô]31/12/2013[ô];

--
set @Data_Fim = DateAdd(day, +1, @Data_Fim);

-- parte 1 (monta tabela de movimentação, desde valor de data inicial)
with Mov as (
SELECT EI.Cod_Empresa, EI.Cod_Estoque, EI.Cod_Produto, [ô]E[ô] as Tipo_Mov,
E.Dta_Entrada as Data_Mov, EI.id_Doc as NF, EI.Qtde, EI.V_Unitario, EI.V_Total
from Entrada_Itens as EI inner join
Entrada as E on EI.Cod_Empresa=E.Cod_Empresa and EI.id_Doc=E.id_Doc
where E.Dta_Entrada >= @Data_Inicio
and EI.Cod_Empresa=[ô]1[ô] and EI.Cod_Estoque=[ô]01[ô] and EI.Cod_Produto=[ô]00322[ô]
union
SELECT SI.Cod_Empresa, SI.Cod_Estoque, SI.Cod_Produto, [ô]S[ô],
S.Dta_Entrada, SI.id_Doc, -SI.Qtde, SI.V_Unitario, SI.V_Total
from Saida_Itens as SI inner join
Saida as S on SI.Cod_Empresa=S.Cod_Empresa and SI.id_Doc=S.id_Doc
where S.Dta_Entrada >= @Data_Inicio
and SI.Cod_Empresa=[ô]1[ô] and SI.Cod_Estoque=[ô]01[ô] and SI.Cod_Produto=[ô]00322[ô]
union
SELECT Cod_Empresa, Cod_Estoque, Cod_Produto, [ô]A[ô], @Data_Inicio, null, null, null, null
from Estoque
where Cod_Empresa=[ô]1[ô] and Cod_Estoque=[ô]01[ô] and Cod_Produto=[ô]00322[ô]
)
SELECT *,
Seq= row_number() over (partition by Cod_Empresa, Cod_Estoque, Cod_Produto order by Data_Mov desc, Tipo_Mov desc)
into #MovSeq
from Mov;
create unique clustered index IndMovSeq on #MovSeq (Cod_Empresa, Cod_Estoque, Cod_Produto, Seq);

-- parte 2
SELECT --M.Cod_Empresa, M.Cod_Estoque, M.Cod_Produto, P.Descricao,
-- convert(char(10), M.Data_Mov, 103) as Data_Mov, M.NF as [Nota fiscal],
--[Histórico]= case M.Tipo_Mov when [ô]E[ô] then [ô]entrada[ô] when [ô]S[ô] then [ô]saída[ô] when [ô]A[ô] then [ô]estoque anterior[ô] end,
--M.V_Unitario, abs(M.Qtde) as Qtde, M.V_Total,
Estoque= case when M.Seq=1
then E.Qtde_Estoque
else (E.Qtde_Estoque -
(SELECT sum(Mi.Qtde) from #MovSeq as Mi
where Mi.Cod_Empresa=M.Cod_Empresa and Mi.Cod_Estoque=M.Cod_Estoque and Mi.Cod_Produto=M.Cod_Produto
and Mi.Seq < M.Seq)) end
from #MovSeq as M inner join
Estoque as E on M.Cod_Empresa=E.Cod_Empresa and M.Cod_Estoque=E.Cod_Estoque and M.Cod_Produto=E.Cod_Produto inner join
Produtos as P on M.Cod_Empresa=P.Cod_Empresa and M.Cod_Estoque=P.Cod_Estoque and M.Cod_Produto=P.Cod_Produto
where Data_Mov < @Data_Fim
--and M.Tipo_Mov <> [ô]A[ô]
order by M.Cod_Empresa, M.Cod_Estoque, M.Cod_Produto, Seq desc;

drop table #MovSeq;

Preciso agora colocar essa query que exibe o estoque atualizado dentro da que é chamada pelo relatório para que a cada lilnha seja exibido o estoque atualizado.
Pensei em criar uma procedure mas não tenho ideia de como chamá-la na query que é chamada pelo relatório.

Alguém poderia ajudar?
Desde já obrigado.

Paulo Romeiro
PAULOROMEIRO 03/01/2014 12:39:58
#432616
Desculpe o segundo código é esse

if object_id([ô]tempdb..#MovSeq[ô],[ô]U[ô]) is not null drop table #MovSeq;
--
declare @Data_Inicio datetime, @Data_Fim datetime;
set dateformat dmy;
set @Data_Inicio= [ô]1/1/2012[ô];
set @Data_Fim= [ô]31/12/2013[ô];

--
set @Data_Fim = DateAdd(day, +1, @Data_Fim);

-- parte 1 (monta tabela de movimentação, desde valor de data inicial)
with Mov as (
SELECT EI.Cod_Empresa, EI.Cod_Estoque, EI.Cod_Produto, [ô]E[ô] as Tipo_Mov,
E.Dta_Entrada as Data_Mov, EI.id_Doc as NF, EI.Qtde, EI.V_Unitario, EI.V_Total
from Entrada_Itens as EI inner join
Entrada as E on EI.Cod_Empresa=E.Cod_Empresa and EI.id_Doc=E.id_Doc
where E.Dta_Entrada >= @Data_Inicio
and EI.Cod_Empresa=[ô]1[ô] and EI.Cod_Estoque=[ô]01[ô] and EI.Cod_Produto=[ô]00322[ô]
union
SELECT SI.Cod_Empresa, SI.Cod_Estoque, SI.Cod_Produto, [ô]S[ô],
S.Dta_Entrada, SI.id_Doc, -SI.Qtde, SI.V_Unitario, SI.V_Total
from Saida_Itens as SI inner join
Saida as S on SI.Cod_Empresa=S.Cod_Empresa and SI.id_Doc=S.id_Doc
where S.Dta_Entrada >= @Data_Inicio
and SI.Cod_Empresa=[ô]1[ô] and SI.Cod_Estoque=[ô]01[ô] and SI.Cod_Produto=[ô]00322[ô]
union
SELECT Cod_Empresa, Cod_Estoque, Cod_Produto, [ô]A[ô], @Data_Inicio, null, null, null, null
from Estoque
where Cod_Empresa=[ô]1[ô] and Cod_Estoque=[ô]01[ô] and Cod_Produto=[ô]00322[ô]
)
SELECT *,
Seq= row_number() over (partition by Cod_Empresa, Cod_Estoque, Cod_Produto order by Data_Mov desc, Tipo_Mov desc)
into #MovSeq
from Mov;
create unique clustered index IndMovSeq on #MovSeq (Cod_Empresa, Cod_Estoque, Cod_Produto, Seq);

-- parte 2
SELECT --M.Cod_Empresa, M.Cod_Estoque, M.Cod_Produto, P.Descricao,
-- convert(char(10), M.Data_Mov, 103) as Data_Mov, M.NF as [Nota fiscal],
--[Histórico]= case M.Tipo_Mov when [ô]E[ô] then [ô]entrada[ô] when [ô]S[ô] then [ô]saída[ô] when [ô]A[ô] then [ô]estoque anterior[ô] end,
--M.V_Unitario, abs(M.Qtde) as Qtde, M.V_Total,
Estoque= case when M.Seq=1
then E.Qtde_Estoque
else (E.Qtde_Estoque -
(SELECT sum(Mi.Qtde) from #MovSeq as Mi
where Mi.Cod_Empresa=M.Cod_Empresa and Mi.Cod_Estoque=M.Cod_Estoque and Mi.Cod_Produto=M.Cod_Produto
and Mi.Seq < M.Seq)) end
from #MovSeq as M inner join
Estoque as E on M.Cod_Empresa=E.Cod_Empresa and M.Cod_Estoque=E.Cod_Estoque and M.Cod_Produto=E.Cod_Produto inner join
Produtos as P on M.Cod_Empresa=P.Cod_Empresa and M.Cod_Estoque=P.Cod_Estoque and M.Cod_Produto=P.Cod_Produto
where Data_Mov < @Data_Fim
--and M.Tipo_Mov <> [ô]A[ô]
order by M.Cod_Empresa, M.Cod_Estoque, M.Cod_Produto, Seq desc;

drop table #MovSeq;
Tópico encerrado , respostas não são mais permitidas