ENCERRAR TRANSACAO NA PROCEDURE
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
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
Amigo,
No Firebird eu não sei como seria, mas no MySQL seria algo assim :
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;
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.
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.
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 estou postando minha duvida aqui porque e uns dos melhores foruns, mas programo em delphi e queria fechar a conexao no firebird mesmo.
Grato
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?
vc já checou o forced writes?
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.
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.
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.
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