pegar o valor de um registro anterior ao que está posicionad

Delphi

16/09/2006

Olá pessoal, como faço pra pegar o valor de um registro anterior ao que está posicionado no ClientDataSet?
Ex. Tabela
id Valor Acumulado
1 100 100
2 200 300
3 150 450
4 030 480

tenho o campo ´valor´ na tabela e quero criar um campo calculado ´Acumulado´ e ir totalizado. Aí preciso
criar uma variavel pra ir somando o registro atual mais o anterior

mas como fazer isso?


Eurismar

Eurismar

Curtidas 0

Respostas

Rm

Rm

16/09/2006

Não sei te ajuda...Fiz algo parecido mas com campo data, não calculado.

Para o que tu precisa eu apenas faria um loop
var
soma:real//ou integer
begin
soma:=0;
table.first;
while not table.eof do begin
soma:=soma+tablevalor.value;
table.edit;
tablevaloracumulado.value:=soma;
table.post;
table.next;
end;//fecha loop
table.first;
end;

Espero que seja de alguma utilidade


GOSTEI 0
Raserafim

Raserafim

16/09/2006

não testei, mas acho que vc pode criar uma variável global, e no evento OnCalcField vc atribui o valor a esta variável, assim vc terá sempre o valor do registro anterior.


GOSTEI 0
Welgomes

Welgomes

16/09/2006

Eu fiz algo semelhante para um relatório de uma empresa.
Criei uma tabela temporária e fiz o cálculo acumulado.

Acumulado:=0

{dentro do loop
O cálculo básico é esse:}

Acumulado:=Acumulado + ValorCampoAtual

Outro detalhe:
Crie um campo chamado Sequencia.
Este campo armazenará a sequência em que o acumulado foi calculado.
E na consulta ordene por este campo.
Ou ordene pelo campo acumulado.
Caso contrário no seu relatório ou grid poderá aparecer tudo de forma desordenada.


GOSTEI 0
Micheus

Micheus

16/09/2006

mas acho que vc pode criar uma variável global, e no evento OnCalcField vc atribui o valor a esta variável, assim vc terá sempre o valor do registro anterior.
[b:25689f673b]raserafim[/b:25689f673b], acredito que não dará certo pelo fato de que o evento OnCalcField é disparado em várias situações e provavelmente o valor não corresponderá ao esperado.

tenho o campo ´valor´ na tabela e quero criar um campo calculado ´Acumulado´ e ir totalizado. Aí preciso criar uma variavel pra ir somando o registro atual mais o anterior
[b:25689f673b]uris[/b:25689f673b], acho que a idéia do colega [b:25689f673b]welgomes[/b:25689f673b], de criar uma tabela temporária, seja mais interessante.
Mas, a título de mais uma sugestão: observando seu exempro e considerando que vc tem um campo de índice (ID) talvez vc pudesse utilizar uma consulta para gerar a totalização dos itens até o atual e atribuir ao campo calculado no evento OnCalcFields;
Seria assim:
- Num componente ClientDataSet (CDSTotaliza) vc colocar o seguinte SQL
´select SUM(VALOR) VLR_TOTAL´
´where ID <= :ID´
- Adiciona o campo ao CDSTotaliza, de modo a termos CDSTotalizaVLR_TOTAL;
- no evento OnCalcField do seu ClienteDataSet principal (CDSPrincipal)
procedure TForm1.CDSPrincipalCalcFields(DataSet: TDataSet);
begin
  CDSTotaliza.Params.ParamByName(´ID´).AsInteger := CDSPrincipalID.AsInteger;
  CDSTotaliza.Open;
  CDSPrincipalACUMULADO.AsFloat := CDSTotalizaVLR_TOTAL.AsFloat;
  CDSTotaliza.Close;
end;

Não é a mais eficiente, pelo mesmo motivo do comentário que fiz ao colega [b:25689f673b]raserafim[/b:25689f673b], mas se não puder achar uma outra, esta pode estar mais próxima do que vc propôs.


GOSTEI 0
POSTAR