MICHELI_MARTINS Posted May 10, 2012 Report Share Posted May 10, 2012 Bom dia. Estou tentando somar as colunas do meu dbgrid mas tenho que somar coluna por coluna ate o final do dbgrid:Segue codigo:for I := 0 to dbgrid1.columns.Count - 1 do aqui eu conto todas as colunas begin soma:= 0; if dbgrid1.Columns.index > 1 then tem que ser maior que um porque as duas primeiras colunas são informações da empresa. begin for j:= 0 to dbgrid1. do // aqui esta o problema preciso somar a coluna inteira e depois passar para a outra coluna. begin //if dbgrid1.columns[j].field.value <> null then //soma:= soma + dbgrid1.columns[j].field.asfloat; showmessage(dbgrid1.columns.field.asstring); end; end; end;A questao é que não da pra fazer soma por tabela porque meus campos são em run time, e estou usando clientdataset.alguém? Quote Link to comment Share on other sites More sharing options...
0 António44 Posted May 10, 2012 Report Share Posted May 10, 2012 Veja se dá para o que você quer,não testei.´ Aggregates!Como fazer campos agregado.Vai aí a dica para quem esta com o mesmo problema.Marcar no ClientDataSet a opção AggregatesActive = trueDar dois cliques no ClientDataSet depois clicar com o botão direito e escolher a opção New Field... Dar um nome que você queira e selecionar no Field Type: aggregate e depois dar ok!Nas opções do campo criado vai em Expression e coloca SUM(CAMPO_QUALQUER) aqui pode fazer um AVG MAX MIN etc...Vai no form que você quer coloca um dbtext e seta para o ClientDataSet e o campo agregado criado e pronto Quote Link to comment Share on other sites More sharing options...
0 MICHELI_MARTINS Posted May 10, 2012 Author Report Share Posted May 10, 2012 então meu amigo como disse é run time como faço um agregado se eu tenho q escolher o campo pra soma? Quote Link to comment Share on other sites More sharing options...
0 António44 Posted May 10, 2012 Report Share Posted May 10, 2012 Veja se serve.var i: integer; sum: real; begin sum:=0; for i:=0 to dbgrid1.columns.Count - 1 do sum:=sum+StrToFloat(DBGrid1.Columns[i].field.AsString); Total.Text:=FloatToStr(sum); end;Abraço. Quote Link to comment Share on other sites More sharing options...
0 MICHELI_MARTINS Posted May 10, 2012 Author Report Share Posted May 10, 2012 não da certo.Se você observar o codigo que postei já coloquei essa instrução pra ele ir para a outra coluna.So que antes disso ele tem que somar a coluna total que estiver. E ai sim depois dessa somada ir para a proxima.So desse jeito que você postou ele já esta indo para a outra coluna sem somar os valores dos outros registros entendeu?dessa forma ele não "desce" o grid... Quote Link to comment Share on other sites More sharing options...
0 Jhonas Posted May 10, 2012 Report Share Posted May 10, 2012 Estou tentando somar as colunas do meu dbgrid mas tenho que somar coluna por coluna ate o final do dbgridexemploselect sum(coluna1), sum(coluna2), sum(coluna3), sum (coluna4) from tabelaabraço Quote Link to comment Share on other sites More sharing options...
0 António44 Posted May 11, 2012 Report Share Posted May 11, 2012 (edited) A questao é que não da pra fazer soma por tabela porque meus campos são em run time, e estou usando clientdataset.alguém?procedure TForm1.SpeedButton1Click(Sender: TObject); var tpRunTotal:real; begin tpRunTotal := 0; with Table1 do begin First; while not EOF do begin tpRunTotal := tpRunTotal + Table1Largura.asfloat; Next; d2.Caption:= ''+floattostrF(tprunTotal,ffnumber,4,2); end; end; end;Eu não conheço maneira de somar valôr assim a não ser por SQL e da Tabela porque lá é que tem os valores!! ,não vejo outra maneira....Abraço. Edited May 11, 2012 by António44 Quote Link to comment Share on other sites More sharing options...
0 MICHELI_MARTINS Posted May 11, 2012 Author Report Share Posted May 11, 2012 Estou tentando somar as colunas do meu dbgrid mas tenho que somar coluna por coluna ate o final do dbgridexemploselect sum(coluna1), sum(coluna2), sum(coluna3), sum (coluna4) from tabela abraço como select sum(coluna1), sum(coluna2), sum(coluna3), sum (coluna4) from tabelanão tenho os campos fixos no clientdataset.... Quote Link to comment Share on other sites More sharing options...
0 Jhonas Posted May 11, 2012 Report Share Posted May 11, 2012 se voce cria os campos virtuais, atribui valores e pode ver o resultado em um dbgrid, então voce pode usar o select para somar esses campos basta voce manter aberto o ClientDataSetabraço Quote Link to comment Share on other sites More sharing options...
0 MICHELI_MARTINS Posted May 11, 2012 Author Report Share Posted May 11, 2012 jhonas desculpe mas não entendi.os campos não são fixos, dependendo do que o usuario escolhe, cria 10, 20 campos e por ai vai. Isso é relativo do que ele escolhe.Como eu faço select sum na coluna assim? Quote Link to comment Share on other sites More sharing options...
0 Jhonas Posted May 11, 2012 Report Share Posted May 11, 2012 na verdade não é tão simples assim, é um pouco complicado, mas vou tentar seguir o raciocinio do seu primeiro postcoloque num form: 2 Edits 2 Botoes1 Dbgrid1 DataSource1 ClientDatSet faça a ligação do DataSource com o ClientDataSet e com o DBgridvamos ao códigounit UQueryDin; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, DBGrids, DB, DBClient, DBTables, Provider; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; DataSource1: TDataSource; ClientDataSet1: TClientDataSet; DBGrid1: TDBGrid; Button1: TButton; Button2: TButton; Edit3: TEdit; Edit4: TEdit; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin // criar campos dinamicamente //verificamos se não tem nenhum field no ClientDataSet if ClientDataSet1.FieldCount = 0 then begin ClientDataSet1.FieldDefs.Clear;//Limpamos campos ClientDataSet1.FieldDefs.Add('Valor1',ftInteger);//adicionamos campos ClientDataSet1.FieldDefs.Add('Valor2',ftInteger); ClientDataSet1.CreateDataSet; end; ClientDataSet1.Append;//e inserimos dados ClientDataSet1.Fieldbyname('Valor1').AsInteger := StrToIntDef(Edit1.text,0); ClientDataSet1.Fieldbyname('Valor2').AsInteger := StrToIntDef(Edit2.text,0); ClientDataSet1.Post; edit1.Clear; edit2.Clear; edit1.SetFocus; end; procedure TForm1.Button2Click(Sender: TObject); var i,j : integer; soma1, soma2 : integer; begin ClientDataSet1.Active := true; ClientDataSet1.First; soma1 := 0; soma2 := 0; for i := 0 to ClientDataSet1.RecordCount-1 do begin for j := 0 to ClientDataSet1.FieldCount - 1 do begin ShowMessage(vartostr(ClientDataSet1.Fields[j].DisplayName) + ' = ' + vartostr(ClientDataSet1.Fields[j].Value)); case j of 0: soma1 := soma1 + ClientDataSet1.Fields[j].Value; 1: soma2 := soma2 + ClientDataSet1.Fields[j].Value; end; end; ClientDataSet1.Next; end; ClientDataSet1.Append;//e inserimos dados ClientDataSet1.Fieldbyname('Valor1').AsInteger := soma1; // soma total da coluna 0 ClientDataSet1.Fieldbyname('Valor2').AsInteger := soma2; // soma total da coluna 1 ClientDataSet1.Post; end; end.veja que estou criando 2 ( colunas ) campos virtuais para a minha tabela ( Valor1 e Valor2 )digitando valores nos edits, e clicando no botão 1, eles vão sendo colocados dentro do dbgrid ao clicar no botão 2, faço a somatória das 2 colunas e insiro o valor das somatorias no ultimo registroveja se consegue entender a lógica do códigoOBS: se os campos virtuais fossem adicionados a uma query então já seria outra maneira de fazerabraço Quote Link to comment Share on other sites More sharing options...
0 MICHELI_MARTINS Posted May 14, 2012 Author Report Share Posted May 14, 2012 A lógica eu entendi, so que o que preciso é ao contrario.Preciso somar a coluna inteira (vertical) e depois somar as proxima coluna (vertical) e assim sucessivamente.E não fazer com que some todas as colunas da linha e depois ir para a outra linha.E nesse contexto tenho duas colunas iniciais que não podem ser somadas, uma com o codigo da empresa e a outra o nome da empresa.Assim sendo essa soma (vertical) tem quer vir a partir da terceira coluna.Somo a terceira coluna e depois vou para a quarta coluna e assim vai. Quote Link to comment Share on other sites More sharing options...
0 Jhonas Posted May 14, 2012 Report Share Posted May 14, 2012 Assim sendo essa soma (vertical) tem quer vir a partir da terceira coluna.Somo a terceira coluna e depois vou para a quarta coluna e assim vai.tá dificil entender ... né ?procedure TForm1.Button2Click(Sender: TObject); var i,j : integer; soma1, soma2 : integer; begin ClientDataSet1.Active := true; ClientDataSet1.First; soma1 := 0; soma2 := 0; for i := 0 to ClientDataSet1.RecordCount-1 do begin for j := 2 to ClientDataSet1.FieldCount - 1 do // somar a partir da 3ª coluna begin ShowMessage(vartostr(ClientDataSet1.Fields[j].DisplayName) + ' = ' + vartostr(ClientDataSet1.Fields[j].Value)); case j of 2: soma1 := soma1 + ClientDataSet1.Fields[j].Value; // 3ª coluna 3: soma2 := soma2 + ClientDataSet1.Fields[j].Value; // 4ª coluna end; end; ClientDataSet1.Next; end; end;a coluna começa com indice 0 esse código é somente um exemplo, voce tem que adptar o código as suas necessidadesabraço Quote Link to comment Share on other sites More sharing options...
0 MICHELI_MARTINS Posted May 14, 2012 Author Report Share Posted May 14, 2012 Definitivamente esta.Veja esse é meu cenario: http://img821.imageshack.us/img821/6280/semttulore.jpgE este é o seu código, eu so alterei o showmessage pra ir vendo a soma das colunas e um if para não dar problema na soma com campo null.Mas na verdade futuramente quando o codigo estiver correto vou fazer um append no grid com os totais na ultima coluna.procedure Tca057.SpeedButton2Click(Sender: TObject);vari,j: integer;soma1,soma2: extended;begin ca057.Active := true; ca057.First; soma1 := 0; soma2 := 0; for i := 0 to ca057.RecordCount-1 do begin for j := 2 to ca057.FieldCount - 1 do // somar a partir da 3ª coluna begin if ca057.Fields[j].asstring <> '' then begin case j of 2: begin soma1 := soma1 + ca057.Fields[j].Value; // 3ª coluna ShowMessage(vartostr(ca057.Fields[j].DisplayName) + ' = ' + floattostr(soma1)); end; 3: begin soma2 := soma2 + ca057.Fields[j].Value; // 4ª coluna ShowMessage(vartostr(ca057.Fields[j].DisplayName) + ' = ' + floattostr(soma2)); end; end; end; end; ca057.Next; end;De acordo com o desenho o link e o seu codigo, ele APENAS soma as receitas operacionais (50 + 70). não soma receitas não OPERACIONAIS (100 + 200).não soma despesas operacionais (6000 + 1780.04). Existem mais campos nesse desenho porem so com esses ai acho que já da pra entender.E esses campos aparecem conforme o grau de receita ou despesa que o usuario escolhe. Grau 1(receita e despesa). Grau 2(grupos de receita e despesa). Grau 3seriam as contas especificas. No caso este desenho esta com grau 2. Quote Link to comment Share on other sites More sharing options...
0 Jhonas Posted May 14, 2012 Report Share Posted May 14, 2012 De acordo com o desenho o link e o seu codigo, ele APENAS soma as receitas operacionais (50 + 70). não soma receitas não OPERACIONAIS (100 + 200).não soma despesas operacionais (6000 + 1780.04).quando disse que voce tem que adptar o código, é voce que vai colocar no código aquilo que estiver faltando para o seu usoveja:colunas:0 - CODEMP1 - CANTEIRO2 - RECEITAS OPERACIONAIS3 - RECEITAS4 - RECEITAS NÃO OPERACIONAIS5 - IMPOSTOS SOBRE FATURAMENTO6 - DESPESAS OPERACIONAIS7 - DESPESAS COM SOCIOSentão voce vai modificar o código para pegar essas colunasprocedure Tca057.SpeedButton2Click(Sender: TObject); var i,j: integer; soma1,soma2, soma3: extended; begin ca057.Active := true; ca057.First; soma1 := 0; soma2 := 0; soma3 := 0; for i := 0 to ca057.RecordCount-1 do begin for j := 2 to ca057.FieldCount - 1 do // somar a partir da 3ª coluna begin if ca057.Fields[j].asstring <> '' then begin case j of 2: begin // RECEITAS OPERACIONAIS soma1 := soma1 + ca057.Fields[j].Value; // 3ª coluna ShowMessage(vartostr(ca057.Fields[j].DisplayName) + ' = ' + floattostr(soma1)); end; 4: begin // RECETAS NÃO OPERACIONAIS soma2 := soma2 + ca057.Fields[j].Value; // 5ª coluna ShowMessage(vartostr(ca057.Fields[j].DisplayName) + ' = ' + floattostr(soma2)); end; 6: begin // DESPESAS OPERACIONAIS soma3 := soma3 + ca057.Fields[j].Value; // 7ª coluna ShowMessage(vartostr(ca057.Fields[j].DisplayName) + ' = ' + floattostr(soma3)); end; end; end; end; ca057.Next; end;acho que agora fica mais facil entender ...abraço Quote Link to comment Share on other sites More sharing options...
0 MICHELI_MARTINS Posted May 15, 2012 Author Report Share Posted May 15, 2012 não da pra eu especificar as colunas que eu quero que some.Uma porque os campos vem run time como eu disse depende do grau que o usuario escolhe, então onde esta por exemplo receita operacional, se antes era isso pode virar despesa operacional, depende do que o usuario escolhe.Duas porque se esta no grid, já foi selecinado e é pra somar todas, porem coluna por coluna pra que depois eu jogue o total no ultimo registro do grid para cada campo. Quote Link to comment Share on other sites More sharing options...
0 Jhonas Posted May 15, 2012 Report Share Posted May 15, 2012 não da pra eu especificar as colunas que eu quero que some.então some todas as colunas que forem numericas, depois voce escolhe o resultado finalabraço Quote Link to comment Share on other sites More sharing options...
0 Rafael Aren Posted July 20, 2014 Report Share Posted July 20, 2014 boa noite.. estou com algumas duvidas alguém poderia me ajudar.. bem estou desenvolvendo um sistema de controle Financeiro, e ate agora ele esta rodando perfeitamente, mas, na minha tela de pesquisa de lançamentos mensais onde a tela possui um dblookupcombobox onde seria selecionado o mes passando a informação dos lançamentos de tal mes no dbgrid. bem ate ai esta funcionando perfeitamente, mas eu gopstaria que embaixo onde informa a soma de todos os lanç. fosse informada apenas dos lanç. selecionados.. atualmente soma dos os que foram lançados no sistema. alguém pode me ajudar?? Quote Link to comment Share on other sites More sharing options...
Question
MICHELI_MARTINS
Bom dia.
Estou tentando somar as colunas do meu dbgrid mas tenho que somar coluna por coluna ate o final do dbgrid:
Segue codigo:
for I := 0 to dbgrid1.columns.Count - 1 do aqui eu conto todas as colunas
begin
soma:= 0;
if dbgrid1.Columns.index > 1 then tem que ser maior que um porque as duas primeiras colunas são informações da empresa.
begin
for j:= 0 to dbgrid1. do // aqui esta o problema preciso somar a coluna inteira e depois passar para a outra coluna.
begin
//if dbgrid1.columns[j].field.value <> null then
//soma:= soma + dbgrid1.columns[j].field.asfloat;
showmessage(dbgrid1.columns.field.asstring);
end;
end;
end;
A questao é que não da pra fazer soma por tabela porque meus campos são em run time, e estou usando clientdataset.
alguém?
Link to comment
Share on other sites
17 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.