Fórum Como somar coluna do dbgrid, e mostra num edit? #317464

27/03/2006

0

Olá galera blz?

Estou precisando somar uma coluna do dbgrid depois de fazer uma busca, e mostrar o resultado num edit ou label.

Pesquisei mais não achei, os código que eu vi, são sempre para somar duas ou mais tabelas.

Tenho uma tabela de vendas com esses campos (ID_Vendas, Empresa, Data, Valor).
Sendo que o campo Valor é DOUBLE PRECISION.

Estou usando FireBird 1.5.2 mais Delphi 7.

Estou fazendo uma consulta assim:
if combobox1.Text = ´Empresa´then
begin
 DM_Geral.IBDSEmpresa.Close;
 DM_Geral.IBDSEmpresa.SelectSQL.Clear;
 DM_Geral.IBDSEmpresa.SelectSQL.Add(´Select * From Vendas´);
 DM_Geral.IBDSEmpresa.SelectSQL.Add(´Where Upper(Empresa) Like:Empresa´);
 DM_Geral.IBDSEmpresa.ParamByName(´Empresa´).AsString:= UpperCase(Edit1.text)+´¬´;
 DM_Geral.IBDSEmpresa.Open;

Essa pesquisa vai me retornar:
Empresa X, Data 27/03/2006, Valor 150,00
Empresa X, Data 27/03/2006, Valor 100,00
Gostaria de mostrar num edit ou label, a soma dos dois campo (Valor).

Desde já agradeço.


Vitoreduardo

Vitoreduardo

Responder

Posts

27/03/2006

Rogick

O método q eu uso, não é o + bonito mas dá pro gasto.

É assim:
...
var
  vrTotal: Currency;
begin
...
// Após o Open do DataSet ou no Evento AfterOpen...
  with DM_Geral.IBDSEmpresa do
  begin
     DataSource1.DataSet := nil; // Desvinculado DataSource

     First; // Desnecessário, só por legibilidade

     vrTotal := 0;
     while not Eof do 
     begin
       vrTotal := vrTotal + FieldByName(´VALOR´).AsCurrency;
       Next; 
     end;

     First;
     DataSource1.DataSet := DM_Geral.IBDSEmpresa; 
  end;
  Edit1.Text := Format(´¬.2n´, [vrTotal]); // Joga o valor formatado na Edit
...


Espero ter ajudado, qq coisa posta d novo. :wink:


Responder

Gostei + 0

27/03/2006

Martins

if combobox1.Text = ´Empresa´then 
begin 
 DM_Geral.IBDSEmpresa.Close; 
 DM_Geral.IBDSEmpresa.SelectSQL.Clear; 
 DM_Geral.IBDSEmpresa.SelectSQL.Add(´Select Sum(Valor) as ValorX From Vendas´); 
 DM_Geral.IBDSEmpresa.SelectSQL.Add(´Where Upper(Empresa) Like:Empresa´); 
 DM_Geral.IBDSEmpresa.ParamByName(´Empresa´).AsString:= UpperCase(Edit1.text)+´¬´; 
 DM_Geral.IBDSEmpresa.Open;


Assim vc soma usando SQL.

Se entendi errado, me perdoe.

Boa sorte!!!


Responder

Gostei + 0

27/03/2006

Rogick

Vou explicar melhor:

Esta função simplemente varre o DataSet incrementando os registros do campo VALOR na variável e depois joga o valor calculado na edit.

Eu disse que não era bonito, e não funciona bem quando conjunto de dados é muito grande(fica lento às vezes), mas dá pro gasto.


Responder

Gostei + 0

27/03/2006

Vitoreduardo

O Martins blz?

Eu tinha feito assim como vc falo, mais acontece o seguinte erro(Field ´ID_Vendas´ not found).

Do jeito que o Rogick fez até funcionou mais só pro campo data, pro campo Empresa não, pois o tipo de consulta que eu fiz eu não preciso digitar todo o nome da Empresa, então funcionou mais só se eu digitar a primeira letra, quando digito a segunda letra da (Access violation).

Outro problema com o código do Rogick;
Quando eu faço a primeira consulta por data da certo, mais quando limpo o edit e faço uma nova pesquisa da (Access violation).

Código:
var
  vrTotal: Currency;
begin
if combobox1.Text = ´Data´then
begin
 DM_Geral.IBDSConsultaVendas.Close;
 DM_Geral.IBDSConsultaVendas.SelectSQL.Clear;
 DM_Geral.IBDSConsultaVendas.SelectSQL.Add(´Select * From Vendas´);
 DM_Geral.IBDSConsultaVendas.SelectSQL.Add(´Where Upper(Data) Like:Data´);
 DM_Geral.IBDSConsultaVendas.ParamByName(´Data´).AsDate := StrToDate(Edit1.text);
 DM_Geral.IBDSConsultaVendas.Open;
