[firebase-br] RES: Transação
Moacir
moacir em blusistemas.com.br
Qui Nov 5 13:45:45 -03 2009
Thiago, boa tarde eu tenho assim:
Procedure no Delphi.
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\\
function AbreTransacao(Fazer :Boolean;Quem : TSqlConnection) :Boolean;
begin
Result := True;
if not assigned(Quem) then
quem := Conexao;
if (not Quem.InTransaction) and (Fazer) then
try
Transa.TransactionID := 1;
Transa.IsolationLevel := xilREADCOMMITTED;
Quem.StartTransaction(Transa);
except
Result := False;
end;
end;
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\\
function ConfirmaTransacao(Fazer :Boolean; Quem : TSqlConnection = nil)
:Boolean;
begin
Result := True;
if not assigned(Quem) then
quem := Conexao;
if Fazer then
try
Quem.Commit(Transa);
except
Result := False;
end;
end;
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\\
function CancelaTransacao(Fazer :Boolean; Quem : TSqlConnection = nil)
:Boolean;
begin
Result := True;
if not assigned(Quem) then
quem := Conexao;
if Fazer then
try
Quem.Rollback(Transa);
except
Result := False;
end;
end;
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\\
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\\
function ExecutaSQL(Tipo :SmallInt;
Mensagem1,
Mensagem2,
Mensagem3 :String;
LSQL :TDataSet): Boolean;
begin
Result := ExecutaOperacaoBanco(Tipo,Mensagem1,Mensagem2,Mensagem3,LSQL);
end;
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\\
function ExecutaPROC(Mensagem :String; Proc :TDataSet) :Boolean;
begin
Result := ExecutaOperacaoBanco(0,Mensagem,'','',Proc);
end;
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\\
function ExecutaOperacaoBanco(Tipo: SmallInt;
Mensagem1,
Mensagem2,
Mensagem3: String;
LSQL: TDataSet): Boolean;
begin
Result := True;
try
if Tipo = 1 then
begin
if (LSQL is TSQLDataSet) then
TSQLDataSet(LSQL).ExecSQL
else
if (LSQL is TSQLQuery) then
TSQLQuery(LSQL).ExecSQL
else
if (LSQL is TSimpleDataSet) then
TSimpleDataSet(LSQL).Execute
else
if (LSQL is TClientDataSet) then
TClientDataSet(LSQL).Execute
else
begin
Mensagem('!!!!! ERRO !!!!!',
'Tipo de Data Set Inválido, Rotina ExecutaSQL Tipo
1', 1);
Exit;
end;
end
else
if Tipo = 2 then
begin
if (LSQL is TSQLQuery) then
TSQLQuery(LSQL).Open
else
if (LSQL is TSimpleDataSet) then
TSimpleDataSet(LSQL).Open
else
if (LSQL is TSQLDataSet) then
TSQLDataSet(LSQL).Active := True
else
if (LSQL is TClientDataSet) then
TClientDataSet(LSQL).Open
else
begin
Mensagem('!!!!! ERRO !!!!!',
'Tipo de Data Set Inválido, Rotina ExecutaSQL Tipo
2', 1);
Exit;
end;
end;
except
Result := False;
Mensagem('!!! ATENÇÃO !!!', Mensagem1+ ':
'+Exception(ExceptObject).Message, 1);
end;
end;
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\\
Quando vou utilizar faço assim:
procedure TFormQualquer.FazerQualqeurCoisaNobanco;
var
vOK: Boolean;
begin
if Messagedlg('Confirma a ........................?', mtConfirmation,
[MbYes, MbNo], 0) = MrYes then
begin
// Abre a Transacao
if (not AbreTransacao(True)) then
Exit;
vOk := False;
try
try
//------------ Inicio ----------------\\
with fDataM.quGenerica do
begin
(* Meu Comando no Banco
Insert, Delete, Update, procedure o que for,
*)
end;
//------------ Final ----------------\\
// Confirma a Transacao
if (not ConfirmaTransacao(True)) then
Exit;
vOk := True;
finally
// Cancela a Transacao conforme vOK
CancelaTransacao(not vOK);
end;
except
// Faz isso pra exibir mensagem depois de Cancelar a Transacao
on E: Exception do
begin
Mensagem('!!! ERRO !!! ', 'Erro ao Executar
............................ Erro: '+ E.Message, 1);
end;
end;
end;
end;
----------------------------------------------------------------------------
---------------------------
-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Thiago Balbino
Enviada em: quinta-feira, 5 de novembro de 2009 13:02
Para: FireBase
Assunto: [firebase-br] Transação
Boa tarde pessoal, possuo o seguite cenário na minha aplicação:
Delphi7 + Firebird -> Usando os componentes DBExpress.
Possuo um StoredProcedure para gravar os pedidos lançados no sistema,
no delphi para executar a procedure faço assim
function GravarPedido : Longint;
begin
Start; -> Funcao para inicar a transação
// apartir daqui passo os parametros para o componente
TSQLStoredProc da paleta dbExpress
DMRelatoriosDC.SP_GRAVAR_PEDIDO.Params[0].Value :=
DMEstoque.cdsPedidoGravarDFIDTRANSFISCAL.Value;
DMRelatoriosDC.SP_GRAVAR_PEDIDO.Params[4].Value :=
DMEstoque.cdsPedidoGravarDFIDCARTEIRA.Value;
DMRelatoriosDC.SP_GRAVAR_PEDIDO.Params[7].Value :=
DMEstoque.cdsPedidoGravarDFIDUNIDADE.Value;
......
// Fim dos parametros para o componente TSQLStoredProc
//aqui executo a procedure
DMRelatoriosDC.SP_GRAVAR_PEDIDO.ExecProc;
Commit; //Função minha de commit;
end;
var
TransacaoNF : TTransactionDesc;
//Meus Procedimentos usados acima
Procedure Start;
begin
TransacaoNF.TransactionID := GeraID;
TransacaoNF.IsolationLevel := xilREADCOMMITTED;
DM.Conexao.StartTransaction(TransacaoNF);
end;
Procedure Commit;
begin
DM.Conexao.Commit(TransacaoNF);
end;
Porem as vezes ao dentro da função GravarPedido ocorre o seguinte
erro: "Transaction not assigned." na hora de ExecProc.
O que pode ser ? o que pode ser o que eu estou fazendo de errado ?
--
Thiago de Souza Balbino
Analista de Sistemas / Programador
Meta Tecnologia e Sistemas - Muriaé / MG
(32) 3721 - 8729
(32) 8867 - 8729
MSN: thiagodeb em hotmail.com
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use:
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa
Mais detalhes sobre a lista de discussão lista