Já implementei exatamente o mesmo caso no InterBase utilizando triggers e
stored procedures.


Bom, em PostgreSQL isso pode ser resolvido sem cursores e em linguagem
PL/pgSQL.

1) busque o valor do saldo anterior ao lançamento a ser alterado:

SELECT saldo FROM tabela WHERE id < 2 ORDER BY id DESC LIMIT 1;

2) faça um laço de iteração com o lançamento em questão e os posteriores:

SELECT id, lancamento FROM tabela WHERE id >= 2 ORDER BY id;

3) para cada repetição, recalcule o saldo e altere na tabela:

UPDATE tabela SET saldo = var_saldo WHERE id = var_id;


Eis outra solução (mais rápida).

1) calcule a diferença de valores entre o lançamento a ser alterado e o novo
valor:

SELECT novo_lancamento - lancamento AS diferenca FROM tabela WHERE id = 2;

2) altere somente o valor do lançamento:

UPDATE tabela SET lancamento = novo_lancamento WHERE id = 2;

3) altere todas as linhas a partir do lançamento em questão para o novo
saldo;

UPDATE tabela SET saldo = saldo + diferenca WHERE id >= 2;


--
Atenciosamente,

Rodrigo Hjort
Icewall Tecnologias
http://www.icewall.com.br


2007/3/1, Maikel Dal Farra <[EMAIL PROTECTED]>:

tenho uma tabela como a que segue abaixo:

id(serial)  saldo(numeric 7,2)  lancamento (numeric 7,2)
1            1000                     1000

2            500                        -500

3            2000                     1500

Preciso de uma função que "corria um lancamento", por exemplo passando o
id 2  e o um novo_lancamentor 1000, a tabela ficaria:

id(serial)  saldo(numeric 7,2)  lancamento (numeric 7,2)
1            1000                     1000

2            2000                      1000

3            3500                     1500

O problema é que para o cálculo do saldo atual precisa-se do saldo
anterior, tentei usar cursores para pegar valores anteriores da tabela, mas
não consegui.

Se alguém puder me dar uma luz para esse problema eu ficaria imensamente
grato.

_______________________________________________
Grupo de Usuários do PostgreSQL no Brasil
Antes de perguntar consulte o manual
http://pgdocptbr.sourceforge.net/

Para editar suas opções ou sair da lista acesse a página da lista em:
http://pgfoundry.org/mailman/listinfo/brasil-usuarios

Responder a