with DM_Geral.IBDSConsultaVendas do
begin
 DM_Geral.IBDSConsultaVendas := nil;
 vrTotal := 0;
while not Eof do
begin
 vrTotal := vrTotal + FieldByName(´VALOR´).AsCurrency;
 Next;
end;
 First;
 DM_Geral.IBDSConsultaVendas := DM_Geral.IBDSConsultaVendas;
end;
 DBText3.Caption := Format(´¬.2n´, [vrTotal]);
end;
end;



Responder

Gostei + 0

27/03/2006

Martins

[b:d4c062bbb7]vitoreduardo[/b:d4c062bbb7], vamos tentar com o código abaixo Ok!

if combobox1.Text = ´Empresa´then 
begin 
 DM_Geral.IBDSEmpresa.Close; 
 DM_Geral.IBDSEmpresa.SelectSQL.Clear; 
 DM_Geral.IBDSEmpresa.SelectSQL.Add(´Select ID_Vendas, Empresa, Data, Sum(Valor) From Vendas´); 
 DM_Geral.IBDSEmpresa.SelectSQL.Add(´Where Upper(Empresa) Like:Empresa´); 
 DM_Geral.IBDSEmpresa.ParamByName(´Empresa´).AsString:= UpperCase(Edit1.text)+´¬´; 
 DM_Geral.IBDSEmpresa.Open;


Veja se assim funciona, pois no código anterior o ID_Vendas não estaria presente na instrução SQL, agora os campos indicados por vc estão lá, teste por favor.

boa sorte!


Responder

Gostei + 0

27/03/2006

Vitoreduardo

Martins, não funcionou.

