ENCERRAR TRANSACAO NA PROCEDURE

HUELBERT 15/10/2009 15:53:25
#325415
Opa

Galera me socorre aqui.
Tenho um bd firebird 2.1e montei um esquema pra gerar codigos que facilita a necessidade do meu sistema.Vou explica-lo:

Tenho duas Tabelas = TGEN e TNUL
TGEN - Fica o contador dos codigo::
Campos = CODGEN - TABGEN
2 CLI
4 VEN

TNUL - Fica o código gerados e nao utilizados
Campos = CODGEN - TABGEN
1 CLI

Todo o trabalho fica em duas procedures = PICOD e PCCOD

PICOD - Quando o usuário clica em INCLUIR no sistema, executa PICOD

PCCOD - Quando o usuário clica em CANCELAR no sistema, executa PCCOD

Abaixo o código das procedures

CREATE PROCEDURE PICOD (
patab varchar(3))
returns (
pacod integer)
as
begin
select min(codnul) from tnul where (tabnul = :patab) into :pacod;
if (not pacod is null) then
delete from tnul where (codnul = :pacod) and (tabnul = :patab);
else
if (exists(select * from tgen where tabgen = :patab)) then
update tgen set codgen = (codgen + 1) where (tabgen = :patab);
else
insert into tgen (codgen,tabgen) values (1, :patab);
select codgen from tgen where (tabgen = :patab) into :pacod;
end^

CREATE PROCEDURE PCCOD (
pacod integer,
patab varchar(3))
as
begin
insert into tnul(codnul,tabnul)values(:pacod, :patab);
end^


Resumo:
PICOD - Ela verifica se tem o registro com o tipo de TAB, senao tiver ele insere o mesmo e gera o codigo e se tiver ele add 1 no codigo gerando o mesmo fazendo um update na tabela TGEN.

PCCOD - Insere o codigo nao utilizado na tabela TNUL

Problema:
Quando a aplicacao esta em rede ou abro duas instancias do mesmo sistema e clico em incluir simultaneamente, um dos sistemas cria o codigo normalmente e por causa da transacao nao terminada com o sistema que deu certo o segundo nao consegue gerar um codigo e da erro.
Tem alguma opcao de commit na procedure ou quando executar a procedure ela gravar tudo o que esta programado para burlar este erro.

Grato
FOXMAN 15/10/2009 18:01:18
#325422
Amigo,

No Firebird eu não sei como seria, mas no MySQL seria algo assim :

START TRANSACTION;
SELECT @A:=SUM(salario) FROM tabela1 WHERE type=1;
UPDATE tabela2 SET summmary=@A WHERE type=1;
COMMIT;


LLAIA 16/10/2009 15:35:28
#325493
cara não tenho experiencia com firebird, mas ando lendo e testando algumas coisas sobre ele. pesquise sobre forced writes.

pode ser também o fato de vc não está fechando o objeto de conexão (supondo que seja ADO) com o banco, tipo:

cnn.close
set cnn = nothing

tente aí. essa última alternativa já resolveu comigo em meus testes.
HUELBERT 16/10/2009 15:40:43
#325494
Seguinte tentei o codigo em mysql do FOXMAN mas nao consegui nada.
LLAIA estou postando minha duvida aqui porque e uns dos melhores foruns, mas programo em delphi e queria fechar a conexao no firebird mesmo.

Grato
LLAIA 16/10/2009 18:04:56
#325504
bom, acredito que vc só pode dá um commit na transação se for der um start nela. parecido com o begintrans e o committrans da DAO e ADO.


vc já checou o forced writes?
HUELBERT 17/10/2009 11:38:53
#325561
Como visto namatéira do link abaixo, o padrao do firebird é forced writes ligado.
http://www.sinatica.com/blog/br/index.php/artigos/forced-writes-quando-usar
Andei dando uma pesquisada na net e em alguns sites encontrei a informacao que em procedures e triggers nao executam transacoes no bd.
Deve ter algum tipo de procedimento que possa burlar a transacao dentro do bd.
LLAIA 17/10/2009 11:55:14
#325564
cara, que eu me lembro, o ofrced writes é padrõ na versão do firebird do linux


no windows eu configurei pelo ibexpert.

checa aí.

a versão que testei foi a 1.5, drepente a coisa mudou nas mais recentes.
Tópico encerrado , respostas não são mais permitidas