Fórum Como somar coluna do dbgrid, e mostra num edit? #317464
27/03/2006
0
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
Curtir tópico
+ 0Posts
27/03/2006
Rogick
É 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:
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!!!
Gostei + 0
27/03/2006
Rogick
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.
Gostei + 0
27/03/2006
Vitoreduardo
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;
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 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!
Gostei + 0
27/03/2006
Vitoreduardo
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.
Gostei + 0
27/03/2006
Martins
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!
Gostei + 0
27/03/2006
Vitoreduardo
Eu consegui aqui, pelo menos uma parte.
Vou continuar tentando aqui e posto o resultado.
valeu
Gostei + 0
27/03/2006
Martins
Certo, poste o q falta arrumar, q nós veremos isso, boa sorte!
Gostei + 0
27/03/2006
Georgecvenancio
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;
Gostei + 0
28/03/2006
Rogick
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.
Gostei + 0
28/03/2006
Martins
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!!!
Gostei + 0
28/03/2006
Martins
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.
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:
Gostei + 0
28/03/2006
Odacir
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?
Gostei + 0
28/03/2006
Martins
É uma Opção sim, com certeza.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)