Loop em DBGrid

01/04/2003

0

Boa noite,

Alguém sabe me dizer como fazer um loop dentro de um DBGrid?

Uso Paradox e possuo um formulário com um dbGrid.

Dentro deste DB tenho uma coluna Valor e outra Total(que é um campo calculado).

Preciso fazer um loop para que a medida que forem inseridos valores na tabela , seja feito o seguinte cálculo pegando o valor que está em cada linha do DBGrid.


Total:=SaldoAnterior - Valor.


O problema é que não estou conseguindo fazer o loop das linhas do DBGrid.


Alguém sabe poderia dar uma luz?


Valeu.


Responder

Posts

01/04/2003

Dli

Emerson ,

Obrigado por sua resposta, na verdade o que você me indicou é exatamente o que estou fazendo, só que quando coloco otable.first no código, ao compilar recebo uma mensagem de Stack Overflow.

E quando dou table.next. recebo uma mensagem dizendo que a tabela está bloqueado por outro usuário.

Como vês uma coisa que parece tão simples, tá dificil de resolver e não consigo entender o que está acontecendo.

Tens mais alguma idéia?



Um abraço

dli


Responder

01/04/2003

Aroldo Zanela

Não se dá um loop na dbgrid. Na verdade o loop é feito no dataset que está conectado à grade. Por exemplo: Você tem o dataset1 ligado ao datasource1, que por sua vez está ligado à dbgrid1. Você precisa fazer um loop no dbgrid1? Então faça: dataset1.first; // note que não é a dbgrid!!!!! while not dataset1.eof do begin     Total := Total + (SaldoAnterior - Valor);     dataset1.next; end; Mas se esse cálculo deve ser mostrado em cada linha, é melhor você criar um campo calculado. Ajudei ou atrapalhei?


dica:
dbgrid1.DataSource.DataSet.First; // aponta para o dataset

Stack Overflow:
Pode ocorrer quando o sistema não consegue aumentar a pilha dinamicamente. Isto pode acontecer pelo uso de variáveis locais extremamente grandes, rotinas profundamente recursivas, ou código inválido de linguagem assembly.

Acredito que um loop num campo calculado na própria tabela vai deixar o cursor do banco ´perdido´. Acho que presisamos de outra solução.


Responder

01/04/2003

Dli

O meu problema é que não estou conseguindo fazer um
loop dentro do DBGrid , para fazer o cálculo linha a linha.

Por exemplo:

O que preciso é isto:

-------------------------/-----------/----------
descrição Valor Total
---------------------------------------------------
Saldo inicial 1000(este valor eu
pego de uma outra tabela, que é a master)
aaaaaa 100 1100
bbbbbb 50 1150
cccccc -10 1140


O que estou conseguindo é isto:


-------------------------/-----------/----------
descrição Valor Total
---------------------------------------------------
Saldo inicial 1000(este valor eu
pego de uma outra tabela,que é a master)
aaaaaa 100 900
bbbbbb 50 950
cccccc -10 990


O problema é fazer o loop.


Responder

01/04/2003

Aroldo Zanela

Veja um exemplo:

Código pascal:
var
  Form1: TForm1;
  Total: Currency;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
Query1.Open;
  Total := Query1TOTAL.AsCurrency;
  rxTotal.Value := total;
  Table1.Open;
end;

procedure TForm1.Table1CalcFields(DataSet: TDataSet);
begin
Total := Total - Table1ItemsTotal.AsCurrency;
Table1SALDO.Value := Total;
end;



DFM:

  object DBGrid1: TDBGrid
    Left = 14
    Top = 106
    Width = 659
    Height = 327
    DataSource = DataSource1
    ReadOnly = True
    TabOrder = 0
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = ´MS Sans Serif´
    TitleFont.Style = []
  end
  object rxTotal: TRxCalcEdit
    Left = 230
    Top = 24
    Width = 121
    Height = 21
    AutoSize = False
    NumGlyphs = 2
    TabOrder = 1
  end
  object Table1: TTable
    OnCalcFields = Table1CalcFields
    DatabaseName = ´DBDEMOS´
    TableName = ´orders.db´
    Left = 132
    Top = 66
    object Table1OrderNo: TFloatField
      FieldName = ´OrderNo´
    end
    object Table1CustNo: TFloatField
      FieldName = ´CustNo´
      Required = True
    end
    object Table1SaleDate: TDateTimeField
      FieldName = ´SaleDate´
    end
    object Table1ShipDate: TDateTimeField
      FieldName = ´ShipDate´
    end
    object Table1EmpNo: TIntegerField
      FieldName = ´EmpNo´
      Required = True
    end
    object Table1ShipToContact: TStringField
      FieldName = ´ShipToContact´
    end
    object Table1ShipToAddr1: TStringField
      FieldName = ´ShipToAddr1´
      Size = 30
    end
    object Table1ShipToAddr2: TStringField
      FieldName = ´ShipToAddr2´
      Size = 30
    end
    object Table1ShipToCity: TStringField
      FieldName = ´ShipToCity´
      Size = 15
    end
    object Table1ShipToState: TStringField
      FieldName = ´ShipToState´
    end
    object Table1ShipToZip: TStringField
      FieldName = ´ShipToZip´
      Size = 10
    end
    object Table1ShipToCountry: TStringField
      FieldName = ´ShipToCountry´
    end
    object Table1ShipToPhone: TStringField
      FieldName = ´ShipToPhone´
      Size = 15
    end
    object Table1ShipVIA: TStringField
      FieldName = ´ShipVIA´
      Size = 7
    end
    object Table1PO: TStringField
      FieldName = ´PO´
      Size = 15
    end
    object Table1Terms: TStringField
      FieldName = ´Terms´
      Size = 6
    end
    object Table1PaymentMethod: TStringField
      FieldName = ´PaymentMethod´
      Size = 7
    end
    object Table1ItemsTotal: TCurrencyField
      FieldName = ´ItemsTotal´
    end
    object Table1TaxRate: TFloatField
      FieldName = ´TaxRate´
    end
    object Table1Freight: TCurrencyField
      FieldName = ´Freight´
    end
    object Table1AmountPaid: TCurrencyField
      FieldName = ´AmountPaid´
    end
    object Table1SALDO: TCurrencyField
      FieldKind = fkCalculated
      FieldName = ´SALDO´
      Calculated = True
    end
  end
  object DataSource1: TDataSource
    DataSet = Table1
    Left = 218
    Top = 62
  end
  object Query1: TQuery
    DatabaseName = ´DBDEMOS´
    SQL.Strings = (
      ´SELECT SUM(ItemsTotal) TOTAL from orders´)
    Left = 416
    Top = 48
    object Query1TOTAL: TCurrencyField
      FieldName = ´TOTAL´
      Origin = ´"orders.DB".ItemsTotal´
    end
  end



Responder

03/04/2003

Dli

Obrigado, a todos pela ajuda.
Consegui resolver.

Valeu.


[]´s

dli


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar