Duvida Sobre a Linguagem Sql Função Sum()

Delphi

27/12/2003

Amigos Esta Dúvida Já Está a Alguns Dias No Forum Mas Acho Que Não Estou Conseguindo Me Espressar Corretamente.
No Evento OnClick De Um Botão Realizo Uma Consulta Onde Limito a Saída Da Consulta Pela Data e Pelo Codigo Do Funcionário.Atê Este Ponto,
Usando Um Componente Query e Linguagem Sql Consigo Obter a Saida
Desejada. Mas O Problema e Que Preciso Somar o Valor De Um Campo Desta Pesquisa.Usei Para Isto a Instrução Abaixo.

Evento Onclick De Um Botao

Query1.disablecontrols;
Query1.Close;
Query1.SQL.Clear;

//Instrucoes Que Definem a Pesquisa.Por Data e Pelo Codigo Do
Funcionário Etc....Não Aparece Por Não Estar No Contexto Da Dúvida

Query1.Prepare;
Query1.open;

//Abaixo o Código Que Gostaria de Substituir Pela Propiedade Sum()
Do Sql Se For Possível.

Soma:=0;
Query1.First;
while not(Query1.Eof) do
begin
Soma:=Soma + Query1Liquido.Value;
Query1.Next;
end;
edit1.text:=formatfloat(´R$ : ´+´#,0.00´,Soma);
// O Código Acima Soma Individualmente o Valor De Query1Liquido e
Armazena Numa Variável Temporária Soma.O Código Funciona Mas
Acho Ele Meio Ultrapassado, Já Que Irei Percorrer Todos Os Registros
Pela Instrução While Not(Query1).eof Do.

//Finalizo
Query1.EnableControls;
// Etc....
end.

Aparentemente o Que Quero é Muito Simples. Tenho Pouquíssima Prática Na Linguagem Sql. O Pouco Que Sei é Tipo Receita De Bolo(Sigo Alguns Exemplos). Gostaria Muito De Receber Ajuda. Se Alguem Conhecer Um
Livro Que Contenha Delphi e a Linguagem Sql e Quiser Sugerir Sinta-se a
Vontade... Por Fim Agradeço Aos Meus Colegas Toda e Qualquer Tipo De Ajuda.


Marco Salles

Marco Salles

Curtidas 0

Respostas

Pr.mas

Pr.mas

27/12/2003

Olá Marcos Sales,

Vou te ensinar como usar a função SUM.

Primeiro apague tudo o que você fez mantendo apenas a query.

Digite no SQL da query o seguinte:

Select SUM(VALOR) ´VALOR é o nome do campo a ser somado´
from TABELA ´TABELA é o nome da tabela´
where CAMPO > 0 ´CAMPO é o campo para condição >0 é a condição´
order by CAMPO ´CAMPO é o campo para ordenação´
Asc ´Ordem Ascendente e Desc ordena Descendente´


Depois de colocada a instrução sql abrir a tabela

Dê um duplo click sobre a tabela e click com o botão esquerdo do mouse
e escolha ´Add All Fields´

Ira aparecer o campo chamado SUM que é o campo que retornará a soma do campo que colocou na instrução sql.

A partir daí é só você colocar um comando para abir a query pegar o valor do campo SUM e fechar a query. Exemplo:

begin
Query1.Open;
Variavel:=DM.Query1.FieldByName(´SUM´).AsCurrency;
Query1.Close;
end;

entendeu?

Não precisa de While, for ou repeat until, você poderá fazer tudo dentro da query.

Espero ter ajudado

Abraços

pr.mas


GOSTEI 0
Carlosrm

Carlosrm

27/12/2003

marco, tente o seguinte:

elimine

Soma:=0;
Query1.First;
while not(Query1.Eof) do
begin
Soma:=Soma + Query1Liquido.Value;
Query1.Next;
end;

e acrescente no Select da query1 mais um campo a ser exibido (retornado), modificado por SUM:
Select campo1, campo2,... SUM(Liquido) as Soma... from...

Será criado um campo (coluna) no result da sua query1, chamado de Soma, que conterá a soma de todos os conteúdos da campo liquido, conforme a sua query1 tenha especificado (where, group by...).
Se der erro de sintaxe, além de revisar letra por letra, sinal por sinal, experimente retirar a palavrinha ´as´ .

Depois de executada a query1, apenas faça:

edit1.text := format.....query1Soma.AsFloat...

Na página principal deste fórum, nas seções Guia de Referência e Apostilas, você vai encontrar alguma coisa sobre Sql. . Os comandos de Sql presentes no Delphi são apenas uma parte do que existe. Há uma quantidade imensa de sites que disponibilizam apostilas, tutoriais e exemplos sobre Sql gratuitos. Simplificando, há vários exemplos de programas prontos neste próprio fórum. Qualquer exemplo que falar em Cliente/Servidor, Interbase, Firebird estará usando algum tipo de SQL. Os comandos mais comuns do Sql são iguais para todos. Leia e pratique, leia e pratique, leia e pratique... carlosrm


GOSTEI 0
Marco Salles

Marco Salles

27/12/2003

Vou Tentar Depois. Agora Tenho Um Compromisso.Amanhã Tenho a Resposta. Mas Mesmo Assim Obrigado Pela Contribuição.

P:S Eu Prefiro Um Livro Em Que Eu Possa Ler e Acompanhar Passo a
Passo Cada Exemplo.

Boa Noite a Todos.....


GOSTEI 0
Marco Salles

Marco Salles

27/12/2003

Definivamente Não Consigo.Tem Dias Que Estoui Tentando. Será Que Vou Ter Que Ficar Com Meu Código ´While Not Query1.Eof do´ Ultrapassado. Vou Tentar Ser Mais Detalhista.Minha Tabela Tem Os Seguintes Campos: Codigo_Venda,Codigo_Vendador,Total,Desconto,
Data.No Evento On Click De Um Botao Escrevi o Seguintes Códigos:

NO EVENTO ONCLICK DE UM BOTÃO
Query1.disablecontrols;
Query1.Close;
Query1.SQL.Clear;
Query1.Sql.Add(´Select Codigo_Venda,Codigo_Cliente,´+
´Sum(Total) as Soma ,Desconto,Data From TabVen´);
Query1.Sql.Add(´Where Data>=:Datainicial´);
Query1.ParamByName(´datainicial´).asdate:=strtodate(Maskedit1.text);
Query1.Sql.Add(´And Data<=:DataFinal´);
Query1.ParamByName(´DataFinal´).asdate:=strtodate(maskedit2.text);
//Tenho Dúvida Na Linha Abaixo
Query1.Sql.Add(´Group By Codigo_Venda,Codigo_Cliente,Desconto,Data´)
Query1.Prepare;
Query1.open;
edit1.text:=formatfloat(´R$ : ´+´#,0.00´,Soma);
Query1.EnableControls;

Tudo Isto é Feito Na Execução Do Projeto.E Aparece Um Erro Dizendo Que
O Campo Total Não Existe. :?: :?:
Ora Amigos Eu So Quero é Efetuar Uma Pesquisa Onde o Fator Data que Limita a Quantidade De Registro. E Finalmente Somar o Total De Vendas
Usando A Função SUM() Desde Período.
Diga-se De Passagem Que Minha Tabela ´TabVen´ Foi Desenvolvida Usando o ´Piradox´<Como Dizem Alguns>.
Peço Ajuda e Agradeço a Todos....


GOSTEI 0
Edilcimar

Edilcimar

27/12/2003

o programa está reclamando sobre um campo chamado total que não existe, verifique o código ou se utilizou este código anteriormente talvez o mesmo não tenha sido apagado, mas de qualquer forma procure por algo chamado TOTAL pois é disto que o programa está reclamando, eu já tive problemas com alguns campos e as vezes eu os apagava fisicamente porém lógicamente o programa continuava com o mesmo


GOSTEI 0
Marco Salles

Marco Salles

27/12/2003

Ele Existe. Tanto é Que Se Eu Tirar da instrução Select a Propiedade Sum()
Query1.Sql.Add(´Select Codigo_Venda,Codigo_Cliente,´+
´Sum(Total) as Soma ,Desconto,Data From TabVen´);
e Troca-=la Por
Query1.Sql.Add(´Select *From TabVen´);
Ps:É Claro Que Agora a Instrução Abaixo Não Faz Mais Sentido
Query1.Sql.Add(´Group By Codigo_Venda,Codigo_Cliente,Desconto,Data´)
e Tenho Que Exclui-la T.B

Feito Estas Duas Modifiacções o Evento Funciona.Porém Não Soma o Valor Do Campo Total. E Eu Volto a Estaca Zero. Continuo a Pedir Ajuda.
Quero Aprender a Usar a Função Sum().


GOSTEI 0
Edilcimar

Edilcimar

27/12/2003

se o campo existe verifique as aspas


GOSTEI 0
Marco Salles

Marco Salles

27/12/2003

se o campo existe verifique as aspas


Escrevi Como o Sugerido.
Query1.Sql.Add(´Select Codigo_Venda,Codigo_Vendedor,Total,Data
From TabVen´);
e Funciona...Como e Qual Ponto Devo Usar Corretamente a Função Sum() Para Calcular O Do Camp Total...


GOSTEI 0
Marco Salles

Marco Salles

27/12/2003

Sobe


GOSTEI 0
Marco Salles

Marco Salles

27/12/2003

Sobe


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

27/12/2003

Colega,

Manda a tabela compactada para o meu e-mail: aroldo_zanela@hotmail.com (populada) e se possível o formulário que você está trabalhando.


GOSTEI 0
Demian Soares

Demian Soares

27/12/2003

seguinte marco... vc esta tentando soma o valor de um campo da tabela de vendas... pelo que entendi..eu pergunto uma coisa o campo que vc esta querendo somar se chama mesmo TOTAL? la na tabela? pq se nao for total, mas um outro nome seria por isso a msg de total nao existe. primeiro... se vc fizer um teste basico com o comando sum nesta mesma query q vc fez coloque somente select sum(campo) as ´nomecriadoparaessasoma´ from tabela e veja o resultado...
execute a query e pegue o resultado valor:=querynomecriadoparaessasoma.value e vc tera a soma que quiser.. depois desse passo e vc vendo como funciona, vc implanta as outras condicoes where group ou o que quiser
quanto a apostila vc encontra ate mesmo algumas aqui no site de clube... mas eu indicaria um livro excelente.. aprendendo sql em 24 horas... taz detalhado todos os comando sql...com exemplos praticos.


GOSTEI 0
Marco Salles

Marco Salles

27/12/2003

Acho Que Devo Se Um Único Mortal Que Não Consegui Usar a Propriedade Sum().O Programa Regrama Que o Cmpo Total Não Existe.
Então Resolvir Escrever De Forma Diferente.
No Componete Query Na Sua Propriedade Sql... Escrevi:

Select
Codigo_Venda,Codigo_Cliente,Total ,Sum(Total) as Soma ,Desconto,Data
From
TabVen
Order By
Codigo_Venda,Codigo_Cliente,Total , Soma ,Desconto,Data

Pronto . Esta Criado o Campo Soma.

Dois Click No Componente Query e Adiciono Este Campo...

Volto No Meu Botão Manipulador De Evento.E Escrevo o Codigo Tla Como Escrevi No Sql Do Query

Evento OnClick Do Botão

begin

Query1.Close;
Query1.Clear;
Query1.Sql.Add(´Codigo_Venda,Codigo_Cliente,Total ,Sum(Total) as
Soma ,Desconto,Data From TabVen´);
//Faço Minha Seleção Como Escrevi No Inicíio Do Tópico.
Query1.Sql.Add(Group By ´Codigo_Venda,Codigo_Cliente,Total ,
Soma ,Desconto,Data);
Query1.Prepare;
Query1.Open;
Edit1.Text:=FormatCurr(Query1.FieldByName(´Soma´).AsCurrency);

End;//FIM

Gostaria Que o Conteudo Do Edit Fosse a Soma Do Valor Do Campo Total De Todos Registro Selecionados.MAS PARA A MINHA SURPRESA,
O VALOR APRESENTADO NO EDIT1 É SIMPLESMENTE O VALOR DO PRIMEIRO REGISTRO E NÃO A SOMA.

Exemplo Suponha Que Selecionamos Quatro Registro:
ps:Conteúdo Do DbGrid Apos a Pesquisa No Query1...
COD_VENDA COD_VENDEDOR TOTAL DESCONTO DATA
001 001 100,00 10,00 28/12/2003
002 001 200,00 10,00 28/12/2003
002 001 300,00 10,00 28/12/2003
002 001 100,00 10,00 28/12/2003

Edit1.Text= 100,00 // Obs:Valor Esperado Seria De 700,00

E Agora Jose :?: :?:


GOSTEI 0
Marco Salles

Marco Salles

27/12/2003

sobe


GOSTEI 0
Marco Salles

Marco Salles

27/12/2003

Sobe


GOSTEI 0
Demian Soares

Demian Soares

27/12/2003

crie essa query q vc ja tem, mas tire o campo sum() nao crie ele ai... crie outra query somente com o sum() e o campo que quiser somar, e as condicoes where nao coloque os outros campos na clausula e ira funcionar

ex.. select sum(total) soma from tabven where......
pronto feito ....


GOSTEI 0
Xmagno

Xmagno

27/12/2003

Marco, nao tem misterio, na aplicacao aparece um erro dizendo que o campo total nao existe porque ele realmente nao existe. quando vc escreveu sua query, vc renomeou o campo total para soma.
Veja só:
Query1.Sql.Add(´Select Select Codigo_Venda,Codigo_Cliente,´+
´Sum(Total) as Soma ,Desconto,Data From TabVen´);

No codigo: ´sum(total) as soma´ vc ta renomeando a columa ´total´ pra ´soma´. Pro delphi, nao existe mais a coluna ´total´ e sim ´soma´

é so trocar no seu projeto a referencia a ´total´ pra ´soma´ que vai ficar tudo certo.
[]´s
xMagno


GOSTEI 0
Marco Salles

Marco Salles

27/12/2003

[quote:362aab1342=´Demian J. Soares´]crie essa query q vc ja tem, mas tire o campo sum() nao crie ele ai... crie outra query somente com o sum() e o campo que quiser somar, e as condicoes where nao coloque os outros campos na clausula e ira funcionar

ex.. select sum(total) soma from tabven where......
pronto feito ....[/quote:362aab1342]

Estava Fazendo Exatamente Isto, Antes De Ler Sua Opinião. Já Sei Que Funciona. Estou Inclinado a Acreditar Que Um Query Com a Instrução Sum() Não Opera Junto Com o Componente DbGrid. Só Acho Que Parece Uma Idéia Um Pouco Sem Creatividade, a Não Ser Que Na Opinião Dos
Mais Entendidos Em Delphi, Me Confirme Que Realmente Quando Se Quer Mostrar Outros Campos Usando Um Componente DbGrid , E Quer Somar Um Campo , Devemos Então Criar Um Qurery Só Para Esta Soma. É Isso Mesmo Pessoal :?:

P:S Quando Eu Falo Em Mais Entendido , Não Estou Excluindo ´Demian J.
Soares´ . Apenas Tentei Usar Um Linguajar Que Generalisar Todos
Os Que Opinan No Forum....

Obs: A Opinião De ´Demian J. Soares´ Atê o Momento Foi a Que Mais Se Identificou Como a Minha Dúvida. Mas Deixo Meus Agradecimentos a Todos Que Contribuiram Com a Sua Opinião.


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

27/12/2003

Colega,

Conforme falei anteriormente, me manda a tabela e um fragmento do código. Minha impressão é que está faltando Group By ou algum problema com tipificação de dados.


GOSTEI 0
Marco Salles

Marco Salles

27/12/2003

Aroldo Zanela, Minha Tabela Tem Apenas Cinco Registro( É Uma Tabela De Teste), E Meu Código Aparece No Topo Deste Tópico(Não Tem Muito Mistério).Eu Estou Querendo é Selecionar Alguns Registro,Mostra-los Em Um DbGrid e Efetuar Uma Soma No Campo Total Desses Registros Selecionados e Mostrar o Resultado Da Soma Em Um Edit.Se Eu Usar Uma Query Separado Só Para Efetuar Esta Soma o Problema Tá Resolvido.Só Que Eu Acho , Que Deve Ter Jeito De Com Uma Mesma Query, Efetuar Uma Seleção, Mostrar Em Um Dbgrid, Somar o Campo Total e Mostrar O Resultado Em Um Edit.


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

27/12/2003

Colega,

A única forma de você utilizar o resultado de uma consulta para efetuar uma soma seria com o uso de um laço: for, whle, repeat no código delphi e que consequentemente seria mais lento que o uso de duas consultas SQL.


GOSTEI 0
Marco Salles

Marco Salles

27/12/2003

[quote:4ed3ee156a=´Aroldo Zanela´]Colega,

Manda a tabela compactada para o meu e-mail: aroldo_zanela@hotmail.com (populada) e se possível o formulário que você está trabalhando.[/quote:4ed3ee156a]

Vou Dar O Assunto Por Encerrado. Aroldo Zanela COmentou:´A única forma de você utilizar o resultado de uma consulta para efetuar uma soma seria com o uso de um laço: for, whle, repeat no código delphi e que consequentemente seria mais lento que o uso de duas consultas SQL.´
Então Usarei Duas Consultas Sql. Finaliso e Agradeço a Todos Que Contribuiram Enviando Sugestoões e Comentários.


GOSTEI 0
POSTAR