none
Soma numérica de campos em SQL RRS feed

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

     

    quinta-feira, 19 de janeiro de 2012 13:54

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
    sexta-feira, 20 de janeiro de 2012 12:48
  • 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.

     

    sexta-feira, 20 de janeiro de 2012 12:43

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
    quinta-feira, 19 de janeiro de 2012 14:51
  • sql = "update movimentacao set Quantidade = Quantidade +1 where Produto = '" & ProdCompra & "'"

    Obrigado, camarada! Era justamente esta parte do código que eu queria. Estava em dúvida sobre como utilizar o comando UPDATE.

    Grande abraço!

    quinta-feira, 19 de janeiro de 2012 23:48
  • 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.

     




    sexta-feira, 20 de janeiro de 2012 00:05
  • 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
    sexta-feira, 20 de janeiro de 2012 11:03
  • 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.

     

    sexta-feira, 20 de janeiro de 2012 12:43
  • 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
    sexta-feira, 20 de janeiro de 2012 12:48
  • É 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?

    sexta-feira, 20 de janeiro de 2012 15:57