[firebase-br] CORREÇÃO: SP Posicao do registro IBO x Firebird
Jorge Henrique Aguiar
jorginho em tauruslocacoes.com.br
Ter Jan 18 13:39:32 -03 2005
Perdão Reuber, estou corrigindo a SP, errei ao calcular o saldo...
Suponhamos:
Tabela caixa:
Id Data Tipo Valor Saldo
1 01/01/2005 C 100,00 100,00
2 01/01/2005 D 30,00 70,00
3 03/01/2005 C 15,00 85,00
4 03/01/2005 D 50,00 35,00
Vc deseja incluir um lançamento de débito, no valor de 20,00, com data do
dia 02/01/2005.
E vc inclui normalmente, só que vai cair com o ID 5, correto?
Então, olha só: vc precisa saber qual foi o ultimo lançamento antes do dia
02.
SET TERM ^ ;
CREATE PROCEDURE CALC_SALDO (DATA DATE)
AS
DECLARE VARIABLE ULTLANCTO INTEGER;
DECLARE VARIABLE SALDOANT NUMERIC(15,2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO VARCHAR(1);
DECLARE VARIABLE VALOR NUMERIC(15,2);
begin
select Max(ID) from Caixa where Data<:DATA into :ULTLANCTO; /* Aki eu
estou solicitando o ID do ultimo lançamento até o dia 01/01/2005 */
select Saldo from Caixa where Id=ULTLANCTO into :SALDOANT; /* Aki eu
consegui achar o valor do ultimo saldo antes do dia 02/01/2005 */
for select Id,Tipo,Valor from Caixa where Data>=:DATA order by Data,Id
into :ID,:TIPO,:VALOR do
begin
if (:TIPO='C') then begin
SALDOANT=:SALDOANT+:VALOR;
end else begin
SALDOANT=:SALDOANT-:VALOR;
end
update caixa set Saldo=:SALDOANT where ID=:ID;
end
end
Nota: todos os saldos posteriores ao dia 02/01/2005 serão recalculados tb.
Depois vc cria a trigger pra acionar toda vez que a tabela tiver registros
inseridos ou atualizados:
CREATE TRIGGER RECALCULASALDO FOR CAIXA
ACTIVE AFTER INSERT OR UPDATE POSITION 0
AS
begin
Execute Procedure CALC_SALDO(New.Data)
end
^
Bom. Acho que deve funcionar. O caminho é esse, essa SP fiz aki no email e
não sei se funcionará mas vc pode aperfeiçoá-la e as vezes alguem na lista
consegue até coisa melhor, mas acredito que é o primeiro passo pra vc
entender o que estou querendo dizer.
Qto ao seu código em Delphi, vc pode retirar tudo. É só inserir ou alterar
registros q o FB se encarrega de recalcular o saldo. Pq toda vez q vc
atualizar ou inserir registros, ele aciona a SP através da trigger. E vc
ainda ganha mais uma facilidade: se acaso o método de recalculo mudar, vc
muda a SP e seu programa não precisa ser alterado, nem recompilado. D+, não?
[]´s
-------------- Próxima Parte ----------
No virus found in this outgoing message.
Checked by AVG Anti-Virus.
Version: 7.0.300 / Virus Database: 265.6.13 - Release Date: 16/1/2005
Mais detalhes sobre a lista de discussão lista