Fórum ApplyUpdate de vários ClientDataSet`s em uma única Transação #54801
17/01/2006
0
estouy usando o Delphi 7 + FireBird 1.5 e o MDO
Raserafim
Curtir tópico
+ 0Posts
18/01/2006
Joaoshi
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
02/08/2006
Raserafim
ou pelo menos não consegui assim.
alguém poderia me esclarecer como funciona as transações no MDO?
Gostei + 0
02/08/2006
Marco Salles
[b:3e617f6272]O que voce quer dizer com MDO[/b:3e617f6272] ????
Relembrando Vinicius2k . [b:3e617f6272]Abre Aspas e Fecha Aspas [/b:3e617f6272]:
[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]
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
03/08/2006
Sergiomatos
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
04/08/2006
Raserafim
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
08/08/2006
Marco Salles
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:
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
08/08/2006
Marco Salles
[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
Clique aqui para fazer login e interagir na Comunidade :)