Fórum pegar o valor de um registro anterior ao que está posicionad #329529
16/09/2006
0
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
Curtir tópico
+ 0Posts
16/09/2006
Rm
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
19/09/2006
Raserafim
Gostei + 0
19/09/2006
Welgomes
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
19/09/2006
Micheus
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
Clique aqui para fazer login e interagir na Comunidade :)