[firebase-br] "Semáforo" no Firebird
Otto Fuchshuber
ottofuch em terra.com.br
Qui Jul 19 18:03:01 -03 2007
Na realidade a situação é ainda muito mais complexa. O método de
contabilização é chamado de partidas dobradas, pois para cada conta
debitada haverá pelo menos uma conta creditada. Um lançamento se compõe
de partidas e contrapartidas. E temos, dessa forma, as quatro fórmulas
de lançamento:
1a fórmula: uma conta debitada e uma conta creditada (uma partida e uma
contrapartida)
2a fórmula uma conta debitada e várias contas creditadas (uma partida e
muitas contrapartidas)
3a fórmula várias contas debitadas e uma conta creditada (muitas
partidas e uma contrapartida)
4a fórmula várias contas creditadas e várias contas creditadas.(muitas
partidas e muitas contrapartidas)
Na primeira fórmula, pelo menos os registros de duas contas tem que ser
bloqueadas.
Nas demais fórmulas qualquer quantidade de contas - no mínimo duas - tem
que ser bloqueada.
Mesmo num banco de dados que permite um bloqueio a nível de registro,
isto é muito complexo, tanto para inclusões e alterações quanto para
exclusões. Teóricamente, é possivel englobar todas partidas de um ano
num único lançamento de quarta fórmula, o que significaria bloquear
todas as contas analíticas do plano de contas.
Não existe nas normas contábeis a exigência da numeração das partidas
sequencialmente sem lacunas. Assim tem-se mais liberdade para construir
uma chave primária que tem por finalidade a unicidade, ou seja, que não
haja a permissão de repetição. Embora o número fique enorme, nada impede
que se inclua a empresa, o ano, o mês, o dia, o número do digitador, e
hora, o minuto e o segundo. Difícilmente vai haver dois iguais, pois o
número do digitador fará a diferença -- ele não conseguirá fazer dois
lançamentos ao mesmo tempo. Isto é apenas um exemplo de uma possibilidade.
[]´s
Otto
Rodrigo A. de Freitas escreveu:
> Olá pessoal! Estou quebrando a cabeça para resolver um problema, gostaria
> que vocês me dessem uma ajuda... Eu tenho a seguinte situação:
>
>
>
> Tenho um sistema de gestão que é integrado à contabilidade, e este sistema é
> multi-empresa. Todos lançamentos para as tabelas contábeis são feitos via
> stored procedures. Na contabilidade, cada lançamento contábil deve receber
> um número único que é zerado para cada combinação de exercício / empresa e
> que obviamente não seguem paralelamente. Assim:
>
>
>
> Empresa 1 Empresa 2 Empresa 3
>
> Lanctos: 1 / 2007 34 / 2007 5467 / 2007
>
> 2 / 2007 35 / 2007 5468 / 2007
>
>
>
> * o exercício mudou *
>
>
>
> 1 / 2008 1 / 2008 1 / 2008
>
> 2 / 2008 2 / 2008 2 / 2008
>
>
>
> Muito bem. Acontece que o sistema é alimentado por dezenas de funcionários,
> e praticamente todos os módulos geram lançamentos contábeis. Como o
> sequenciamento dos lançamentos é feito de forma tosca (SELECT
> MAX(COD_LANCAMENTO) FROM TABELA WHERE EMPRESA = 123), ocasionalmente
> acontece de duas procedures diferentes disparadas ao mesmo tempo gerarem
> lançamentos contábeis com a mesma numeração para a mesma empresa.
>
>
>
> Eu pensei em montar um tipo de semáforo; Se houvesse como comunicar o
> Firebird com uma interface externa, eu faria um webservice que enfileirasse
> as requisições e disponibilizasse os números; Como não existe, eu preciso
> criar esse mecanismo dentro do firebird. Pensei em algo assim:
>
>
>
> - Crio uma tabela de semáforo com três campos: “Código da empresa”,
> “exercício” e “número do lançamento”. Cada stored procedure que fosse gerar
> um lançamento contábil iria acessar esta tabela, procurar o último
> lançamento para o exercício e empresa desejada e acrescentar 1 no número,
> gravando o novo número do lançamento nesta tabela.
>
>
>
> DÚVIDAS:
>
>
>
> 1) Para que este mecanismo funcione correntamente, eu precisaria fazer um
> lock explicito na tabela que fornecerá os números de lançamentos. Seria esse
> o select ?:
>
>
>
> SELECT COD_LANCAMENTO FROM SEMAFORO WITH LOCK
>
> WHERE EXERCICIO = 2007 AND EMPRESA = 1
>
>
>
> 2) Como libero o ‘lock’ depois de utilizado ?
>
>
>
> 3) Como faço para a minha stored procedure não gerar um deadlock e sim
> aguardar a liberação do registro (uma como um ‘REPEAT UNTIL IS LOCKED’) para
> continuar ? Existe essa possibilidade ou eu tenho que tratar isso dentro da
> minha aplicação ?
>
>
>
>
>
> []’s
>
>
> Rodrigo A. de Freitas
>
> Análise & Desenvolvimento
>
>
> Soluções & Informática
>
>
>
>
>
>
>
>
>
> ______________________________________________
> 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
>
> Esta mensagem foi verificada pelo E-mail Protegido Terra.
> Scan engine: McAfee VirusScan / Atualizado em 19/07/2007 / Versão: 5.1.00/5078
> Proteja o seu e-mail Terra: http://mail.terra.com.br/
>
>
>
>
>
Mais detalhes sobre a lista de discussão lista