none
Relatório de Estoques RRS feed

  • 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.

    quinta-feira, 19 de outubro de 2017 00:12

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'))
    ...


    quinta-feira, 19 de outubro de 2017 01:49
  • Deleted
    quinta-feira, 19 de outubro de 2017 22:20
  • Obrigado por ajudar.
    sexta-feira, 20 de outubro de 2017 01:00
  • 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.


    sexta-feira, 20 de outubro de 2017 01:16
  • 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'
    union 
    select * from rownumber1 where rownumber=1 and SALDOMOV <> '0.0000'
    order by CODLOC<o:p></o:p>

    <u1:p></u1:p>
    sexta-feira, 20 de outubro de 2017 01:17
  • Deleted
    • Marcado como Resposta Gelain sábado, 21 de outubro de 2017 17:25
    sábado, 21 de outubro de 2017 12:17
  • Olá José, deu certo! Vou incluir outros detalhes na consulta e ficará perfeita para atender a nossa necessidade.

    Muito obrigado!

    sábado, 21 de outubro de 2017 17:27