Jump to content
Fórum Script Brasil
  • 0

soma coluna inteira dbgrid


MICHELI_MARTINS

Question

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

  • 0

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 = true

Dar 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

Link to comment
Share on other sites

  • 0

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...

Link to comment
Share on other sites

  • 0
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 by António44
Link to comment
Share on other sites

  • 0
Estou tentando somar as colunas do meu dbgrid mas tenho que somar coluna por coluna ate o final do dbgrid

exemplo

select sum(coluna1), sum(coluna2), sum(coluna3), sum (coluna4)  from tabela
abraço
como select sum(coluna1), sum(coluna2), sum(coluna3), sum (coluna4) from tabela

não tenho os campos fixos no clientdataset....

Link to comment
Share on other sites

  • 0

na verdade não é tão simples assim, é um pouco complicado, mas vou tentar seguir o raciocinio do seu primeiro post

coloque num form:

2 Edits

2 Botoes

1 Dbgrid

1 DataSource

1 ClientDatSet

faça a ligação do DataSource com o ClientDataSet e com o DBgrid

vamos ao código

unit 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 registro

veja se consegue entender a lógica do código

OBS: se os campos virtuais fossem adicionados a uma query então já seria outra maneira de fazer

abraço

Link to comment
Share on other sites

  • 0

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.

Link to comment
Share on other sites

  • 0

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 necessidades

abraço

Link to comment
Share on other sites

  • 0

Definitivamente esta.

Veja esse é meu cenario: http://img821.imageshack.us/img821/6280/semttulore.jpg

E 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);

var

i,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 3

seriam as contas especificas. No caso este desenho esta com grau 2.

Link to comment
Share on other sites

  • 0
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 uso

veja:

colunas:

0 - CODEMP

1 - CANTEIRO

2 - RECEITAS OPERACIONAIS

3 - RECEITAS

4 - RECEITAS NÃO OPERACIONAIS

5 - IMPOSTOS SOBRE FATURAMENTO

6 - DESPESAS OPERACIONAIS

7 - DESPESAS COM SOCIOS

então voce vai modificar o código para pegar essas colunas

procedure 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

Link to comment
Share on other sites

  • 0

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.

Link to comment
Share on other sites

  • 0

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??

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...