ApplyUpdate de vários ClientDataSet`s em uma única Transação
quero envolver em uma única transação o ApplyUpdate de vários ClientDataSet´s. para que caso algum dê errado todos serão cancelados.
estouy usando o Delphi 7 + FireBird 1.5 e o MDO
estouy usando o Delphi 7 + FireBird 1.5 e o MDO
Raserafim
Curtidas 0
Respostas
Joaoshi
17/01/2006
Colega, este exemplo é com SqlConnection (DbExpress), pode ser um ponto de partida.
Procedure Tal
var
TD : TTransactionDesc;
begin
TD.TransactionID := 1;
TD.IsolationLevel := xilREadCommitted;
SqlConnection1.StartTransaction(TD);
if (cds1.ApplyUPdates(0) = 0) and
if (cds2.ApplyUpdates(0) = 0) and
if (cds3.ApplyUpdates(0) = 0) then
SQLConnection1.Commit(TD)
else
SQLConnection1.Rollback(TD);
end;
Espero ter ajudado.
Procedure Tal
var
TD : TTransactionDesc;
begin
TD.TransactionID := 1;
TD.IsolationLevel := xilREadCommitted;
SqlConnection1.StartTransaction(TD);
if (cds1.ApplyUPdates(0) = 0) and
if (cds2.ApplyUpdates(0) = 0) and
if (cds3.ApplyUpdates(0) = 0) then
SQLConnection1.Commit(TD)
else
SQLConnection1.Rollback(TD);
end;
Espero ter ajudado.
GOSTEI 0
Raserafim
17/01/2006
pelo que tentei, o MDO não funciona desta forma, atribuindo um identificador a transação.
ou pelo menos não consegui assim.
alguém poderia me esclarecer como funciona as transações no MDO?
ou pelo menos não consegui assim.
alguém poderia me esclarecer como funciona as transações no MDO?
GOSTEI 0
Marco Salles
17/01/2006
pelo que tentei, o MDO não funciona desta forma, atribuindo um identificador a transação.
ou pelo menos não consegui assim.
alguém poderia me esclarecer como funciona as transações no MDO?
[b:3e617f6272]O que voce quer dizer com MDO[/b:3e617f6272] ????
Relembrando Vinicius2k . [b:3e617f6272]Abre Aspas e Fecha Aspas [/b:3e617f6272]:
´Quando vc utiliza TDataSetProvider + TClientDataSet, a Midas irá se encarregar das transações. Por exemplo, ao abrir um ClientDataSet ela (a Midas) irá iniciar uma transação, solicitar os dados ao TSQLDataSet, armazenar no buffer do TClientDataSet e fechar a transação. Isto é automático e não requer sua intervenção. Sua únicas providências devem ser utilizar o método ApplyUpdates do TClientDataSet quando desejar enviar as alterações ao banco de dados (neste momento a midas irá abrir uma transação, aplicar as atualizações nos dados (se for possível) e fechar a transação) e trabalhar o evento OnReconcileError do TClientDataSet para capturar os erros durante a aplicação das atualizações.´
[b:3e617f6272]Ex: o codigo que o amigo lhe passou , acho que tem um erro de lógica , apesar de conter a idéia [/b:3e617f6272]
var
TD : TTransactionDesc;
begin
TD.TransactionID := 1;
TD.IsolationLevel := xilREadCommitted;
SqlConnection1.StartTransaction(TD);
if (cds1.ApplyUPdates(0) = 0) and
if (cds2.ApplyUpdates(0) = 0) and
if (cds3.ApplyUpdates(0) = 0) then
SQLConnection1.Commit(TD)
else
SQLConnection1.Rollback(TD);
end;
Pelo que consta , ele so ira executar o [b:3e617f6272]Roollback[/b:3e617f6272] se os [b:3e617f6272]dois ifs [/b:3e617f6272]forem verdadeiros , [b:3e617f6272]o que nen sempre é verdade [/b:3e617f6272]
:idea: :idea: :idea:
então deve-se usar uma[b:3e617f6272] variável de controle [/b:3e617f6272]para atingir o objetivo
Novamente recorremos a Vinicius2k .. [b:3e617f6272]Abre aspas e fecha aspas[/b:3e617f6272]:
var TudoOK: Boolean; Transacao: TTransactionDesc; begin TudoOK:= False; Transacao.TransactionID:= 1; Transacao.IsolationLevel:= xilReadCommitted; SQLConnection1.StartTransaction(Transacao); // Aplicando os updates if ClientDataSet1.ApplyUpdates(0) = 0 then if ClientDataSet2.ApplyUpdates(0) = 0 then if ClientDataSet3.ApplyUpdates(0) = 0 then if ClientDataSet4.ApplyUpdates(0) = 0 then TudoOK:= True; // Note que TudoOK só será true se não houver nenhum erro em //nenhum dos Updates if TudoOK then begin SQLConnection1.Commit(Transacao); ShowMessage(´Atualizações OK.´); end else begin SQLConnection1.Rollback(Transacao); ShowMessage(´Ocorreram erros. Alterações descartadas.´); end; end;
GOSTEI 0
Sergiomatos
17/01/2006
Amigo, se ClientDataSet4.ApplyUpdates(0) ja abre uma transação e aplica os dados no banco, entao para que controlar a transação manualmente?
acho que o codigo abaixo nao esta muito correto uma vez que cada clientedataset faz seu proprio applyuptades e a transação manual nao tera efeito se um dos clientdatasets falhar.
acho que o codigo abaixo nao esta muito correto uma vez que cada clientedataset faz seu proprio applyuptades e a transação manual nao tera efeito se um dos clientdatasets falhar.
var TudoOK: Boolean; Transacao: TTransactionDesc; begin TudoOK:= False; Transacao.TransactionID:= 1; Transacao.IsolationLevel:= xilReadCommitted; SQLConnection1.StartTransaction(Transacao); // Aplicando os updates if ClientDataSet1.ApplyUpdates(0) = 0 then if ClientDataSet2.ApplyUpdates(0) = 0 then if ClientDataSet3.ApplyUpdates(0) = 0 then if ClientDataSet4.ApplyUpdates(0) = 0 then TudoOK:= True; // Note que TudoOK só será true se não houver nenhum erro em //nenhum dos Updates if TudoOK then begin SQLConnection1.Commit(Transacao); ShowMessage(´Atualizações OK.´); end else begin SQLConnection1.Rollback(Transacao); ShowMessage(´Ocorreram erros. Alterações descartadas.´); end; end;
GOSTEI 0
Raserafim
17/01/2006
COnsegui fazer a transação.
a um tempo atras tentei fazer algo parecido mas não funcionava. dizia que já existia uma transação em execução, mas agora deu certo.
valeu pessoal
MDOTransaction.StartTransaction; if ClientDataSet1.ApplyUpdates(0) = 0 then if ClientDataSet2.ApplyUpdates(0) = 0 then if ClientDataSet3.ApplyUpdates(0) = 0 then if ClientDataSet4.ApplyUpdates(0) = 0 then begin MDOTransaction.Commit; exit; end; MDOTransaction.Rollback;
a um tempo atras tentei fazer algo parecido mas não funcionava. dizia que já existia uma transação em execução, mas agora deu certo.
valeu pessoal
GOSTEI 0
Marco Salles
17/01/2006
[b:437fbe33f9]citação de sergiomatos[/b:437fbe33f9]
Que cada clientedataset faz seu próprio applyuptades é verdade , mas estamos falando de ´cascata´ , e o que não se quer é gravar efetivamente dados de um ou de outro DataSet esporadicamente... Ou se grava todos ou não se grava nenhum , retornando o applyuptades que algum dataSet tenha efetivado
Quando propos o codigo Vinicius2k . fiz o sem testar é verdade , mas não vejo nada que possa condenar o seu objetivo.
talvez , se voce tivesse levantado a bandeira que esta faltando um [b:437fbe33f9]Begin end no codigo[/b:437fbe33f9] , é um caso para discutir , ou mesmo que tem um jeito com menos codificação seria interessante mostrar < com parece ter feito o raserafim > mas dizer simplesmente não estar correto , eu simplesmente fiquei sem entender sua Visão :cry: :cry: :cry:
[b:437fbe33f9]Eu gostaria de entender , pq , hora e meia , indico essa estrutura para outros colegas aqui do forum[/b:437fbe33f9] :cry: :cry: :cry:
Amigo, se ClientDataSet4.ApplyUpdates(0) ja abre uma transação e aplica os dados no banco, entao para que controlar a transação manualmente?
.
Que cada clientedataset faz seu próprio applyuptades é verdade , mas estamos falando de ´cascata´ , e o que não se quer é gravar efetivamente dados de um ou de outro DataSet esporadicamente... Ou se grava todos ou não se grava nenhum , retornando o applyuptades que algum dataSet tenha efetivado
Quando propos o codigo Vinicius2k . fiz o sem testar é verdade , mas não vejo nada que possa condenar o seu objetivo.
acho que o codigo abaixo [b:437fbe33f9]nao esta muito correto [/b:437fbe33f9]uma vez que cada clientedataset faz seu proprio applyuptades e a transação manual nao tera efeito se um dos clientdatasets[b:437fbe33f9] falhar[/b:437fbe33f9]
talvez , se voce tivesse levantado a bandeira que esta faltando um [b:437fbe33f9]Begin end no codigo[/b:437fbe33f9] , é um caso para discutir , ou mesmo que tem um jeito com menos codificação seria interessante mostrar < com parece ter feito o raserafim > mas dizer simplesmente não estar correto , eu simplesmente fiquei sem entender sua Visão :cry: :cry: :cry:
var TudoOK: Boolean; Transacao: TTransactionDesc; begin TudoOK:= False; Transacao.TransactionID:= 1; Transacao.IsolationLevel:= xilReadCommitted; SQLConnection1.StartTransaction(Transacao); // Aplicando os updates if ClientDataSet1.ApplyUpdates(0) = 0 then begin //----->>>talves falte esse begin end if ClientDataSet2.ApplyUpdates(0) = 0 then if ClientDataSet3.ApplyUpdates(0) = 0 then if ClientDataSet4.ApplyUpdates(0) = 0 then TudoOK:= True; end; //---->>> // Note que TudoOK só será true se não houver nenhum erro em //nenhum dos Updates if TudoOK then begin SQLConnection1.Commit(Transacao); ShowMessage(´Atualizações OK.´); end else begin SQLConnection1.Rollback(Transacao); ShowMessage(´Ocorreram erros. Alterações descartadas.´); end; end;
[b:437fbe33f9]Eu gostaria de entender , pq , hora e meia , indico essa estrutura para outros colegas aqui do forum[/b:437fbe33f9] :cry: :cry: :cry:
GOSTEI 0
Marco Salles
17/01/2006
talvez , se voce tivesse levantado a bandeira que esta faltando um Begin end no codigo
[b:795d6f8e98]begin end acho que é desnecessário[/b:795d6f8e98]
var TudoOK: Boolean; Transacao: TTransactionDesc; begin TudoOK:= False; Transacao.TransactionID:= 1; Transacao.IsolationLevel:= xilReadCommitted; SQLConnection1.StartTransaction(Transacao); // Aplicando os updates if ClientDataSet1.ApplyUpdates(0) = 0 then if ClientDataSet2.ApplyUpdates(0) = 0 then if ClientDataSet3.ApplyUpdates(0) = 0 then if ClientDataSet4.ApplyUpdates(0) = 0 then TudoOK:= True; // Note que TudoOK só será true se não houver nenhum erro em //nenhum dos Updates if TudoOK then begin SQLConnection1.Commit(Transacao); ShowMessage(´Atualizações OK.´); end else begin SQLConnection1.Rollback(Transacao); ShowMessage(´Ocorreram erros. Alterações descartadas.´); end; end;
GOSTEI 0