ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Consulta com estoque atual e quantidades vendidas

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
Helytonoliveira
Novato
Novato


Registrado: Segunda-Feira, 31 de Agosto de 2015
Mensagens: 5

MensagemEnviada: Sex Jan 17, 2020 10:18 am    Assunto: Consulta com estoque atual e quantidades vendidas Responder com Citação

Ola pessoal, tudo bom ?
Bom, eu estou tentando fazer uma consulta com duas tabelas (produtos e movimentação de compras e vendas (MOVIM) ).
Na tabela de produtos tenho os campos que eu quero que saia na consulta:
codigo do produto (codigo)
nome do produto (nome)
localização do produto (prateleira)
preço de venda (venda)

Na tabela de movimentação de compra e vendas(as compras e as vendas são salvas na mesma tabela) MOVIM :
CAMPOS:
es (Indica se é entrada ou saida)
quanto (quantidade de entrada ou saida)
unitario (valor unitario da compra ou da venda)

Gostaria que a ficasse assim :
codigo,nome,prateleira, preço de venda, estoque atual, quantidade vendida no periodo, numero de vezes que cada produto foi vendido e total (preço de venda * quantidade vendida)

Detalhe:
pra calcular o estoque atual não pode ser filtrado por data, claro. Tem que ser toda a movimentação de compra e venda do produto. Mas a quantidade vendida e o numero de vezes que foi vendida tem que ser pelo periodo(data inicial e data final). E tbm não pode sair na consulta produtos que não foram vendidos nesse periodo.

obs: existem dois datetimepicker no form com a data inicial e final.
Uso Firebird 2.5

Como eu faço essa consulta ??? me ajudem, por favor
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Jan 17, 2020 10:51 am    Assunto: Responder com Citação

Bom dia,

Experimente fazer uns testes mais ou menos dessa forma para ver se é obtido o resultado esperado:

Código:
select
    p.codigo,
    p.nome,
    p.prateleira,
    p.venda,
    sum(m.quanto * case when m.es = 'E' then 1 else -1 end) as EstoqueAtual,
    sum(case when m.es = 'S' and m.data between :DataIni and :DataFim then m.quanto end) as QuantidadePeriodo,
    count(case when m.es = 'S' and m.data between :DataIni and :DataFim then 1 end) as NumeroVezesPeriodo,
    sum(case when m.es = 'S' and m.data between :DataIni and :DataFim then m.quanto * m.unitario end) as TotalPeriodo
from Produtos as p
inner join Movimentacao as m
    on m.codigo = p.codigo
group by
    p.codigo,
    p.nome,
    p.prateleira,
    p.venda
having
    count(case when m.es = 'S' and m.data between :DataIni and :DataFim then 1 end) > 0


obs: o campo m.codigo utilizado no Join seria o campo que contem o código do produto na tabela de movimentação

Espero que ajude


Editado pela última vez por imex em Dom Out 01, 2023 5:40 pm, num total de 2 vezes
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Helytonoliveira
Novato
Novato


Registrado: Segunda-Feira, 31 de Agosto de 2015
Mensagens: 5

MensagemEnviada: Sex Jan 17, 2020 12:36 pm    Assunto: Responder com Citação

Amigo muito obrigado, acredito que vai funcionar sim, mas por enquanto esta apresentando esse erro.

Erro de sintaxe (operador faltando) na expressão de consulta
sum(m.quanto * case when m.es ='+quotedstr('E')+' then 1 else -1 end)
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Jan 17, 2020 2:22 pm    Assunto: Responder com Citação

Acho que você teria que postar o código completo de montagem da query no componente para análise.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Helytonoliveira
Novato
Novato


Registrado: Segunda-Feira, 31 de Agosto de 2015
Mensagens: 5

MensagemEnviada: Sex Jan 17, 2020 11:40 pm    Assunto: Responder com Citação

Olha ai amigo, o código esta assim.
mas ta dando esse erro que eu postei acima.

Código:

  with FDQvendas do
             begin
              Close;
              SQL.Clear;

              SQL.add('select p.refer,p.locacao,p.descri,');
              SQL.add('sum(case when m.es ='+quotedstr('E')+' then (m.quanto*1) else (m.quanto*-1) end) as quant,');
              SQL.add('sum(case when m.es = '+quotedstr('S')+' and m.data between :DataIni and :DataFim then m.quanto end) as estante,');
              SQL.add('count(case when m.es = '+quotedstr('S')+' and m.data between :DataIni and :DataFim then 1 end) as salante,');
              SQL.add('sum(case when m.es = '+quotedstr('S')+' and m.data between :DataIni and :DataFim then m.quanto * m.unitario end) as venda2');
              SQL.add('from Produto as p');
              SQL.add('inner join Movim as m on m.codigo=p.codigo');
              SQL.add('group by p.refer,p.locacao,p.descri');
              SQL.add('havin count(case when m.es = '+quotedstr('S')+' and m.data between :DataIni and :DataFim then 1 end) > 0');

              ParamByName('dataini').Asdatetime := datetimepicker1.DateTime;
              ParamByName('datafim').Asdatetime:= datetimepicker2.DateTime;

                if not(Prepared) then Prepare;
                   Open;
    end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Helytonoliveira
Novato
Novato


Registrado: Segunda-Feira, 31 de Agosto de 2015
Mensagens: 5

MensagemEnviada: Dom Jan 19, 2020 12:32 am    Assunto: Responder com Citação

Resolvi.
Os erros ocorriam por causa do CASE, troquei pelo IIF e o COUNT troquei pelo SUM.
Deu certinho. Funcionou.

Obgdo pelas dicas.
vlw
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB