Usuário com melhor resposta
Relatório de Estoques

Pergunta
-
Boa noite,
Preciso criar um relatório com o saldo físico e financeiro do estoque por local e intervalo de tempo. Exemplo: 01/10/2017 a 05/10/2017
Fiz a SQL, mas retorna apenas os itens que tiveram movimento no período. Por exemplo, um item que teve seu último movimento em 25/09/2017 não aparecerá no período de 01/10/2017 a 05/10/2017:
with rownumber as(
select
ROW_NUMBER() over(partition by a.idprd, a.codloc order by a.sequencial desc)as rownumber
,A.SEQUENCIAL
,A.DATAMOVIMENTO
,A.IDPRD
,A.CODLOC
,A.SALDOMOV
,A.TOTALMOV
,A.CUSTOMEDMOV
,B.NOMEFANTASIA
,case when C.CODTB3FAT='001' then 'Medicamentos'
when C.CODTB3FAT='002' then 'Materiais'
else C.CODTB3FAT end TIPO
from TRELSLD as A
inner join tproduto AS B
on A.idprd=B.idprd
inner join TPRODUTODEF AS C
on A.IDPRD=C.IDPRD AND A.CODCOLIGADA=C.CODCOLIGADA
WHERE A.CODFILIAL=2 and a.IDPRD='38' and A.DATAMOVIMENTO between '2017-10-01 00:00:00.000' and '2017-10-05 00:00:00.000' )select * from rownumber where rownumber=1 and SALDOMOV <> '0.0000'
order by IDPRD
Gostaria de ajuda. Obrigado.
Respostas
Todas as Respostas
-
Boa noite Gelain, o sql em si ficou meio confuso de entender, talvez se deixasse comentários para melhor entender sobre as colunas e tabelas, talvez ajudaria melhorar na resposta. Mas com base no que entendi, talvez se vc fizer a consulta em cima da tabela de produtos e realizar um left join com a tabela TRELSLD e colocando a condição de data dentro desse próprio left join, ao invés de ser no WHERE no final do sql, isso ao meu entender traria todos os produtos independente da data de última movimentação do produto.
...
from tproduto as B
left join TRELSLD AS A on (A.idprd=B.idprd AND (A.DATAMOVIMENTO between '2017-10-01 00:00:00.000' and '2017-10-05 00:00:00.000'))
...
-
-
-
Boa noite, obrigado por ajudar.
Na tabela TPRODUTO existe a coluna CODCOLIGADA? A dúvida é para saber se é possível relacionar a tabela TPRODUTODEF diretamente com a tabela TPRODUTO.
Estas duas tabelas servem apenas para trazer o nome fantasia do produto e o tipo.
Na coluna DATAMOVIMENTO o horário está sempre zerado?
Está sempre zerado.
Caso não tenha ocorrido movimentação no período pra determinado produto, o que deve constar nas colunas CODLOC, DATAMOVIMENTO, SALDOMOV, TOTALMOV e CUSTOMEDMOV?
Deve constar o saldo anterior do produto. Pois a posição dos estoques é composta pelos itens com e sem movimento no período, desde que tenham quantidade e valor.
Evolui a query para a seguinte situação:
Fiz uma segunda CTE com as informações faltantes e apliquei UNION. O que fazer para que caso o produto da CTE 2 seja igual a algum da CTE 1 não apareça, considerando a coluna codloc?<u1:p></u1:p>
with rownumber as( select ROW_NUMBER() over(partition by a.idprd, a.codloc order by a.sequencial desc)as rownumber ,A.SEQUENCIAL ,A.DATAMOVIMENTO ,A.IDPRD ,A.CODLOC ,A.SALDOMOV ,A.TOTALMOV ,A.CUSTOMEDMOV ,B.NOMEFANTASIA ,case when C.CODTB3FAT='001' then 'Medicamentos' when C.CODTB3FAT='002' then 'Materiais' else C.CODTB3FAT end Tipo from TRELSLD as A inner join tproduto AS B on A.idprd=B.idprd inner join TPRODUTODEF AS C on A.IDPRD=C.IDPRD AND A.CODCOLIGADA=C.CODCOLIGADA WHERE A.CODFILIAL=2 and a.IDPRD='38'and A.DATAMOVIMENTO ='2017-06-05 00:00:00.000' ), rownumber1 as( select ROW_NUMBER() over(partition by a.idprd, a.codloc order by a.sequencial desc)as rownumber ,A.SEQUENCIAL ,A.DATAMOVIMENTO ,A.IDPRD ,A.CODLOC ,A.SALDOMOV ,A.TOTALMOV ,A.CUSTOMEDMOV ,B.NOMEFANTASIA ,case when C.CODTB3FAT='001' then 'Medicamentos' when C.CODTB3FAT='002' then 'Materiais' else C.CODTB3FAT end Tipo from TRELSLD as A inner join tproduto AS B on A.idprd=B.idprd inner join TPRODUTODEF AS C on A.IDPRD=C.IDPRD AND A.CODCOLIGADA=C.CODCOLIGADA WHERE A.CODFILIAL=2 and a.IDPRD='38'and A.DATAMOVIMENTO <'2017-06-05 00:00:00.000' )<u1:p></u1:p>
select * from rownumber where rownumber=1 and saldomov <> '0.0000'union select * from rownumber1 where rownumber=1 and SALDOMOV <> '0.0000' order by CODLOC
<u1:p></u1:p>Exemplo:
Data da posição do estoque: 2017-06-05
Produto A
2017-06-04
20
200,00
Produto A
2017-06-05
10
100,00
A CTE 2 gera os produtos com saldo anterior. Ocorre que o produto A teve movimento no dia 2017-06-05 também.
Portanto, se o produto A estiver contido no dia 2017-06-05, o do dia 2017-06-04 não deve aparecer.
Obrigado.
-
with rownumber as(
select
ROW_NUMBER() over(partition by a.idprd, a.codloc order by a.sequencial desc)as rownumber
,A.SEQUENCIAL
,A.DATAMOVIMENTO
,A.IDPRD
,A.CODLOC
,A.SALDOMOV
,A.TOTALMOV
,A.CUSTOMEDMOV
,B.NOMEFANTASIA
,case when C.CODTB3FAT='001' then 'Medicamentos'
when C.CODTB3FAT='002' then 'Materiais'
else C.CODTB3FAT end Tipo
from TRELSLD as A
inner join tproduto AS B
on A.idprd=B.idprd
inner join TPRODUTODEF AS C
on A.IDPRD=C.IDPRD AND A.CODCOLIGADA=C.CODCOLIGADA
WHERE A.CODFILIAL=2 and a.IDPRD='38'and A.DATAMOVIMENTO ='2017-06-05 00:00:00.000' ),
rownumber1 as(
select
ROW_NUMBER() over(partition by a.idprd, a.codloc order by a.sequencial desc)as rownumber
,A.SEQUENCIAL
,A.DATAMOVIMENTO
,A.IDPRD
,A.CODLOC
,A.SALDOMOV
,A.TOTALMOV
,A.CUSTOMEDMOV
,B.NOMEFANTASIA
,case when C.CODTB3FAT='001' then 'Medicamentos'
when C.CODTB3FAT='002' then 'Materiais'
else C.CODTB3FAT end Tipo
from TRELSLD as A
inner join tproduto AS B
on A.idprd=B.idprd
inner join TPRODUTODEF AS C
on A.IDPRD=C.IDPRD AND A.CODCOLIGADA=C.CODCOLIGADA
WHERE A.CODFILIAL=2 and a.IDPRD='38'and A.DATAMOVIMENTO <'2017-06-05 00:00:00.000' )<u1:p></u1:p><o:p></o:p>select * from rownumber where rownumber=1 and saldomov <> '0.0000'
<u1:p></u1:p>
union
select * from rownumber1 where rownumber=1 and SALDOMOV <> '0.0000'
order by CODLOC<o:p></o:p> -
-