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