Ocorre o seguinte erro:(Invalid expression in the select list (not contained in either an aggregate function or the Group by clause)´.

Eu até tinha tentado dessa forma mais não obtive sucesso.
if combobox1.Text = ´Empresa´then 
begin 
 DM_Geral.IBDSEmpresa.Close; 
 DM_Geral.IBDSEmpresa.SelectSQL.Clear; 
 DM_Geral.IBDSEmpresa.SelectSQL.Add(´Select ID_Vendas, Empresa, Data, Sum(Valor) From Vendas´); 
 DM_Geral.IBDSEmpresa.SelectSQL.Add(´Where Upper(Empresa) Like:Empresa´); 
 DM_Geral.IBDSEmpresa.ParamByName(´Empresa´).AsString:= UpperCase(Edit1.text)+´¬´; 
 DM_Geral.IBDSEmpresa.Open;


Esse Edit1.text é onde eu vou digitar o nome da empresa, então eu tenho que jogar o resultado da sama em outro lugar, num edit ou label.
Mais eu já fiz isso e o erro continua.


Responder

Gostei + 0

27/03/2006

Martins

Amigo, esse erro acontece quando vc compila ou quando vc executa a ação no projeto?

Hj aqui tá complicado para pensar, vou ficar de castigo até mais tarde. Amigo, acredito q vc terá q fazer um sub-select para conseguir o q deseja, não posso nem testar pois não tenho o FB nessa máquina, apenas Ib6 q vem com o programa da Caixa - CEF.

Selec Campos, (Select Sum(Campo) from Tabela Where Codicao ) from Tabela Where Condicao.


if combobox1.Text = ´Empresa´then 
begin 

 DM_Geral.IBDSEmpresa.Close; 

 DM_Geral.IBDSEmpresa.SelectSQL.Clear; 

 DM_Geral.IBDSEmpresa.SelectSQL.Add(´Select ID_Vendas, Empresa, Data,(Select Sum(Valor) as Valores From Vendas where Upper(Empresa) Like: empresa) as Valor from Vendas ´); 

 DM_Geral.IBDSEmpresa.SelectSQL.Add(´Where Upper(Empresa) Like:Empresa´); 

 DM_Geral.IBDSEmpresa.ParamByName(´Empresa´).AsString:= QuotedStr(UpperCase(Edit1.text))+´¬´; 

 DM_Geral.IBDSEmpresa.Open;


  Labelx.Caption := FormatFloat(´R$ #,0.00´, Dm_Geral.IBDSEmpresa.FieldByName(´Valores´).AsFloat);


Boa sorte!


Responder

Gostei + 0

27/03/2006

Vitoreduardo

Blz Martins

Eu consegui aqui, pelo menos uma parte.
Vou continuar tentando aqui e posto o resultado.

valeu


Responder

Gostei + 0

27/03/2006

Martins

Blz Martins Eu consegui aqui, pelo menos uma parte. Vou continuar tentando aqui e posto o resultado. valeu


Certo, poste o q falta arrumar, q nós veremos isso, boa sorte!


Responder

Gostei + 0

27/03/2006

Georgecvenancio

Caro colega, acrescentando ao que nosso colega Martins escreveu:

if combobox1.Text = ´Empresa´then
begin
DM_Geral.IBDSEmpresa.Close;
DM_Geral.IBDSEmpresa.SelectSQL.Clear;
DM_Geral.IBDSEmpresa.SelectSQL.Add(´Select ID_Vendas, Empresa, Data, Sum(Valor) From Vendas´);
DM_Geral.IBDSEmpresa.SelectSQL.Add(´Where Upper(Empresa) Like:Empresa´);
//Aqui está a mudança
DM_Geral.IBDSEmpresa.SelectSQL.Add(´Group by ID_Vendas,Empresa´);
DM_Geral.IBDSEmpresa.ParamByName(´Empresa´).AsString:= UpperCase(Edit1.text)+´¬´;
DM_Geral.IBDSEmpresa.Open;


Responder

Gostei + 0

28/03/2006

Rogick

O Vitor, acho o q vc fez tá certo, só que não endenteu a questão do [b:52e31bdda4]DataSource.Data[/b:52e31bdda4] receber [b:52e31bdda4]nil[/b:52e31bdda4]. Você estava jogando para nil o próprio componente(TIBQuery eu acho), quando vc deveria jogar para nil a propriedade [i]DataSet[i] do DataSource que está ligando o [b:52e31bdda4]IBDSConsultaVendas[/b:52e31bdda4] a [b:52e31bdda4]DBGrid[/b:52e31bdda4]. Isso é opicional, só para o usuário não ver o DBGrid ´rolando´ até o final e depois voltar para o início. E isso funciona para qualquer query, desde que tenha o campo valor, e para otimizar o código, vc pode colocá-lo no Evento [b:52e31bdda4]AfterOpen[/b:52e31bdda4] do TIBQuery ou criar uma procedure para isso.

Posta aqui o nome do [b:52e31bdda4]DataSource[/b:52e31bdda4] que vc tá usando para eu te mandar o código como ele pode ficar.


Responder

Gostei + 0

28/03/2006

Martins

Tantos códigos e nada certo, faltava apenas pensar e verificar q faltava colocar um group by, para agruparmos.

Teste com o código abaixo, testei ontem na casa de um colega q roda Firebird e funcionou, fiz uma tabela com a estrutura passada por vc.

select Empresa, Id_Vendas, Sum(Valor) from testes where Id_vendas = 2 group by Empresa, Id_Vendas;


if combobox1.Text = ´Empresa´then 
begin 

 DM_Geral.IBDSEmpresa.Close; 

 DM_Geral.IBDSEmpresa.SelectSQL.Clear; 

 DM_Geral.IBDSEmpresa.SelectSQL.Add(´Select ID_Vendas, Empresa, Data, Sum(Valor) as Valores From Vendas where Upper(Empresa) Like: empresa Group by ID_Vendas, Empresa, Data ´); 

 DM_Geral.IBDSEmpresa.SelectSQL.Add(´Where Upper(Empresa) Like:Empresa´); 

 DM_Geral.IBDSEmpresa.ParamByName(´Empresa´).AsString:= QuotedStr(UpperCase(Edit1.text))+´¬´; 

 DM_Geral.IBDSEmpresa.Open; 


Chame no Label com o código.
Labelx.Caption := FormatFloat(´R$ #,0.00´, Dm_Geral.IBDSEmpresa.FieldByName(´Valores´).AsFloat); 


Boa sorte!!!


Responder

Gostei + 0

28/03/2006

Martins

Tantos códigos e nada certo, faltava apenas pensar e verificar q faltava colocar um group by, para agruparmos.


Estou falando dos códigos q postei ontem as pressas, quanto aos códigos dos demais colegas, não me considero apto a julgá-los, refiro-me expressamente aos meus.

Teste com o código abaixo, testei ontem na casa de um colega q roda Firebird e funcionou, fiz uma tabela com a estrutura passada por vc.
select Empresa, Id_Vendas, Sum(Valor) from testes where Id_vendas = 2 group by Empresa, Id_Vendas;


Fiz um teste no IbExpert somente para verificar resultados, nada muito importante, nem igual a sua realidade.
:wink:


Responder

Gostei + 0

28/03/2006

Odacir

Mas o colega que fez a pergunta, gostaria de mostrar todos os registros da consulta no DBGrid, e a somatória da coluna em questão em um Edit.

Com o SQL mostrado, teria de ser feito duas consultas ao banco de dados. Uma para mostrar os dados no grid, e a outra apenas para fazer o somatório, correto?

Um campo calculado, não resolveria o problema mais fácil?


Responder

Gostei + 0

28/03/2006

Martins

Mas o colega que fez a pergunta, gostaria de mostrar todos os registros da consulta no DBGrid, e a somatória da coluna em questão em um Edit. Com o SQL mostrado, teria de ser feito duas consultas ao banco de dados. Uma para mostrar os dados no grid, e a outra apenas para fazer o somatório, correto? Um campo calculado, não resolveria o problema mais fácil?


É uma Opção sim, com certeza.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar