RES: [firebase-br] "Semáforo" no Firebird
Rodrigo A. de Freitas
rodrigo em solucoeseinformatica.com.br
Qui Jul 19 17:51:19 -03 2007
Pessoal, esses campos NÃO SÃO a chave primária da tabela. Pra entender, tem
que entender um pouco o processo contábil:
Um único lançamento contábil é composto de "N" partidas a débito e "N"
contrapartidas à crédito:
Lançamento 456 / 2007 - 1000,00 R$:
Partida (débito) Contrapartida (Crédito)
----------------------- -----------------------------
343 - Manutenção de veículos: 200 R$ 123 - Duplicatas a pagar: 910 R$
234 - Manutenção predial: 300 R$ 132 - ISS 30 R$
143 - Manutenção geral: 500 R$ 125 - PIS 60 R$
------------------------------------ --------------------------------
Total à débito: 1000 R$ Total à crédito: 1000 R$
Ou seja, no exemplo acima, um único lançamento contábil é composto na
verdade por 6 lançamentos e é esse o problema. Por conta de uma modelagem
mal-feita (um levantamendo de dados mal-feito, dado que originalmente o
sistema permitia apenas uma única partida e contra-partida), eu só tenho uma
tabela no sistema, chamada CAD_LANCAMENTO (cuja chave primária é um campo
INTEGER, incrementado por generator), que recebe os lançamentos contábeis;
Assim, o número do lançamento (o 456 / 2007) é replicado para todas as
linhas da tabela que o compõem.
Por isso não posso controlar numa trigger. A essa altura e na complexidade
que se encontra o sistema, não dá pra alterar toda a modelagem da parte
contábil; O melhor jeito que eu consegui pensar é criar uma tabela de
semáforo.
Quando ao comentário do Rodrigo Pires, que o SELECT...WITH LOCK só trava
para outro SELECT...WITH LOCK, não teria problemas, já que eu criaria uma
stored procedure que se encarregaria de retornar os números de lançamento. O
problema é que eu não posso commitar logo após receber o número, já que eu
tenho determinadas rotinas no sistema que geram mais de um lançamento
contábil de uma vez só. Existe um meio de iniciar uma nova transação via
PL/SQL ???
Outra dúvida: Com a cláusula WHEN DO eu consigo tratar exceções sem que elas
interrompam a execução de minha procedure e consequentemente disparem um
rollback ?
[]'s
Rodrigo A. de Freitas
Análise & Desenvolvimento
Soluções & Informática
-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Forrest®
Enviada em: quinta-feira, 19 de julho de 2007 17:12
Para: lista em firebase.com.br
Assunto: Re: [firebase-br] "Semáforo" no Firebird
Samuel Duarte Matos wrote:
> Cara, não sei se não entendi o seu problema, mas será que se vc fazer
> este select da chave primária em uma trigger (before insert) não
> resolveria o seu problema?
---
Pelo que eu entendi do que ele relatou também eu iria propor usar
triggers também que resolveria o problema.
T+++++++++++++++
--
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa
--
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.5.476 / Virus Database: 269.10.9/907 - Release Date: 18/7/2007
15:30
Mais detalhes sobre a lista de discussão lista