[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