Fórum ApplyUpdate de vários ClientDataSet`s em uma única Transação #54801

17/01/2006

0

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


Raserafim

Raserafim

Responder

Posts

18/01/2006

Joaoshi

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.


Responder

Gostei + 0

02/08/2006

Raserafim

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?


Responder

Gostei + 0

02/08/2006

Marco Salles

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;
[/b]


Responder

Gostei + 0

03/08/2006

Sergiomatos

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.



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;



Responder

Gostei + 0

04/08/2006

Raserafim

COnsegui fazer a transação.

  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


Responder

Gostei + 0

08/08/2006

Marco Salles

[b:437fbe33f9]citação de sergiomatos[/b:437fbe33f9]
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:


Responder

Gostei + 0

08/08/2006

Marco Salles

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; 



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar