ApplyUdates para todos os ClientDataSet

Delphi

07/08/2006

Alguém sabe como fazer uma função para dar um applyupdates no afterpost de todos os clientdataset


Visualdesigner

Visualdesigner

Curtidas 0

Respostas

Raserafim

Raserafim

07/08/2006

vou sugerir duas formas:
1- você pode colocar este código no evento affterpost de um clientdataset
  TClientDataSet(Sender).ApplyUpdates(0);

e então nos eventos affterpost dos outros clientdataset vc direciona para este evento.

2- vc faz o procedimento acima, mas ao invés de ir em cada clientdataset vc pode colocar este código no OnCreate do DataModule

......
var
C: Byte;
begin
for C := 0 to ComponentCount - 1 do
if (Components[C].ClassType = TClientDataSet) then
TClientDataSet(Components[C]).AffterPost := ClientDataSet1.AffterPost
end;


GOSTEI 0
Marco Salles

Marco Salles

07/08/2006

Alguém sabe como fazer uma função para dar um applyupdates no afterpost de todos os clientdataset


Não seria em cascata...

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
Marco Salles

Marco Salles

07/08/2006

Acho que entendi mau a sua pergunta. :oops: :oops: :oops:


GOSTEI 0
Visualdesigner

Visualdesigner

07/08/2006

Você não entendeu minha pergunda? Deixa eu ser mais claro.


Tenho uma aplicação com vários ClientDataSet, então coloco o ApplyUpdates em cada um

Ex:
cdsPagar.ApplyUpdates(0);
cdsClientes.ApplyUpdates(0);
cdsProdutos.ApplyUpdates(0); e assim por diante

Queria uma função (SÓ), como a que os colegas acima me passaram, que sirva para todos os ClientDataSets


GOSTEI 0
Paullsoftware

Paullsoftware

07/08/2006

Eu faço assim:

Crio uma Procedure Chamada [b:41ada28036]Transacao[/b:41ada28036] onde passo os parametros atuais...
procedure Transacao(aConexao:TSQLConnection; aDataSet: TClientDataSet);
 var TransDesc: TTransactionDesc;
begin
 try
  TransDesc.TransactionID  := 1;
  TransDesc.IsolationLevel := xilREADCOMMITTED;
  aConexao.StartTransaction(TransDesc);
  if aDataSet.ApplyUpdates(0) = 0 then
   begin
     aConexao.Commit(TransDesc);
   end;
 Except
  aConexao.Rollback(TransDesc);
   raise Exception.Create(´Ocorreu um erro no processo transação,´+
                          ´ a operação não foi concluída!´+#10+´Tabela: ´+
                          pChar(aDataSet));
 end;
end; (* Transacao *)


modo de usar:
no Evento AffterPost do ClientDataSet eu faço:
Transacao(SqlConnection1,TClientDataSet(DataSet));

espero ter ajudado


GOSTEI 0
Mrmarcelojr

Mrmarcelojr

07/08/2006

Da pra fazer assim tbm

var i:Integer;
begin
   for i:=0 to Form1.ComponentCount-1 do
     if Form1.Components[i] is TClientDataSet then
        TClientDataSet(Form1.Components[i]).ApplyUpdates(0);


Ele procura por todos o CDS do teu form e da um applyupdates em cada um


flw
?:]


GOSTEI 0
Raserafim

Raserafim

07/08/2006

continuo achando que o código que postei vai te ajudar.


GOSTEI 0
Visualdesigner

Visualdesigner

07/08/2006

Olá RESERAFIM, testei seu código mais está danto problemas no SENDER

aparece um erro VARIAVEL NOT INDETIFIER. Por acaso não teria que adicionar alguma cláusula ao USES


GOSTEI 0
Paullsoftware

Paullsoftware

07/08/2006

Olá RESERAFIM, testei seu código mais está danto problemas no SENDER aparece um erro VARIAVEL NOT INDETIFIER. Por acaso não teria que adicionar alguma cláusula ao USES

não, vai funcionar se vc mudar de [b:248d4b0bd3]Sender[/b:248d4b0bd3] para [b:248d4b0bd3]DataSet[/b:248d4b0bd3]... espero ter ajudado! :wink:


GOSTEI 0
POSTAR