 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
Helytonoliveira Novato

Registrado: Segunda-Feira, 31 de Agosto de 2015 Mensagens: 5
|
Enviada: Sex Jan 17, 2020 10:18 am Assunto: Consulta com estoque atual e quantidades vendidas |
|
|
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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sex Jan 17, 2020 10:51 am Assunto: |
|
|
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 |
|
 |
Helytonoliveira Novato

Registrado: Segunda-Feira, 31 de Agosto de 2015 Mensagens: 5
|
Enviada: Sex Jan 17, 2020 12:36 pm Assunto: |
|
|
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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sex Jan 17, 2020 2:22 pm Assunto: |
|
|
Acho que você teria que postar o código completo de montagem da query no componente para análise. |
|
Voltar ao Topo |
|
 |
Helytonoliveira Novato

Registrado: Segunda-Feira, 31 de Agosto de 2015 Mensagens: 5
|
Enviada: Sex Jan 17, 2020 11:40 pm Assunto: |
|
|
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 |
|
 |
Helytonoliveira Novato

Registrado: Segunda-Feira, 31 de Agosto de 2015 Mensagens: 5
|
Enviada: Dom Jan 19, 2020 12:32 am Assunto: |
|
|
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 |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|