[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