MICHELI_MARTINS Postado Maio 10, 2012 Denunciar Share Postado Maio 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 António44 Postado Maio 10, 2012 Denunciar Share Postado Maio 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 MICHELI_MARTINS Postado Maio 10, 2012 Autor Denunciar Share Postado Maio 10, 2012 então meu amigo como disse é run time como faço um agregado se eu tenho q escolher o campo pra soma? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 António44 Postado Maio 10, 2012 Denunciar Share Postado Maio 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 MICHELI_MARTINS Postado Maio 10, 2012 Autor Denunciar Share Postado Maio 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... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Maio 10, 2012 Denunciar Share Postado Maio 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 António44 Postado Maio 11, 2012 Denunciar Share Postado Maio 11, 2012 (editado) 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. Editado Maio 11, 2012 por António44 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 MICHELI_MARTINS Postado Maio 11, 2012 Autor Denunciar Share Postado Maio 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.... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Maio 11, 2012 Denunciar Share Postado Maio 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 MICHELI_MARTINS Postado Maio 11, 2012 Autor Denunciar Share Postado Maio 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Maio 11, 2012 Denunciar Share Postado Maio 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 MICHELI_MARTINS Postado Maio 14, 2012 Autor Denunciar Share Postado Maio 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Maio 14, 2012 Denunciar Share Postado Maio 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 MICHELI_MARTINS Postado Maio 14, 2012 Autor Denunciar Share Postado Maio 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Maio 14, 2012 Denunciar Share Postado Maio 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 MICHELI_MARTINS Postado Maio 15, 2012 Autor Denunciar Share Postado Maio 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Maio 15, 2012 Denunciar Share Postado Maio 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Rafael Aren Postado Julho 20, 2014 Denunciar Share Postado Julho 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?? Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
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 para o comentário
Compartilhar em outros sites
17 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.