[firebase-br] Posicao do registro IBO x Firebird

Jorge Henrique Aguiar jorginho em tauruslocacoes.com.br
Ter Jan 18 13:33:11 -03 2005


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 02/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
          update caixa set Saldo=Saldo+:VALOR where ID=:ID;
        end else begin
          update caixa set Saldo=Saldo-:VALOR where ID=:ID;
        end
   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

----- Original Message ----- 
From: "RAMJ SISTEMAS & CONSULTORIA" <jubrovolski em yahoo.com.br>
To: "'FireBase'" <lista em firebase.com.br>
Sent: Tuesday, January 18, 2005 12:12 PM
Subject: RES: [firebase-br] Posicao do registro IBO x Firebird


Prezado Jorge,

Poderia me ajudar então? Teria um exemplo para me ajudar? Se não precisasse
mostrar o saldo a cada registro, ficaria mais fácil, porém quando o usuário
"navegar" entre os dados é preciso que se mostre o saldo. Não sei como fazer
para ter o resultado que preciso .

Reuber

-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Jorge Henrique Aguiar
Enviada em: terça-feira, 18 de janeiro de 2005 08:15
Para: FireBase
Assunto: Re: [firebase-br] Posicao do registro IBO x Firebird

Estou percebendo que vc tá usando a sistematica do clipper ainda!
O FB tem recursos muito melhores para fazer esse tipo de operação.
Não use goto, nem recno, nem nada disso.
Ao invés disso crie indices, use as função sum() para recalcular os
anteriores, etc.
No mais, vc pode construir uma storedprocedure e aciona-la por um trigger e
não precisa fazer nada dentro do seu programa para recalcular saldos.

[]´s

----- Original Message -----
From: "RAMJ SISTEMAS & CONSULTORIA" <jubrovolski em yahoo.com.br>
To: "'FireBase'" <lista em firebase.com.br>
Sent: Monday, January 17, 2005 9:06 PM
Subject: [firebase-br] Posicao do registro IBO x Firebird


Caro Jorge e demais colegas


Talvez você possa me ajudar. Tenho uma tabela movcaixa, onde em cada
registro preciso colocar o saldo atual. Ex:

Reg. Sinal Data Valor Saldo
001 C 31/12/2004 100.00 100.00
002 D 01/01/2005 30.00 70.00
003 D 01/01/2005 10.00 60.00
004 C 03/01/2005 30.00 90.00
005 D 03/01/2005 15.00 75.00

Até ai tudo bem, porém caso o usuário, por algum motivo precise inserir um
lançamento no dia 02/01/2005 eu preciso que ele recalcule o saldo das datas
subsequentes.
Daí o problema, quando insiro um novo registro, ele vai para o final ( no
caso reg. 006 ). Utilizo a mudança de ordem ( orderingitemno = 2 -> por data
) e volto até o ultimo dia anterior a data do novo registro ( no caso o
lançamento reg. 003 01/01/2005 ) e recalculo daí para frente ). Ao
recalcular, preciso que ele volte para data do ultimo registro inserido ( no
caso ele irá colocar o novo registro entre reg. 003 e 004. É esta a
necessidade, como guardar a posição do registro nesta select específica.
Tipo um GoTo do Clipper.
Há outra solução mais prática para esta situação? Me sugeriram usar Store
Procedure, mas não tenho idéia de como fazer. Caso venho a usar a Store
Procedure, como ficaria ? Teria que executá-la a cada lançamento? Uma luz
por favor.

Reuber





______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br



-- 
No virus found in this incoming message.
Checked by AVG Anti-Virus.
Version: 7.0.300 / Virus Database: 265.6.13 - Release Date: 16/1/2005



-- 
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


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br





______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
Para editar sua configuração na lista, use o endereço 
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br



-- 
No virus found in this incoming message.
Checked by AVG Anti-Virus.
Version: 7.0.300 / Virus Database: 265.6.13 - Release Date: 16/1/2005




-- 
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