pegar o valor de um registro anterior ao que está posicionad
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?
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
Curtidas 0
Respostas
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
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
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
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.
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
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