Usuário com melhor resposta
Soma numérica de campos em SQL

Pergunta
-
Olá, boa tarde!
Estou criando um pequeno projeto em Visual Basic.
Na parte de vendas, é necessário avaliar se, no dia, o produto já foi vendido. Caso tenha sido vendido, basta acrescer sua quantidade em 1. Caso não, basta fazer a inclusão normal com quantidade de 1.
Teria algum comando no SQL que eu possa SOMAR, no caso, somar em algum valor, com outro campo? Vamos dizer, a coluna "Quantidade", que por padrão é valor 1, passaria a ter valor 2 se estivesse tentando vender um produto que já foi vendido aquele dia. Se o mesmo produto for vendido 10 vezes, desejo que tenha apenas uma unica vez o nome do produto, mas com 10 quantidades.
No momento minha inclusão está assim:
For b = 0 To (a - 1) rsPesquisaPrec.Open "SELECT Preco FROM Produtos WHERE Produto = '" & ProdCompra(b) & "'", cnnAcai, adOpenDynamic, adLockOptimistic, adCmdText rsIncluir.Open "INSERT INTO Movimentacao (Produto, Valor, Data, Hora, Quantidade, Mes) VALUES('" & ProdCompra(b) & "', '" & rsPesquisaPrec("Preco") & "', '" & vData & "', '" & vHora & "', 1,'" & vMes & "');", cnnAcai, adOpenDynamic, adLockOptimistic, adCmdText Set rsPesquisaPrec = Nothing Set rsIncluir = Nothing Next
Como podem ver, "quantidade" Tem o valor padrão de 1. Pensei em tratar essa soma fazendo uma variável para a quantidade e acrescendo a cada término do FOR, porém os outros produtos também seriam afetados, então isso seria inviável.
Apenas para esclarecer, o banco de Dados que estou usando é o Access, por ser uma aplicação e simples e local.
Obrigado a quem ajudar e desculpem pelo longo post!
- Editado Felipe Brandão De Oliveira quinta-feira, 19 de janeiro de 2012 14:01 Digitei errado.
Respostas
-
Felipe que bom que resolveu. Fico contente.
Quando a sua outra dúvida para somar uma coluna vc usa seguinte sintaxe:
select SUM(<Coluna_a_ser_somada>) from <tabela>
mas para criação da sua tabela precisa de algumas análise prévias.
Faz o seguinte me adiconar no msn: edugp_sp@hotmail.com ou no twitter.
Abs.
Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp- Editado Eduardo Gomes Pereira sexta-feira, 20 de janeiro de 2012 12:48
- Marcado como Resposta Heloisa Pires sexta-feira, 30 de março de 2012 19:30
-
PROBLEMA RESOLVIDO!
Eduardo, primeiramente obrigado pelas respostas e pela atenção.
O que fiz foi inserir TODOS os produtos dentro da tabela Movimentaçao, e assim dar apenas o update para inserir os dados desejados, e na hora da consulta, selecionar apenas os registro cuja quantidade é maior que 0. Ficou bem mais simples.
For b = 0 To (a - 1)
rsPesquisaPrec.Open "SELECT Preco FROM Produtos WHERE Produto = '" & ProdCompra(b) & "'", cnnAcai, adOpenDynamic, adLockOptimistic, adCmdText
rsIncluir.Open "UPDATE Movimentacao SET Quantidade = Quantidade +1, Data = '" & vData & "', Hora = '" & vHora & "', Valor = '" & rsPesquisaPrec("Preco") & "', Mes = '" & vMes & "' WHERE Produto = '" & ProdCompra(b) & "'", cnnAcai, adOpenDynamic, adLockOptimistic, adCmdText
E mesmo que em única venda tenha dois produtos iguais, sem problema, já que cada fica em uma posição diferente do array, que vai ser percorrido do mesmo jeito. Testes efetuados com sucesso!
Tenho porém, outra dúvida: Preciso fazer uma tabela para contabilizar ganhos diários, semanais e mensais. Estou em dúvida sobre como proceder. Cada registro de venda possui seu valor, então teria alguma função SQL que somasse a coluna de valores inteira? Acredito que exista a SUM, mas não sei como usar. Além disso, teria que ser jogado para outra tabela, ou não? Estou meio em dúvida sobre como vai ser a arquitetura desta coisa toda.
Criei uma tabela "Total" onde meu desejo fosse que seja cada linha com o dia, o mês e o valor total do Dia.
Alguma idéia?
Obrigado.
- Marcado como Resposta Felipe Brandão De Oliveira sexta-feira, 20 de janeiro de 2012 13:06
- Não Marcado como Resposta Felipe Brandão De Oliveira sexta-feira, 20 de janeiro de 2012 15:24
- Marcado como Resposta Heloisa Pires sexta-feira, 30 de março de 2012 19:30
Todas as Respostas
-
Felipe, boa tarde.
Faça o seguinte no seu código:
1 - Verifique se vc já inseriu o produto na tabela de movimentacao com o seguinte comando: select count(*) as QTDE from movimentacao where Produto = '" & ProdCompra & "'"
2 - Este valor retornará apenas uma linha e uma coluna. Vc deve preencher este resulset em um recordset. Após isto vc faz um if simples:
if rstProduto!QTDE >0 then
sql = "update movimentacao set Quantidade = Quantidade +1 where Produto = '" & ProdCompra & "'"
else
Faça o seu insert normalmente
Endif
Abs.
Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp- Marcado como Resposta Felipe Brandão De Oliveira quinta-feira, 19 de janeiro de 2012 23:47
- Não Marcado como Resposta Felipe Brandão De Oliveira quinta-feira, 19 de janeiro de 2012 23:51
- Marcado como Resposta Felipe Brandão De Oliveira sexta-feira, 20 de janeiro de 2012 13:06
- Não Marcado como Resposta Felipe Brandão De Oliveira sexta-feira, 20 de janeiro de 2012 15:24
-
-
Amigo, agora que vi: Quando seleciono dois produtos diferentes na mesma venda, está saindo o nome apenas do primeiro produto, duplicado.
Analisei o código por um momento e não consigo encontrar o erro. Se a venda é de dois produtos diferentes, sai apenas o primeiro produto, com quantidade aumentada.
For b = 0 To (a - 1)
rsExiste.Open "SELECT * FROM Movimentacao WHERE Produto = '" & ProdCompra (b) & "' AND Data = '" & vData & "'", cnnAcai, adOpenDynamic, adLockOptimistic, adCmdText
If rsExiste.RecordCount = 0 Then
rsPesquisaPrec.Open "SELECT Preco FROM Produtos WHERE Produto = '" & ProdCompra(b) & "'", cnnAcai, adOpenDynamic, adLockOptimistic, adCmdText
rsIncluir.Open "INSERT INTO Movimentacao (Produto, Valor, Data, Hora, Quantidade, Mes) VALUES('" & ProdCompra(b) & "', '" & rsPesquisaPrec("Preco") & "', '" & vData & "', '" & vHora & "', 1,'" & vMes & "');", cnnAcai, adOpenDynamic, adLockOptimistic, adCmdText
Else
rsPesquisaPrec.Open "SELECT Preco FROM Produtos WHERE Produto = '" & ProdCompra(b) & "'", cnnAcai, adOpenDynamic, adLockOptimistic, adCmdText
rsIncluir.Open "UPDATE Movimentacao SET Quantidade = Quantidade +1 WHERE Produto = '" & ProdCompra(b) & "'", cnnAcai, adOpenDynamic, adLockOptimistic, adCmdText
End If
Set rsPesquisaPrec = Nothing
Set rsIncluir = Nothing
Set rsExiste = Nothing
Next
Já fiz alguns testes, e o array está normal, e o loop também está percorrendo todo o array, então parece ser mesmo alguma coisa no meio deste código SQL.
Faz alguma idéia do que possa estar causando isso? Apenas o primeiro produto que selecionei é adicionado, e apenas a quantidade dos outros produtos é adicionada à ele, mesmo sendo nomes diferentes.
- Editado Felipe Brandão De Oliveira sexta-feira, 20 de janeiro de 2012 00:25
-
Felipe, bom dia,
Se vc possui mais de uma ocorrência de produtos dentro da venda vc precisa então trocar o for pelo while. Vc deve abrir um recorset com as ocorrências dos produtos e fazer um do while realizando as operações necessárias dentro do loop.
Abs.
Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp -
PROBLEMA RESOLVIDO!
Eduardo, primeiramente obrigado pelas respostas e pela atenção.
O que fiz foi inserir TODOS os produtos dentro da tabela Movimentaçao, e assim dar apenas o update para inserir os dados desejados, e na hora da consulta, selecionar apenas os registro cuja quantidade é maior que 0. Ficou bem mais simples.
For b = 0 To (a - 1)
rsPesquisaPrec.Open "SELECT Preco FROM Produtos WHERE Produto = '" & ProdCompra(b) & "'", cnnAcai, adOpenDynamic, adLockOptimistic, adCmdText
rsIncluir.Open "UPDATE Movimentacao SET Quantidade = Quantidade +1, Data = '" & vData & "', Hora = '" & vHora & "', Valor = '" & rsPesquisaPrec("Preco") & "', Mes = '" & vMes & "' WHERE Produto = '" & ProdCompra(b) & "'", cnnAcai, adOpenDynamic, adLockOptimistic, adCmdText
E mesmo que em única venda tenha dois produtos iguais, sem problema, já que cada fica em uma posição diferente do array, que vai ser percorrido do mesmo jeito. Testes efetuados com sucesso!
Tenho porém, outra dúvida: Preciso fazer uma tabela para contabilizar ganhos diários, semanais e mensais. Estou em dúvida sobre como proceder. Cada registro de venda possui seu valor, então teria alguma função SQL que somasse a coluna de valores inteira? Acredito que exista a SUM, mas não sei como usar. Além disso, teria que ser jogado para outra tabela, ou não? Estou meio em dúvida sobre como vai ser a arquitetura desta coisa toda.
Criei uma tabela "Total" onde meu desejo fosse que seja cada linha com o dia, o mês e o valor total do Dia.
Alguma idéia?
Obrigado.
- Marcado como Resposta Felipe Brandão De Oliveira sexta-feira, 20 de janeiro de 2012 13:06
- Não Marcado como Resposta Felipe Brandão De Oliveira sexta-feira, 20 de janeiro de 2012 15:24
- Marcado como Resposta Heloisa Pires sexta-feira, 30 de março de 2012 19:30
-
Felipe que bom que resolveu. Fico contente.
Quando a sua outra dúvida para somar uma coluna vc usa seguinte sintaxe:
select SUM(<Coluna_a_ser_somada>) from <tabela>
mas para criação da sua tabela precisa de algumas análise prévias.
Faz o seguinte me adiconar no msn: edugp_sp@hotmail.com ou no twitter.
Abs.
Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp- Editado Eduardo Gomes Pereira sexta-feira, 20 de janeiro de 2012 12:48
- Marcado como Resposta Heloisa Pires sexta-feira, 30 de março de 2012 19:30
-
É cara, achei que aquele código ia resolver meu problema! E resolveu, exceto pelo seguinte: Ele vale apenas para as operações diárias. No dia seguinte, todas as compras que fossem feitas com a nova data iriam substituir totalmente as entradas que eu possuia, ja que está utilizando apenas o comando Update. Desta forma, eu não conseguiria fazer consultas por dia e por mês...
Teria uma solução para isso?